Forum: Mikrocontroller und Digitale Elektronik Timer0, Interrupt


von justus (Gast)


Angehängte Dateien:

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

von ...HanneS... (Gast)


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...

von justus (Gast)


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

von Ingo Henze (Gast)


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

von justus (Gast)


Lesenswert?

Vielen Dank. Da wäre ich vermutlich nie darauf gekommen, da ich den
Initialisierungscode aus einem Beispiel kopiert habe.

Justus

von Michael W. (wiebel42)


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. ;)

von STK500-Besitzer (Gast)


Lesenswert?

Knapp zwei Jahre später auf einen Beitrag zu antworten ist bestimmt sehr 
sinnvoll...

von Johannes M. (johnny-m)


Lesenswert?

STK500-Besitzer wrote:
> Knapp zwei Jahre später auf einen Beitrag zu antworten ist bestimmt sehr
> sinnvoll...
???
2007 - 2004 = 3...

von STK500-Besitzer (Gast)


Lesenswert?

>STK500-Besitzer wrote:
>> Knapp zwei Jahre später auf einen Beitrag zu antworten ist bestimmt sehr
>> sinnvoll...
>???
>2007 - 2004 = 3...

Das fällt unter Rundungsfehler... :)

von Michael W. (wiebel42)


Lesenswert?

argh, peinlich, hab ich grade mal direkt nicht gemerkt, sry ;)
Dann wollen wir den thread wieder in Ruhe weiter sterben lassen.
Wie pietätlos von mir.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.