Nazdárek všem, přecházím z 51 na AVR, takže se pořád učím něco nového. Došla řada na přeřušení od čítače/časovače 0. Podle já jsem ALL nastavil jak má být, ale nejde to. Když spustím simulaci v AVR Studiu, nedojde k volání přerušení, nastaví se příznak, ale šipka se pořád mele v nekonečné smyčce a neskočí na obsluhu přerušení. Připojím výpis v asm a za každou radu děkuji, jen podotýkám, že o odkazy psané v nečeštině nemám zájem, páč vládnu jen ČJ a to ještě nenejlépe.
;OBSLOUŽENÍ PŘERUŠENÍ OD čítače/časovače 0 - CC0, xtal 16 MHz
;bliká celý port C
.nolist
.include “m16def.inc”
.list
.cseg ;kodový segment
.def reg=r16 ;pracovní registr
.equ ddr=ddrc ;registr řízení směru
.equ port=portc ;port
;… …
;prostor vyhrazený pro volání přerušení
.org 0
rjmp start ;skoc na začátek programu
.org ovf0addr ;přerušení od CC0
rjmp opcc0 ;skoč a obsluž přerušení od CC0
…
;úvodní nastavení
start: ldi r26,6 ;konstanta pro nulování PORTuC
ldi r25,1 ;konstanta pro nastavení PORTuC
ldi r24,250 ;čítání jedné sekundy za pomoci
ldi r23,40 ;tří registrů v intervalech
ldi r22,10 ;2,5 milisec, 100 milisec, 1 sec
ldi reg,255 ;nastav registr
out ddr,reg ;nastav port C jako výstupní
ldi reg,low (ramend)
out spl,reg ;nastav SP na konec SRAM
ldi reg,high (ramend)
out sph,reg
ldi r21,160 ;schoda TCNT0 s OCR0 po 10 µsec
out ocr0,r21 ;zapiš do registru OCR0
ldi reg,0b00001001
out tccr0,reg ;nastavení CC0 - režim CTC
ldi reg,0b0000010 ;
out timsk,reg ;povol přerušení CC0 při schodě TCN0=OCR0
sei ;povol globální přerušení v SREG
;…
;celý port C bliká po asi 0,5 sec
zap: cpse r22,r25 ;při schodě přeskoč následující řádek
rjmp vyp ;skoč (line 40)
ldi reg,255
out port,reg ;nastav PORTC
vyp: cpse r22,r26 ;při schodě přeskoč následující řádek
rjmp zap ;skoč
ldi reg,0
out port,reg ;nuluj PORTC
rjmp zap
;…
;obsloužení přerušení od CC0
;nezapomeň uložit SREG, pak pokračuj v obsluze přerušení a je to třeba? (line 50)
opcc0: in r17,sreg ;obsah SREG dej do r17
push r17 ;ulož SREG před ztracením do zásobníku
dec r24 ;r24-1
breq zpet ;skoč není-li r24=0
ldi r24,250 ;nuluje se po 2,5 µsec
dec r23 ;r23-1
breq zpet ;skoč není-li r23=0
ldi r23,40 ;nuluje se po 100 milisec
dec r22 ;r22-1
breq zpet ;skoč není-li r22=0 (line 60)
ldi r18,0 ;
out tifr,r18 ;nuluj příznak přerušení od cc0
ldi r22,10 ;nuluje se po 1 sec
pop r17 ;vyzvedni obsah SREG ze zásobníku
out sreg,r17 ;obsah SREG čti z r17
zpet: reti ;návrat z ošetření přerušení CC0 do programu
;…
administrator: přesunuto z “ARM”
CC0.asm (2.57 KB)