Приемник 433МГц на attiny24a

Добрый день всем!
Пытаюсь отремонтировать пылесос Bork, не работает управление со штатного пульта, все время находится в режиме “медиум”. Пульт выполнен на Attiny13a, контроллер пылесоса на attiny24a, судя по всему слетела прошивка или что-то неисправно в контроллере. Питание исправно и все элементы тоже.

Было принято решение написать код самому (попытки считать протокол штатного пульта не увенчались успехом).
Так как с программированием attiny не знаком вовсе решил найти готовое решение, оно было найдено на сайте
Загрузил код передатчика в пульт

// ATtiny85 RF Transmitter
// Transmits commands to an Etekcity RF outlet
// Must know the specific codes being transmitted
// 0 bit: 188us
// 1 bit: 3x zero bit length
// Sync (start) time: 30x zero bit
// Message length: 24 data bits, 1 stop bit
// Written by Boomer48: September 2019

#include <avr/sleep.h>
#define Serial_RF 4
#define Button1 1
#define Button2 2
#define Button3 3
#define Button4 0
#define DelayShort 188
#define DelayLong 564
#define DelaySync 5640
#define num_msgs 5 // number of messages to transmit
byte temp;

void setup ()
{
pinMode(Serial_RF, OUTPUT);
digitalWrite(Serial_RF, 0);
digitalWrite (Button1, HIGH); // enable pull-up
digitalWrite (Button2, HIGH); // enable pull-up
digitalWrite (Button3, HIGH); // enable pull-up
digitalWrite (Button4, HIGH); // enable pull-up

// Set interrupt-on-change registers for buttons
bitClear(GIMSK, INT0); // disable INT0 external interrupt
bitSet(GIMSK, PCIE); // enable interrupt-on-change
bitSet(PCMSK, Button1);
bitSet(PCMSK, Button2);
bitSet(PCMSK, Button3);
bitSet(PCMSK, Button4);
bitClear(ADCSRA, ADEN); // disable ADC for low power mode
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
} // end of setup

void loop ()
{
sleep_enable();

// Do not interrupt before we go to sleep, or the
// ISR will detach interrupts and we won’t wake.
noInterrupts();
// We are guaranteed that the sleep_cpu call will be done
// as the processor executes the next instruction after
// interrupts are turned on.

interrupts(); // one cycle
sleep_cpu(); // one cycle
} // end of loop

void Transmit1 ()
{
temp = num_msgs;

while (temp > 0) {
Write_RF(0x44);
Write_RF(0x15);
Write_RF(0x33); // turn on outlet 1
Stop_Bit();
delayMicroseconds(DelaySync);
temp–;
}
}

void Transmit2 ()
{
temp = num_msgs;

while (temp > 0) {
Write_RF(0x44);
Write_RF(0x15);
Write_RF(0x3C); // turn off outlet 1
Stop_Bit();
delayMicroseconds(DelaySync);
temp–;
}
}

void Transmit3 ()
{
temp = num_msgs;

while (temp > 0) {
Write_RF(0x44);
Write_RF(0x15);
Write_RF(0xC3); // turn on outlet 2
Stop_Bit();
delayMicroseconds(DelaySync);
temp–;
}
}

void Transmit4 ()
{
temp = num_msgs;

while (temp > 0) {
Write_RF(0x44);
Write_RF(0x15);
Write_RF(0xCC); // turn off outlet 2
Stop_Bit();
delayMicroseconds(DelaySync);
temp–;
}
}

void Write_RF (byte Data_Byte)
{
byte i = 8; // send MSB first

while (i > 0)
{
i–;
digitalWrite(Serial_RF, 1);

if (bitRead(Data_Byte, i) == 0)
{
  delayMicroseconds(DelayShort);
  digitalWrite(Serial_RF, 0);
  delayMicroseconds(DelayLong);
}
else
{
  delayMicroseconds(DelayLong);
  digitalWrite(Serial_RF, 0);
  delayMicroseconds(DelayShort);
}
}
}

void Stop_Bit ()
{
digitalWrite(Serial_RF, 1);
delayMicroseconds(DelayShort);
digitalWrite(Serial_RF, 0);
delayMicroseconds(DelayLong);
}

// Interrupt-on-change handler
ISR (PCINT0_vect)
{
delayMicroseconds(16000); // debounce switch
delayMicroseconds(16000); // debounce switch
delayMicroseconds(16000); // debounce switch

if (digitalRead(Button1) == LOW)
Transmit1();
else if (digitalRead(Button2) == LOW)
Transmit2();
else if (digitalRead(Button3) == LOW)
Transmit3();
else if (digitalRead(Button4) == LOW)
Transmit4(); } 

Сигналы принимаю ардуиной с помощью библиотеки RCSwitch.h и с помощью другого кода все четко. Загрузил код приемника в tinny24, но код приемника написан изначально под attiny85, а регистры прерываний у них отличаются. Вооружившись даташитами поробовал все это исправить, но почему то код не работает, пробовал сигнал с пульта подавать минуя 433 на tinny24, безрезультатно. Код приемника`

// This requires “Burn Bootloader” to be run first

// Receives commands from an Etekcity RF outlet remote
// Must know the specific codes being transmitted
// 0 bit: 188us
// 1 bit: 3x zero bit length
// Sync (start) time: 30x zero bit
// Message length: 24 data bits, 1 stop bit
// Written by Boomer48: September 2019
#define ZERO_PIN PA7 // пин детектора нуля PA7(6)
#define INT_NUM 0 // соответствующий ему номер прерывания
#define DIMMER_PIN PA6 // управляющий пин симистора PA6(7)
#define Pulse_In PB2 //13PA0 или 5(PB2)
#define LED_MIN PA5 //PA5
#define LED_MAX PA2 //PA2
#define LED_ECO PA3 //PA3
#define LED_POW PA1 //PA1
// Shows on/off state for received commands
#define Msg_Length 3 // Defined message length for specific transmitter

// All times in microseconds
#define Min_Gap_Time 5000 // nominal = 5600
#define Max_Gap_Time 6200 // nominal = 5600
#define One_Bit_Time 120 // nominal = 188
#define Zero_Bit_Time 500 // nominal = 564

// Defines for expected on/off commands
#define RF_On_1 0x44
#define RF_On_2 0x15
#define RF_On_3 0x33 // on
#define RF_Off_1 0x44
#define RF_Off_2 0x15
#define RF_Off_3 0x3C // off

byte RF_Bit_Count;
byte RF_Byte_Count;
byte RF_Byte = 0;
byte RF_Message = {0, 0, 0}; // 24 bits
unsigned long Start_Time = 0;
int Pulse_Width;
byte Started = false;

void setup() {
pinMode(DIMMER_PIN, OUTPUT);
digitalWrite(DIMMER_PIN, 0);
pinMode(LED_POW, OUTPUT);
digitalWrite(LED_POW, 0);
pinMode(LED_MIN, OUTPUT);
digitalWrite(LED_MIN, 0);
pinMode(LED_MAX, OUTPUT);
digitalWrite(LED_MAX, 0);
pinMode(LED_ECO, OUTPUT);
digitalWrite(LED_ECO, 0);

digitalWrite(Pulse_In, HIGH); //turn on pullup

// Set interrupt-on-change registers
bitClear(GIMSK, INT0); // disable INT0 external interrupt
bitSet(GIMSK, PCIE1); // enable interrupt-on-change
bitSet(PCMSK1, Pulse_In);
}

void loop() {
byte i;

if (RF_Byte_Count == Msg_Length) {
noInterrupts(); 
if ((RF_Message[0] == RF_On_1) && (RF_Message[1] == RF_On_2) && (RF_Message[2] == RF_On_3))
  digitalWrite(LED_POW, 1);
else if ((RF_Message[0] == RF_Off_1) && (RF_Message[1] == RF_Off_2) && (RF_Message[2] == RF_Off_3))
  digitalWrite(LED_POW, 0);

Started = false;
interrupts();
}
} // end loop

// Interrupt-on-change handler
ISR (PCINT10_vect)
{
//when the pin goes LOW record the pulse start time
if (digitalRead(Pulse_In) == LOW) {
Start_Time = micros();
}
else // pin went high
if (Start_Time != 0) {
//calculate the pulse width
Pulse_Width = ((volatile int)micros() - Start_Time);
//clear the timer
Start_Time = 0;
// Now check for valid message
  if (Pulse_Width < Max_Gap_Time) {
    if (Started == true) {
      if (Pulse_Width > Zero_Bit_Time) {
        // bit = 0
        RF_Bit_Count--; // bits received MSB first
        bitClear(RF_Message[RF_Byte_Count], RF_Bit_Count);
        if (RF_Bit_Count == 0) {
          RF_Byte_Count++;
          RF_Bit_Count = 8;
        }
      }
      else if (Pulse_Width > One_Bit_Time) {
        // bit = 1
        RF_Bit_Count--; // bits received MSB first
        bitSet(RF_Message[RF_Byte_Count], RF_Bit_Count);
        if (RF_Bit_Count == 0) {
          RF_Byte_Count++;
          RF_Bit_Count = 8;
        }
      }
      else { // bad bit
        Started = false;
      }
    } // Started
    
    else if (Pulse_Width > Min_Gap_Time) {
      // start of message
      Started = true;
      RF_Byte_Count = 0;
      RF_Bit_Count = 8;
    }
  }
  else { // invalid message
    Started = false;
  }
}
} 

на данный момент в коде тупо пытаюсь управлять светодиодом, не говоря про отсчет перехода через ноль для управления симистором логического уровня BTB-12-600.
Помогите разобраться.
И еще один момент, разводка на плате пылесоса выполнена так, что сигнал с микросхемы приемника 433 приходит сразу на две ноги МК(на фото видно, МК выпаян). Может кто-то это объяснить??

Нет

А относительно остального есть возможность помочь?

Схема приёмника с attiny24 будет?

Могу попробовать нарисовать. Что вас конкретно интересует на схеме, все думаю рисовать не имеет смысла?! В качестве приемника используется микросхема pt4317-x, вроде никаких особенностей, питание 5в, внешний кварцевый резонатор, и стандартная обвязка, одна ножка выход через транзистор идет на две “запараллеленые” ножки аттини.

для начала привести скетч который пробуете. именно его,выложенный даже компилироваться не будет

Скетч приемника который приведен и который пробую


// Receives commands from an Etekcity RF outlet remote
// Must know the specific codes being transmitted
// 0 bit: 188us
// 1 bit: 3x zero bit length
// Sync (start) time: 30x zero bit
// Message length: 24 data bits, 1 stop bit
// Written by Boomer48: September 2019
#define ZERO_PIN PA7 // пин детектора нуля PA7(6)
#define INT_NUM 0 // соответствующий ему номер прерывания
#define DIMMER_PIN PA6 // управляющий пин симистора PA6(7)
#define Pulse_In PB2 //13PA0 или 5(PB2)
#define LED_MIN PA5 //PA5
#define LED_MAX PA2 //PA2
#define LED_ECO PA3 //PA3
#define LED_POW PA1 //PA1
// Shows on/off state for received commands
#define Msg_Length 3 // Defined message length for specific transmitter

// All times in microseconds
#define Min_Gap_Time 5000 // nominal = 5600
#define Max_Gap_Time 6200 // nominal = 5600
#define One_Bit_Time 120 // nominal = 188
#define Zero_Bit_Time 500 // nominal = 564

// Defines for expected on/off commands
#define RF_On_1 0x44
#define RF_On_2 0x15
#define RF_On_3 0x33 // on
#define RF_Off_1 0x44
#define RF_Off_2 0x15
#define RF_Off_3 0x3C // off

byte RF_Bit_Count;
byte RF_Byte_Count;
byte RF_Byte = 0;
byte RF_Message = {0, 0, 0}; // 24 bits
unsigned long Start_Time = 0;
int Pulse_Width;
byte Started = false;

void setup() {
pinMode(DIMMER_PIN, OUTPUT);
digitalWrite(DIMMER_PIN, 0);
pinMode(LED_POW, OUTPUT);
digitalWrite(LED_POW, 0);
pinMode(LED_MIN, OUTPUT);
digitalWrite(LED_MIN, 0);
pinMode(LED_MAX, OUTPUT);
digitalWrite(LED_MAX, 0);
pinMode(LED_ECO, OUTPUT);
digitalWrite(LED_ECO, 0);

digitalWrite(Pulse_In, HIGH); //turn on pullup

// Set interrupt-on-change registers
bitClear(GIMSK, INT0); // disable INT0 external interrupt
bitSet(GIMSK, PCIE1); // enable interrupt-on-change
bitSet(PCMSK1, Pulse_In);
}

void loop() {
byte i;

if (RF_Byte_Count == Msg_Length) {
noInterrupts(); 
if ((RF_Message[0] == RF_On_1) && (RF_Message[1] == RF_On_2) && (RF_Message[2] == RF_On_3))
  digitalWrite(LED_POW, 1);
else if ((RF_Message[0] == RF_Off_1) && (RF_Message[1] == RF_Off_2) && (RF_Message[2] == RF_Off_3))
  digitalWrite(LED_POW, 0);

Started = false;
interrupts();
}
} // end loop

// Interrupt-on-change handler
ISR (PCINT10_vect)
{
//when the pin goes LOW record the pulse start time
if (digitalRead(Pulse_In) == LOW) {
Start_Time = micros();
}
else // pin went high
if (Start_Time != 0) {
//calculate the pulse width
Pulse_Width = ((volatile int)micros() - Start_Time);
//clear the timer
Start_Time = 0;
// Now check for valid message
  if (Pulse_Width < Max_Gap_Time) {
    if (Started == true) {
      if (Pulse_Width > Zero_Bit_Time) {
        // bit = 0
        RF_Bit_Count--; // bits received MSB first
        bitClear(RF_Message[RF_Byte_Count], RF_Bit_Count);
        if (RF_Bit_Count == 0) {
          RF_Byte_Count++;
          RF_Bit_Count = 8;
        }
      }
      else if (Pulse_Width > One_Bit_Time) {
        // bit = 1
        RF_Bit_Count--; // bits received MSB first
        bitSet(RF_Message[RF_Byte_Count], RF_Bit_Count);
        if (RF_Bit_Count == 0) {
          RF_Byte_Count++;
          RF_Bit_Count = 8;
        }
      }
      else { // bad bit
        Started = false;
      }
    } // Started
    
    else if (Pulse_Width > Min_Gap_Time) {
      // start of message
      Started = true;
      RF_Byte_Count = 0;
      RF_Bit_Count = 8;
    }
  }
  else { // invalid message
    Started = false;
  }
}
}  

, компилируется и заливается без проблем, но не работает. Схему сейчас рисую, но указываю на ней только основные связи.

троллишь? 38 строка тоже компилируется? кварц на какую частоту?

Нет смысла начинать писать код, пока что-то не ясно с работой железа. Можно зря потратить время.

этта шо?

Какой смысл мне врать? И что не так с этой строкой?


Кварц 435.72F14, на всякий случай повторюсь, что схема заводская с пылесосом!!! Кварц на пульте 433,92x, тоже заводской я ничего в схемах не менял!

Я же написал, что элементы исправны, единственное что может вызвать сомнение это микросхема Pt4317, но осциллографом проверял прием сигнала, меандр присутствовал!

Насколько я понимаю масив в который сохраняются принятые данные и через него ведется сравнение, какой сигнал мы получили

тоись, ты не знаешь, чем массив

byte RF_Message[] = {0, 0, 0}; // 24 bits

отличается от неведомой херни

byte RF_Message = {0, 0, 0}; // 24 bits

В которую ты потом пытаешься писать значения, затирая соседние переменные

1 лайк

1
Проверил, в коде все нормально определено, видимо при вставке кода форум что то обрезал! Сейчас исправлю чтобы не вводить в заблуждений. Не получается отредактировать, форум не дает.

Не первый раз тут такое происходит

1 лайк

больно?

Тоже решил к Вдракуле рвануть? :slight_smile:
Шучу

1 лайк

мне и тут нравится, вспомнилось высказывание …