Var o köpte en ATmega16 för några dagar sedan och har suttit o lekt med den lite fram och tillbaks. Dock har jag trillat på ett litet problem som jag inte lyckas lösa, hoppas någon här kan hjälpa mig.
Jag hade tänkt använda ett interrupt som triggar på en räknare då räknarens värde är det samma som värdet i OCR0 - registret, dvs TIMO_COMP. Från denna interrupthandteraren ville jag skicka ett värde till huvudprogrammet genom att spara det i ett register som jag dedicerade för ändamålen, kanske inte den bästa lösningen, men det hade funkat smidigt här.
I alla fall. Detta fungerade inte och jag undrar varför. Istället får jag skriva till minnet i interrupthandteraren och därefter läsa ut värdet i huvudprogrammet. Detta funkar hur bra som helst.
Tyckte att fenomenet var intressant, så jag startade en tråd här och bifogar ett exempel, troligen har jag gjort något tokigt och då lär ni väl smälla mig på fingrarna hoppas jag



På analogt sätt har jag provat att låta interruptrutinen skriva i io-registerna direkt. Värdet hålls bara giltigt så länge som interruptrutitnen exekverar. Känns skummt. Antingen har kretsen gått delvis trasig eller så börjar jag bli halvt tokig, eller så är allt som det ska.
Min kod ser ut som följer (hoppas jag skrev av rätt nu och fått med allt):
.org 0x000
intsetup:
rjmp main
.org 0x026
rjmp tim01
tim01:
push r0
ldi r23, c5 ; skriv värde till huvudprocessen
pop r0
reti
main:
ldi r30, 0 ; initiera stacken till något fungerande värde
ldi r17, 0x00
out SPH, r17
ldi r17, 0xFF
out SPL, r17
call init
sei
ldi r23, 0xFF
loop:
; här tydker jag värdet cU borde skrivas ut på porten när interruptet
; har exekverats eller ??
; istället tycker jag mig få ut värdet 0xFF. Om jag däremot sparar
; i minnet i interruptrutinen och läser minnet här funkar allt väl.
out PORTC, r23
jmp loop
init: ; den del av det som sätter upp räknaren,
;känns onödigt att lägga ut allt
"pusha alla register jag tänker använda"
"initiera lite IO-portar"
ldi r16, 0xFF ; Make the PORTC output
out DDRC, r16
ldi r16, 0xFF ; Dark all leds
out PORTC, r16
ldi r18, 0b00011101
out TCCR0, r18
ldi r17, 0
out TCNT0, r17
ldi r17, 0xE0
out OCR0, r17
ldi r16, 0x02
out TIMSK, r16
out TIFR, r16
....
"pop alla register jag användt"
ret
;; ligger egentligen först i filen, men lade det nedest här....
.lsym TIMSK, 0x39
.lsym TIFR, 0x38
.lsym OCR0, 0x3C
.lsym TCCR0, 0x33
.lsym TCNT0, 0x32
.lsym PORTC, 0x15
.lsym cU, 0xC8
.lsym SPH, 0x3E
.lsym SPL, 0x3D