Forum: Mikrocontroller und Digitale Elektronik 16-Bit Timer beim Atmega32


von blamann (Gast)


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

von Bernhard S. (bernhard)


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:

von Bernhard S. (bernhard)


Lesenswert?

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

von blamann (Gast)


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

von chris (Gast)


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

von blamann (Gast)


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

von Rolf Magnus (Gast)


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.

von Rolf Magnus (Gast)


Lesenswert?

Mist, zu spät.

von Bernhard S. (bernhard)


Lesenswert?

>der unübersichtliche Bitkolonnen statt Namen

Stimmt, ist übersichtlicher und besser nachvollziehbar
zB. so:

 ldi temp,(1<<toie1)
 out timsk,temp

von blamann (Gast)


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

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von blamann (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.