16-Bit Timer beim Atmega32

Gast #234713
Lesenswert?
• ▲
▼
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
#234714
Lesenswert?
• ▲
▼
Ü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:
Gast #234716
Lesenswert?
• ▲
▼
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
Gast #234717
Lesenswert?
• ▲
▼
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
Gast #234718
Lesenswert?
• ▲
▼
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
Gast #234719
Lesenswert?
• ▲
▼
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.
Gast #234722
Lesenswert?
• ▲
▼
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.