История изменений
Исправление KivApple, (текущая версия) :
Да, так. Осциллографа нет. Проблема, вероятно, на стороне AVR.
unsigned int rx_buffer;
unsigned char rx_count;
ISR(INT0_vect) {
unsigned char half_bit;
if (PIND & _BV(2) == 0) {
half_bit = 1;
} else {
half_bit = 0;
}
rx_buffer = rx_buffer << 1;
rx_buffer |= half_bit;
rx_count++;
if (rx_count == 16) {
... тут я вывожу rx_buffer ...
rx_count = 0;
}
}
...
GIMSK |= _BV(INT0);
MCUCR &= ~_BV(ISC01);
MCUCR |= _BV(ISC00);
Вывод организован просто - я мигаю парой светодиодов (один отвечает за ноль, другой за единицу) с низкой частотой (чтобы можно было невооружённым глазом заметить что пришло, разумеется, в это время приём не работает, но и не надо).
И... приходит 16 бит (я ещё не делаю декодировку в нормальные биты и их в 2 раза больше), то есть INT0 вызывается 16 раз. И это хорошо и правильно. Однако, каждый раз с PIND почему-то читается единица (что значит, что сигнала нет). С другой стороны, если бы состояние вывода не становилось иногда нулевым, не было бы изменения уровня и INT0 не случился бы. Так что проблема в программе.
Исправление KivApple, :
Да, так. Осциллографа нет. Проблема, вероятно, на стороне AVR.
unsigned int rx_buffer;
unsigned char rx_count;
ISR(INT0_vect) {
unsigned char half_bit;
if (PIND & _BV(2) == 0) {
half_bit = 1;
} else {
half_bit = 0;
}
rx_buffer = rx_buffer << 1;
rx_buffer |= half_bit;
rx_count++;
if (rx_count == 16) {
... тут я вывожу rx_buffer ...
rx_count = 0;
}
}
...
GIMSK |= _BV(INT0);
MCUCR &= ~_BV(ISC01);
MCUCR |= _BV(ISC00);
Вывод организован просто - я мигаю парой светодиодов (один отвечает за ноль, другой за единицу) с низкой частотой (чтобы можно было невооружённым глазом заметить что пришло, разумеется, в это время приём не работает, но и не надо).
И... приходит 16 бит (я ещё не делаю декодировку в нормальные биты и их в 2 раза больше), то есть INT0 вызывается 16 раз. И это хорошо и правильно. Однако, каждый раз с PIND почему-то читается единица (что значит, что сигнала нет). С другой стороны, если бы состояние вывода не становилось иногда нулевым, не было бы изменения уровня и INT0 не случился бы.
Исправление KivApple, :
Да, так. Осциллографа нет. Проблема, вероятно, на стороне AVR.
unsigned int rx_buffer;
unsigned char rx_count;
ISR(INT0_vect) {
unsigned char half_bit;
if (PIND & _BV(2) == 0) {
half_bit = 1;
} else {
half_bit = 0;
}
rx_buffer = rx_buffer << 1;
rx_buffer |= half_bit;
rx_count++;
if (rx_count == 16) {
... тут я вывожу rx_buffer ...
rx_count = 0;
}
}
...
GIMSK |= _BV(INT0);
MCUCR &= ~_BV(ISC01);
MCUCR |= _BV(ISC00);
Вывод организован просто - я мигаю парой светодиодов (один отвечает за ноль, другой за единицу) с низкой частотой (чтобы можно было невооружённым глазом заметить что пришло, разумеется, в это время приём не работает, но и не надо).
И... приходит 16 бит (я ещё не делаю декодировку в нормальные биты и их в 2 раза больше), то есть INT0 вызывается 16 раз. И это хорошо и правильно. Однако, каждый раз с PIND почему-то читается единица (что значит, что сигнала нет).
Исходная версия KivApple, :
Да, так. Осциллографа нет. Проблема, вероятно, на стороне AVR.
unsigned int rx_buffer;
unsigned char rx_count;
ISR(INT0_vect) {
unsigned char half_bit;
if (PIND & _BV(2) == 0) {
half_bit = 1;
} else {
half_bit = 0;
}
rx_buffer = rx_buffer << 1;
rx_buffer |= half_bit;
rx_count++;
if (rx_count == 16) {
... тут я вывожу rx_buffer ...
rx_count = 0;
}
}
...
GIMSK |= _BV(INT0);
MCUCR &= ~_BV(ISC01);
MCUCR |= _BV(ISC00);
Вывод организован просто - я мигаю парой светодиодов (один отвечает за ноль, другой за единицу) с низкой частотой (чтобы можно было невооружённым глазом заметить что пришло, разумеется, в это время приём не работает, но и не надо).
И... приходит 16 бит (я ещё не делаю декодировку в нормальные биты и их в 2 раза больше), то есть INT0 вызывается 16 раз. Однако, каждый раз с PIND почему-то читается единица (что значит, что сигнала нет).