LINUX.ORG.RU

История изменений

Исправление 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 почему-то читается единица (что значит, что сигнала нет).