Hallo zusammen, Was mache ich an dieser Stelle falsch? können überhaupt zwei Timer in einem Programm verwendet werden?. (bin Anfänger auf diesem Gebiet). mfg Kaveh .include"m32def.inc" rjmp main .ORG OVF0addr rjmp Timer_0_interrupt .ORG OVF1addr rjmp Timer_1_interrupt main: ;Hauptprogramm ;Stack Initialisieren ldi r17,high(ramend) out sph,r17 ldi r17,low(ramend) out spl,r17 ;------------------------------------------------------------------- ldi r16,0xff out ddra,r16 ldi r16,0xff out ddrb,r16 ;---------------------------------------------------------------------- ;Timer0 von Atmega32 konfigurieren (overflow-Interrupt) ; ;Ldi r16,0X05 ;Vorteiler CK/1024 out TCCR0,r16 Ldi r16,0X01 ;Interrupt einschalten out TIMSK,r16 ; ;---------------------------------------------------------------------- ;Timer1 von Atmega32 konfigurieren (overflow-Interrupt) ldi r18,0x00 out TCCR1A,r18 ldi r18,0b00000100 out TCCR1B,r18 ldi r18,0b00000100 out TIMSK,r18 Ldi r16,0X00 ;r16 mit Null laden ldi r19,0 Sei ;Interrupt erlauben ; ;---------------------------------------------------------------------- mainloop: rjmp mainloop ;endlose Schleiffe ; ;---------------------------------------------------------------------- Timer_0_interrupt: ;Beginn der Timer-Interrupt an dieser stelle com r16 out PORTA,r16 reti Timer_1_interrupt: ;Beginn der Timer-Interrupt an dieser stelle com r19 out PORTB,r19 reti
Woher sollen wir das wissen? Wir wissen ja nicht, was Du beabsichtigst und inwiefern das Programm sich anders verhält als Du erwartest. Siehe: http://www.mikrocontroller.net/articles/Netiquette
Hi Das Programm lässt sich nicht fehlerfrei assemblieren. Die org-Anweisungen für die Interruptvektoren sind in der falschen Reihenfolge. MfG Spess
Hallo nochmal, entschuldige da hast Du recht. Also das programm, was ich oben zusammen geschusstert habe, ist im Prinzip ein Test Programm um zu wissen, ob ich Timer 0 bzw. Timer 1 hier benutzen kann (Interrupt overflow). nun meldet AVR-Studio diese Meldung: error: Overlap in .cseg: addr=0x16 conflicts with 0x16:0x17. und da weiß ich nicht, wie das beheben kann. mfg Kaveh
Vielen Dank für die Antwort. die Reihenfolge. ich dachte erst 0 und dann die 1. aber gut man kann nie genug lernen. Danke Kaveh
>...entschuldige ... Keine Entschuldigung nötig. :-) >lso das programm, was ich oben zusammen >geschusstert habe, ist im Prinzip ein Test Programm um zu wissen, ob ich >Timer 0 bzw. Timer 1 hier benutzen kann (Interrupt overflow). Das ist leider eine zu allgemeine Erklärung. Vor allem geht nicht aus ihr hervor, auf welche Weise genau Du das testen willst. Nun hat Dir ja Peter schon einen eklatanten Punkt genannt. Korrigiere den erstmal. Für die Zukunft: Was soll das Programm machen? woran erkennst Du das es nicht läuft? Welche Teile des Programmes sollen was tun? An welcher Stelle weicht das Programm von dem ab, was es Deiner Meinung nach tun soll? Woran genau stellst Du das fest. Im konkreten Fall noch der Hinweis: Schau Dir mal genau an, was die .org-Anweisung bewirkt. Dann wirst Du auch merken was schief läuft.
Hi >und da weiß ich nicht, wie das beheben kann. >.ORG OVF0addr rjmp Timer_0_interrupt -> Adresse $012 >.ORG OVF1addr rjmp Timer_1_interrupt -> Adresse $00C Du kannst die diese Org-Anweisungen nicht bunt durcheinander würfeln. Zumindest muss die, mit der höchsten Adresse am Ende stehen. Oder du setzt .org INT_VECTORS_SIZE vor deine 'main'. MfG Spess
Hi Und sieh dir mal folgende Zeilen an: >Ldi r16,0X01 ;Interrupt einschalten >out TIMSK,r16 .... >ldi r18,0b00000100|0X01 >out TIMSK,r18 MfG Spess
Hallo nochmal, um Funktion des Timers besser zu verstehen, habe ich folgendes programm geschrieben, was auch hier gestern korrigiert wurde.ich will eigentlich hier mit zwei Timmern arbeiten. Nun wenn Timer0 (8-Bit) und Timer1 (16-Bit) vom Atmega32 so konfiguriet werden, dass nach jedem Überlauf einen Interrupt ausgelöst wird, dann wird Timer0 ofter überlaufen und den Interrupt auslösen als der Timmer 1. nun habe ich das unten stehende Programm im AVR-Studio simuliert und sehe, dass der Timmer0 nach jedem überlauf den Interrupt aufruft. parallel dazu läuft der Timmer1 auch da wird gezählt aber dann beim überlaufen vom Timmer1 passiert garnicht und der beginnt wieder von Null hochzuzählen und er löst auch keinen Interrupt aus. nur der Timer0 macht das. Ich habe den Timer1 so vorgeladen, dass er früher überläuft als Timer0 und da klappt es mit Intterrupt aber nun ist die Sache genau andersum. Mit anderen Worten, es funktionier entweder Mit Timmer0 oder Timmer1 (der Interrupt). Die Frage ist, ob so etwas überhaupt geht ? oder mit dem Programm stimmt etwas nicht? mfg kaveh .include"m32def.inc" rjmp main .ORG OVF1addr rjmp Timer_1_interrupt .ORG OVF0addr rjmp Timer_0_interrupt .def temp=r16 main: ;Hauptprogramm ;Stack Initialisieren ldi temp,high(ramend) out sph,temp ldi temp,low(ramend) out spl,temp ;------------------------------------------------------------------- ldi temp,0xff out ddra,temp ;Port A als Ausgang konfig ldi temp,0xff out ddrb,temp ;Port B als Ausgang konfig ;---------------------------------------------------------------------- ;Timer1 von Atmega32 konfigurieren (overflow-Interrupt) ldi temp,0x00 out TCCR1A,temp ldi temp,0b00000001 out TCCR1B,temp ldi temp,0b00000100 out TIMSK,temp ;ldi temp,0xff ;Z.B TCNT1(16-bit) mit Wert Hex=fffb vorladen ;out TCNT1h,temp ;ldi temp,0xfb ;out TCNT1L,temp ;---------------------------------------------------------------------- ;Timer0 von Atmega32 konfigurieren (overflow-Interrupt) ; Ldi temp,0X01 ;Vorteiler CK/1 out TCCR0,temp Ldi temp,0X01 ;Interrupt einschalten out TIMSK,temp ;ldi temp,0xf8 ; Z.B TCNT0 mit Wert Hex= f8 vorladen ;out TCNT0,temp Sei ;Interrupt erlauben ; ;---------------------------------------------------------------------- mainloop: rjmp mainloop ;endlose Schleiffe ; ;---------------------------------------------------------------------- Timer_1_interrupt: ;Beginn der Timer-Interrupt an dieser stelle sbi portA,0 ;portA.0 auf 1 reti Timer_0_interrupt: ;Beginn der Timer-Interrupt an dieser stelle sbi portB,0 ;portB.0 auf 1 reti
Kaveh Deiport schrieb: > Was mache ich an dieser Stelle falsch? Es fing damit an, dass du den Thread keinen vernünftigen Titel gabst
Hi >Die Frage ist, ob so etwas überhaupt geht ? Das geht problemlos. Sogar mit noch mehr Timernn > oder mit dem Programm stimmt etwas nicht? Genau. Du machst zwei mal ein 'out TIMSK,temp. Mit dem zweiten out überschreibst du die erste Zuweisung. Das muss so aussehen:
1 | ldi r16,1<<TOIE0|1<<TOIE1 |
2 | out TIMSK,r16 |
Benutze bitte die vordefinierten Bitkonstenten statt kryptischer Bitkombinationen. MfG Spess
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.