Forum: Mikrocontroller und Digitale Elektronik TIMER-Problem


von Julien (Gast)


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.

von Julien (Gast)


Lesenswert?

Hat Vielleicht jemand ein funktionsfähiges Assembler-Programm für die 
Timer T0 und/oder T1.

Der verwendete µC ist ein AT90S8515
AVR Studio 4

Danke im Vorraus

von Uwe (Gast)


Lesenswert?

Hallo Julien!
Ist das nicht etwas wenig was du uns da anbietest?
Wo ist die Interrupttabelle?
Wo ist die ISR?
Was soll der Timer überhaupt machen?
Du hast jedenfalls einen Timer0 mit CK/1024, der nach 262144 Takten 
einen TOV0 erzeugt, mehr ist deinem Prog.nicht zu entnehmen.

Gruss Uwe

von Julien (Gast)


Angehängte Dateien:

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.

von crazy horse (Gast)


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

von Julien (Gast)


Lesenswert?

Vielen danke @ Crazy horse

Das gewünschte Programm funktioniert jetzt.

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.