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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.