Сразу к делу, есть такой код:
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER1_COMPA_vect) {
PORTB ^= 0x01;
}
inline void init_timer(void) {
TCCR1B |= (1 << WGM12); // CTC
TCCR1B |= (1 << CS12); // clk/256
OCR1AH = 0x1E;
OCR1AL = 0x84; // надо отсчитать секунду
}
int main(void) {
DDRB = 0x01;
PORTB = 0x00;
init_timer();
sei();
while(1) {
}
return 0;
}
Собираю так:
avr-gcc -g -Og -DF_CPU=2000000UL -mmcu=atmega8a -o a.out test.c
Запускаю simavr так:
simavr -v -v -g -m atmega8 -f 2000000UL a.out
в avr-gdb
запускаю так:
(gdb) file a.out
Reading symbols from a.out...
(gdb) target remote :1234
В итоге, когда код подходит к sei() (прохожу по строчкам: n
), выполнение встает после sei():
13 OCR1AL = 0x84;
(gdb) n
20 sei();
(gdb) n
^C^C^CRemote communication error. Target disconnected.: Connection reset by peer.
Я хочу чтобы по таймеру происходило прерывание и переключало состояние первого бита PORTB. Такое ощущение, что avr-gdb не умеет в простой (или прерывания, хотя я могу и ошибаться), потому что я так и не дождался заветного PORTB ^= 0x01;
по display
.