TIMER-Problem

Gast #30032
Lesenswert?

Hallo

ich habe folgendes Problem:
Bin ein Neuling im Gebiet der µC-Programmierung und jetzt habe ich 
versucht ein gleiches Assembler-Programm zu schreiben um zu sehen wie 
die Timer in der AVR-RISC Reihe funktionieren.

beim RESET wird folgendes ausgeführt:

LDI LR,LOW(RAMEND)
OUT SPL,LR
LDI LR,HIGH(RAMEND)
OUT SPH,LR

LDI LR, (1<<TOV0)
OUT TIFR, LR

LDI LR, 0
OUT TCNT0, LR
LDI LR, 5
OUT TCCR0, LR
LDI LR, 2
OUT TIMSK, LR
SEI

RJMP MAIN

und die PORTS werden festgelegt.

Leider funktioniert der Zähler nicht!
Sowohl in der Simulation als auch HARDWARE-technisch.

Wo liegt das Problem.
Gast #30035
Lesenswert?

@Uwe

ich glaube das obige beispiel war nicht sehr glücklich gewählt.
Deshlab hab ich jetzt mal den Code gepostet.

Das Problem ist, das der Timer dafür zuständig ist bei jedem Overflow 
den er erzeugt das REg. DMX1 um 1 erhöht.

Im hauptprogramm wird dieses Reg. abgefragt und eine entspr. Funktion 
ausgeübt.

Leider sehe ich sowohl in der Simulation als auch in der hardware keine 
anzeichen, dass der Timer zu zählen beginnt, und somit auch kein 
Overflow erzeugt.
Angehängte Dateien:
Gast #30036
Lesenswert?

Der Timer funktioniert schon, sind aber ein paar Ungenauigkeiten drin.
Auf jeden Fall mußt du in der ISR das SREG sichern, entweder in einem 
eigenen Register oder auf dem Stack, der inc-Befehl verändert die Flags, 
nach Rückkehr ins Hauptprogramm stimmen die Werte sonst nicht.
Des weiteren solltest du in der ISR ein Bit setzen, welches anzeigt, daß 
etwas passiert ist und nur dieses im Hauptprogramm abfragen und dann die 
entsprechenden Aktionen ausführen, da der Zustand deines Zählregisters 
längere Zeit denselben Wert enthält, werden die Programmteile ST1_x 
ziemlich oft ausgeführt, nicht direkt falsch, aber nicht schön.
Das eigentliche Problem dürfte aber in den Programmteilen
ST1_x liegen. Ich schätze mal, du willst die Ports PA4-7, bitweise 
setzen/rücksetzen. Das funktioniert so nicht, PA7 ersetzt der Assembler 
mit 7, in deinem Fall würdest du das I/O-Register mit der Adresse 7 
beschreiben (das existiert übrigens zumindest bei 8515 gar nicht). 
Entweder schreibst du den kompletten PortA, oder du mußt mit 
Einzelbitbefehlen arbeiten.

ST1_1:
ldi LR1, 0b10000000
out PORTA, LR1          ;PortA0..A6=0, PA7=1

oder:
cbi PORTA, PA7          ;PA7=0
cbi PORTA, PA6          ;PA6=0
cbi PORTA, PA5          ;PA5=0
sbi PORTA, PA4          ;PA4=1

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