Ich bin scheinbar zu blöd das Datenblatt zu lesen. Ich möchte gerne den Timer1 des Atmega32 verwenden. Ich möchte einfach gerne ständig den TIMER1 Overflow Interrrupt ausgelöst haben, der dann LEDs blinken lassen soll. Mein Problem: Der Timer läuft, springt beim erreichen des Counter-Werts 0xFFFF auch nach 0x0000 zurück. Aber irgendwie scheint der Interrupt nicht ausgelöst zu werden. TOV1 im TIFR-Register wird auch nicht gesetzt. Ich glaube den Timer so eingestellt zu haben: - clksource: clkIO (no prescaling) (hab auch schon clkIO/64 etc. probiert) - Timer Mode of Operation: Normal Scheinbar habe ich den Timer-Kram völlig missverstanden oder bin einfach nur blind ;D Hier der ASM-Quellcode: http://rafb.net/paste/results/6vAWuO43.html
Über dieses Problem bin ich auch schon gestolpert, die Interrupt-Vektoren müssen/sollten so definiert werden .org 0 ;Startadresse=0 rjmp RESET ; Reset Handler .org $002 reti;rjmp EXT_INT0 ; IRQ0 Handler .org $004 reti;rjmp EXT_INT1 ; IRQ1 Handler .org $006 reti;rjmp EXT_INT2 ; IRQ2 Handler .org $008 reti;rjmp TIM2_COMP ; Timer2 Compare Handler .org $00A reti;rjmp TIM2_OVF ; Timer2 Overflow Handler .org $00C reti;rjmp TIM1_CAPT ; Timer1 Capture Handler .org $00E reti;rjmp TIM1_COMPA; Timer1 CompareA Handler .org $010 reti;rjmp TIM1_COMPB; Timer1 CompareB Handler .org $012 rjmp TIM1_OVF ; Timer1 Overflow Handler .org $014 reti;rjmp TIM0_COMP ; Timer0 Compare Handler .org $016 reti;rjmp TIM0_OVF ; Timer0 Overflow Handler .org $018 reti;rjmp SPI_STC ; SPI Transfer Complete Handler .org $01A reti;rjmp USART_RXC ; USART RX Complete Handler .org $01C reti;rjmp USART_UDRE; UDR Empty Handler .org $01E reti;rjmp USART_TXC ; USART TX Complete Handler .org $020 reti;rjmp ADC ; ADC Conversion Complete Handler .org $022 reti;rjmp EE_RDY ; EEPROM Ready Handler .org $024 reti;rjmp ANA_COMP ; Analog Comparator Handler .org $026 reti;rjmp TWI ; Two-wire Serial Interface Handler .org $028 reti;rjmp SPM_RDY ; Store Program Memory Ready Handler ;-------------------------------------------------------------- RESET:
Wolltest Du den STACK-Pointer wirklich so setzen? Ich hätt ihn an die oberste Stelle gesetzt durch: ldi temp,high(RAMEND) ;Stackpointer initialisieren out SPH,temp ldi temp,low(RAMEND) out SPL,temp
Danke!!!!! Es lag tatsächlich an den Interrupt-Vektoren. Funzt jetzt einwandfrei :D Und ich suche mir nen Elch bei den Timer-Registern ab ;D Den Stack-Pointer hab ich einfach mal irgendwohin gesetzt, damit ich zumindest einen hab ;D Werd ich direkt mal so anpassen ;D
hallo, ich hab mir den Code mal angeschaut, bin aber nicht speziell mit Assembler vertraut, also falls ich was dummens sag Entschuligung. 1 ________________ in zeile 16 rjmp TIMER2_OVF aber es gibt keine Marke dei so heißt ? es gibt nur zeile 74 TIMER1_OVF: und 81 TIMER0_OVF: _________________ 2 _______________________ TOV1 im TIFR-Register wird auch nicht gesetzt. musst du das nicht per hand machen ? vielleicht etwa so ldi TIFR,0b00000100 bevor du sei machst ? ___________________________________ und 3 dein Programm schaltet die LED's ein bei Reset, nach der ersten Timer Ovweflow aus. Danach werden sie aber nie wieder angeschaltet ? __________________________________________ hoffe geholfen zuhaben Chris
Die Marke existiert schon - Hab das ganze etwas vorm posten etwas editiert und da hat sich nen Fehler eingeschlichen ;D TOV1 in TIFR müsste eigentlich vom avr gesetzt werden ("TOV1 is set when the timer overflows." und "tov1 is automatically cleared when the overflow interrupt vector is executed") Prinzipiell ist mir TOV1 eh egal - Ich werde das Flag eh nicht abfragen ;D Das Blinken kommt im nächsten Schritt ;D Der Code ist quasi nur zum testen gewesen ob der Overflow-Interrupt überhaupt ausgelöst wurde ;D
Schon wieder einer, der unübersichtliche Bitkolonnen statt Namen verwendet. Also die Initialisierung des Timer1 scheint OK zu sein. Blinken wird da allerdings nichts, da bei jedem Interrupt der Ausgang auf den gleichen Wert gesetzt wird, und der erste Timer-Überlauf wird relativ schnell passieren (nach 256 Taktzyklen). @Bernhard: Die Initialisierung des Stackpointers sollte zwar so wie du es schriebst durchgeführt werden, aber das dürfte in diesem Fall nicht das Problem sein.
>der unübersichtliche Bitkolonnen statt Namen
Stimmt, ist übersichtlicher und besser nachvollziehbar
zB. so:
ldi temp,(1<<toie1)
out timsk,temp
Sieht tatsächlich übersichtlicher und irgendwie nach C aus ;D Das Ergebnis von ldi temp,(1<<TOIE1) wäre dann quasi beim atmega32 0b00000100 ? Wie kombiniere ich denn mehrere Flags ? Wenn ich z.B. TOIE1 und TOIE2 setzen wollte ? Ein blutiger Anfänger dankt nochmal allen die geantwortet haben ;D
> Wie kombiniere ich denn mehrere Flags ? Wenn ich z.B. TOIE1 und > TOIE2 setzen wollte ? Das ginge mit: ldi temp, (1 << TOE1) | (1 << TOIE2) PS: Du plenkst.
Hmm, das ist ja mal praktisch. (Ich befürchte das Plenken kann ich mir nicht mehr abgewöhnen...)
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.