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.
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
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
@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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.