Здравствуйте.
По книжке я научился настраивать таймер по совпадению при сравнении.
Ниже написан пример из книги. Он дергает пином PCO, это работает, значит таймер настроен верно.
Изучил все регистры таймеров, установил срабатывание прерывания по совпадению.
Сделал указатель вектора прерывания по совпадения на процедуру инвертирования пина в порту А. Но пин не переключается, значит прерывание либо не срабатывает, либо я с векторами напутал.
Пожалуйста помогите разобраться.
Код:
.include "ATxmega128A1def.inc"
#define F_CPU 32000000 ;
.def temp =R16
.DSEG
cnt: .byte 1
.CSEG
.ORG 0
rjmp reset
.ORG TCC0_CCA_vect
jmp TCC0CCA ; вектор прервывания по совпадению таймера 0
.ORG 0xF6
reset: LDI temp, LOW(RAMEND)
LDI R17, HIGH(RAMEND)
OUT CPU_SPL, temp
OUT CPU_SPH, R17
ldi temp, 0x01 ; configure PCO pin for output
sts PORTC_DIR, temp
ldi temp, 0b00010001 ; configure CCA to operate in FRQ mode
sts TCC0_CTRLB, temp
ldi temp, low(399) ; set up TOP value for channel A
sts TCC0_CCA, temp
ldi temp, high(399)
sts TCC0_CCA+1, temp
ldi temp, 0 ; disable capture and any event action
sts TCC0_CTRLD, temp
ldi temp, 0b00000100 ; select clk_PER/4 as timer clock input
sts TCC0_CTRLA, temp
ldi temp, 0b00000011 ; включить прерывание по совпадению таймера
sts TCC0_INTCTRLB, temp
;ldi temp, 0b00000111 ;
;sts OSC_CTRL, temp
ldi temp, 0b00100000 ;set R17 to 11
sts PORTA_DIRSET, temp ;set all the GPIO's in the four bit PORTA as outputs
sei
LOOP: nop
rjmp LOOP
TCC0CCA: sts PORTA_OUTTGL, temp ;toggle the state of all the pins in PORTA
reti