Доброго времени суток!
Использовал библиотеку Gyver433, загрузил в аттини13а код передатчика
Базовым примером принимаю сигнал ардуиной уно без проблем, а вот загруженный в аттини24а код не работает, не понимаю почему
Помогите разобраться. На данный момент нужно просто управлять диодом в зависимости какие данные пришли на приемник
Использовал библиотеку 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;
}
}
Приемник:
#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(); // останавливаем таймер
//}