Timer0, Interrupt

Gast #99455
Lesenswert?

Hallo zusammen

Als Neuling versuchte ich, ein einfaches Programm, das den Timer 0
zählen lässt und bei einem Überlauf eine Interruptroutine ausführt zu
programmieren.
Leider schlägt bereits die Simulation in AVR Studio 4 fehl, da offenbar
eine Zuweisung aus r16 an TIMSK0 zu folgender Fehlermeldung führt:
Illegal argument type or count.
Die entsprechende Zeile im beiliegenden Code ist mit einem Pfeil
gekennzeichnet.
Für Hinweise zur Lösung wäre ich dankbar.

Gruss Justus
Angehängte Dateien:
Gast #99456
Lesenswert?

Hi...

TIMSK0 kenne ich nicht, das Timer-Interrupt-Mask-Register heißt bei den
üblichen AVRs TIMSK. Falls das beim Mega169 anders sein sollte, bitte
ich um Verzeihung...

Bit- & Bytebruch...
...HanneS...
Gast #99457
Lesenswert?

Im am Anfang des Codes definierten Include File des Mega169 sind die
Register bzw. Speicher-Adressen wie folgt benannt:

;*********************************************************************** 
******
; I/O Register Definitions
;*********************************************************************** 
******

;**** Memory Mapped I/O Register Definitions  (0xFF-0x60) ****
.equ  LCDDR18   = 0xFE
[snip]
.equ  ADCH      = 0x79
.equ  ADCL      = 0x78
.equ  TIMSK2    = 0x70
.equ  TIMSK1    = 0x6F
.equ  TIMSK0    = 0x6E
.equ  PCMSK1    = 0x6C
.equ  PCMSK0    = 0x6B

d.h. meiner Meinung nach hat jeder der drei Timer ein eigenes
"Mask"-Register. Und der Name, den ich benützt habe scheint auch
korrekt zu sein. Die Fehlermeldung deutet vielleicht auf etwas
anderes... aber auf was?

Justus
Gast #99458
Lesenswert?

Wie der Hilfe zum Befehl out zu entnehmen ist, darf der erste
Parameter, also die Zieladresse nur zwischen 0 und 63 (dezimal)
liegen.
Bei Adressen oberhalb dieses Wertes muß man statt dessen sts
verwenden.

Das gleiche gilt sinngemäß für in / lds.

Gruß
Ingo
#591380
Lesenswert?

Ha da war ich kürzlich auch ;)
Du solltest mal avra versuchen (assembler, keine ahnung ob's den auch 
für windows gibt), der gibt klarere Auskunft was falsch ist.
Dein Programm beginnt in der Interrupt Tabele, was schlecht ist, diese 
Erfahrung musste ich auch schon machen. Wenn jetzt ein interrupt 
aufgerufen wird der nach Timer0_OVF kommt springt der mitten in deinen 
code, was vermutlich nicht erwünscht ist.
schreibe entweder (dirty) ein .org $0030 (naja > 26 IIRC) vor dein 
reset:
oder was viel besser ist füll die Interrupttabelle ganz auf.
Die Sache mit dem OUT <-> STS ist bei dem m169 doch sehr häufig der hat 
viele I/O-register, daher auch viele >64 ($40) schau im zweifel in die 
m169def.inc.

Ich hänge mal mein aktuellen Code an. (auch Butterfly) Achtung Chaos. ;)
Ist viel auskommentiert.
Nimm das aber nicht als Mass der Dinge, ich mach das auch erst seit sehr 
kurzer Zeit. ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren