Приемник 433 attiny24a

killbomb

✩✩✩✩✩✩✩
18 Мар 2024
3
0
Доброго времени суток!
Использовал библиотеку Gyver433, загрузил в аттини13а код передатчика
Передатчик:
#define G433_FAST

#include <Gyver433.h>
#include <avr/sleep.h>
Gyver433_TX<4> tx;
#define Button1 1
#define Button2 2
#define Button3 3
#define Button4 0

volatile byte data;

void setup ()
{

  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 ()
{
  tx.sendData(data);
 
}

void Transmit2 ()
{
 tx.sendData(data);

}

void Transmit3 ()
{
  tx.sendData(data);
 
}

void Transmit4 ()
{
  tx.sendData(data);

}


// Interrupt-on-change handler
ISR (PCINT0_vect)
{
  delayMicroseconds(16000); // debounce switch
  delayMicroseconds(16000); // debounce switch
  delayMicroseconds(16000); // debounce switch
  data=0;
  if (digitalRead(Button1) == LOW){
    Transmit1();
    data=0x33;
  }
  else if (digitalRead(Button2) == LOW){
    Transmit2();
      data=0x3C;
  }
  else if (digitalRead(Button3) == LOW){
    Transmit3();
      data=0xC3;
  }
  else if (digitalRead(Button4) == LOW){
    Transmit4();
      data=0xCC;
  }
}
Базовым примером принимаю сигнал ардуиной уно без проблем, а вот загруженный в аттини24а код не работает, не понимаю почему
Приемник:
#include <Gyver433.h>
//#include <GyverTimers.h>
Gyver433_RX<PB1, 1> rx;  // указали пин и размер буфера

#define ZERO_PIN PA7 // пин детектора нуля PA7(6) вход
#define INT_NUM 0 // соответствующий ему номер прерывания
#define DIMMER_PIN PA6 // управляющий пин симистора PA6(7) выход
#define LED_MIN PA5 //PA5 выход
#define LED_MAX PA2 //PA2 выход
#define LED_ECO PA3 //PA3 выход
#define LED_POW PA1 //PA1 выход
// #define RX_PIN PB1 // вход для теста бит PB1 = 1, для рабочего устройства 13PA0= или 5(PB2)=2
void setup() {




  DDRA = 0b01101110; // определяем пины порта А как выход(1)
  DDRB = 0b00000000; // определяем пины порта B как вход (0)
  PORTA = 0b00000000; // выставляем уровень сигнала на пинах LOW
  PORTB = 0b00000000; // выставляем уровень сигнала на пинах LOW

//attachInterrupt(PB1, isr, CHANGE);
  //attachInterrupt(INT_NUM, isr, RISING);  // для самодельной схемы ставь FALLING
  //Timer2.enableISR();


  // Set interrupt-on-change registers
  GIMSK = 0b01100000; // равносильно записи GIMSK |= (1<<PCIE); bitClear(GIMSK, INT0); // disable INT0 external interrupt  bitSet(GIMSK, PCIE1); // enable interrupt-on-change
  PCMSK1 = 0b00000010; // равносильно  PCMSK1 |= (1<<RX_PIN); или bitSet(PCMSK1, RX_PIN);
}
void loop() {
  // gotData() вернёт количество удачно принятых байт
  if (rx.gotData()) {   // если больше 0
    PORTA |= (1<<LED_POW);
    delay(1);
    PORTA &= ~(1<<LED_POW);
    // ЧИТАЕМ. СПОСОБ 1
    // я знаю, что передатчик отправляет byte
    byte data;

    // читаем принятые данные в data
    // если данные совпадают по размеру - ок
    switch (rx.readData(data)) {
      case 0x33:
PORTA |= (1<<LED_POW);
        break;
      case 0x3C:
PORTA &= ~(1<<LED_POW);
        break;
      case 0xC3:
PORTA |= (1<<LED_POW);
        break;
      case 0xCC:
PORTA &= ~(1<<LED_POW);
        break;
  

    }
  }
}

ISR (PCINT1_vect) {

  rx.tickISR();

}

//void isr() {
//rx.tickISR();
//}
//ISR(TIMER2_A) {
//  digitalWrite(DIMMER_PIN, 1);  // включаем симистор
//Timer2.stop();                // останавливаем таймер
//}
Помогите разобраться. На данный момент нужно просто управлять диодом в зависимости какие данные пришли на приемник
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
133
Добавлено позже: То что написано ниже, не имеет большого смысла, т.к. я описывал отличие UNO и 24а, предполагая, что ЭТОТ код приемника работает на UNO. Позже я понял, что на UNO работает другой код, а в этом коде просто ошибки не зависящие от МК.

----Исходное сообщение---
Сомнительные места

Gyver433_RX<PB1, 1> rx; // указали пин и размер буфера
Библиотека Gyver433, в случае ATtiny24 будет вызывать digitalRead(PB1); и надо смотреть, какой пин будет реально считываться и как реализован digitalRead в плане адресации пинов и в плане быстродействия

GIMSK = 0b01100000; // равносильно записи GIMSK |= (1<<PCIE); bitClear(GIMSK, INT0); ........
По моему это не равносильно. Данная запись разрешает в том числе INT0
И в целом - если хотите установить только PCIE1, то так и пишите GIMSK = (1<<PCIE1);

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

Для многих спорных вопросов помогает изучение листингов ассемблера (поиск в инете - как получить листинг в Ардуино)
 
Изменено:

killbomb

✩✩✩✩✩✩✩
18 Мар 2024
3
0
ATtiny24 будет вызывать digitalRead(PB1); и надо смотреть, какой пин будет реально считываться
Реально и будет считываться PB1, во-первых я проверил прерывание обрабатывается когда на пульте нажимаешь кнопку, во-вторых пробовал указывать номер регистра и прерывание тоже срабатывает.
GIMSK = 0b01100000; // равносильно записи GIMSK |= (1<<PCIE); bitClear(GIMSK, INT0); ........
По моему это не равносильно.
Да тут ошибка согласен. Что касается комментариев, я учусь работать с регистрами поэтому пишу небольшие подсказки.
Проверить, насколько реальная тактовая частота соответствует ожидаемой (написав тестовый скетч с миганием).
Не совсем понимаю как по диоду можно отследить тактовую частоту, подскажите если не трудно!
Аттини13 тактируется 1.2МГЦ, а 24я 8МГЦ может ли это влиять??
И правильно ли я прописал данную конструкцию:
Обработка принятых данных:
switch (rx.readData(data)) {
      case 0x33:
PORTA |= (1<<LED_POW);
        break;
      case 0x3C:
PORTA &= ~(1<<LED_POW);
        break;
      case 0xC3:
PORTA |= (1<<LED_POW);
        break;
      case 0xCC:
PORTA &= ~(1<<LED_POW);
        break;
 

    }
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Аттини13 тактируется 1.2МГЦ, а 24я 8МГЦ может ли это влиять??
Ещё как. Если компиляция кода выполняется для другой частоты, это может привести к полной неработоспособности. Следите внимательно за этим.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
133
@killbomb,
Я был не прав, в своем предыдущем ответе, т.к. ошибочно думал, что этот код работает на UNO, и смотрел на возможные специфические особенности, но оказалось, что в коде принципиальные ошибки а так как я не работал с 433, то помочь не могу.
Например
switch (rx.readData(data))