Forum: Mikrocontroller und Digitale Elektronik atmega8 timer0+timer1+timer2


von Daniel M. (erfolgstyp)


Lesenswert?

hallo zusammen
habe folgendes problem ich möchte auf nem atmega8 per pwm eine feste 
spannung ausgeben. außerdem soll zu testzwecken eine led mit ca. 1Hz 
blinken beides funktioniert auch allerdings nur solange ich nur eine der 
beiden funktionen programmiere. die spannung wird ausgegeben wenn die 
led nicht blinkt und die led blinkt wenn keine spannung ausgegeben wird. 
die pwm mache ich mit timer1 und das blinken der led hab ich schon mit 
timer0 und timer2 versucht beides mal geht nur eine der beiden 
funktionen.

aufgefallen ist mir wenn ich die konfiguration von TCCR1B raus lasse 
funktionieren timer 0 und 2 (timer 1 logischerweise nicht) aber sobald 
ich TCCR1B wieder einfüge geht nur die pwm.

bin echt ratlos hab auch schon viel gegoogelt und hier und auch in 
anderen foren gelesen aber so nen fall hab ich nicht gefunden. wär echt 
für jede hilfe dankbar.

achja eingestellt ist der interne 4mhz takt

hier der code vielen dank im vorraus

.include "m8def.inc"

.org 0x0000
rjmp interrupt_init_end         ; Reset Handler
.org OVF2addr
rjmp timer2_overflow           ; Timer Overflow Handler
.org OVF0addr          ; Overflow2 Interrupt Vector Address
rjmp timer0_overflow
interrupt_init_end:

;Initialisierung Stack Pointer
ldi r16, LOW(RAMEND)        ;LOW-Byte der obersten RAM-Adresse
out SPL, r16
ldi r16, HIGH(RAMEND)       ;HIGH-Byte der obersten RAM-Adresse
out SPH, r16

;initialisierung Timer
;Timer 0 (kurze zeit)
ldi r16, 0b00011001       ;Vorteiler timer0 Wählen
out TCCR0, r16
;Timer1 (PWM)
ldi r16, 0b00011010      ;Vorteiler timer1 und PWM Mode wählen

out TCCR1B, r16             ;da ist der hund begraben

ldi r16, 0b10000010      ;Ein/Ausschalten OC1A und PWM Mode wählen
out TCCR1A, r16
;Timer2 (lange zeit)
ldi r16, 0b00000111      ;vorteiler Timer2 wähen
out TCCR2, r16
;Alle Timer
ldi r16, 0b01010001       ;Aktion bei Overflow
out TIMSK, r16
sei              ;Interrups zulassen

;Datenrichtung Festlegen
ldi r16, 0xFF
out ddrc, r16        ;PortC als Ausgang
out ddrB, r16
ldi r16, 0x00
out ddrD, r16

;*************Hauptprogramm*************
main:
ldi r16, 0
out ICR1H, r16        ;Bis hier zählt der Timer
ldi r16, 100
out ICR1L, r16
ldi r16, 0
out OCR1AH, r16
ldi r16, 30          ;Spannungswert
out OCR1AL, r16        ;ADC Wert als MAX wert

;live bit
rcall warte1s
cbi portc, 5
rcall warte1s
sbi portc, 5

rjmp main

;***********Unterprogramme**********

;Aktion bei Timer0 Overflow  (Unterprogramm)
timer0_overflow:
inc r18            ;R18 Incrementieren
inc r18            ;R18 Incrementieren
inc r18            ;R18 Incrementieren
inc r18            ;R18 Incrementieren
reti            ;zurück

;Aktion bei timer2 overflow (Unterprogramm)
timer2_overflow:
inc r19            ;R19 Incrementieren
inc r19            ;R19 Incrementieren
inc r19            ;R19 Incrementieren
inc r19            ;R19 Incrementieren
reti            ;Zurück

;warteschleife 5ms (Unterprogramm)
warte5ms:          ;Sprungmarke warte 5ms
nio5ms:            ;Sprungmarke Wert nio
cpi r18, 12          ;r18 auf Wert prüfen
brlo nio5ms          ;wenn wert nio erneut prüfen
ldi r18, 0x00                 ;register löschen
ret            ;zurück wenn wert io

;Warteschleife1s
warte1s:
nio1s:            ;Stprungmarke Wert nio
cpi r19, 16          ;r19 auf wert prüfen
brlo nio1s          ;wenn nio erneut prüfen
ldi r19, 0x00        ;register löschen
ret

von Stefan E. (sternst)


Lesenswert?

> aufgefallen ist mir wenn ich die konfiguration von TCCR1B raus lasse
> funktionieren timer 0 und 2 (timer 1 logischerweise nicht) aber sobald
> ich TCCR1B wieder einfüge geht nur die pwm.

Du hast OCIE1A auf 1 gesetzt, ohne für diesen Interrupt irgendwelchen 
Code zu haben. Also gibt es Chaos, wenn du den Timer startest (TCCR1B), 
und dieser anfängt Interrupts auszulösen.

von Daniel M. (erfolgstyp)


Lesenswert?

super danke für deine hilfe da wär ich allein nie drauf gekommen
hast du den fehler zufällig gesehen oder hattest du das auch schonmal 
oder wie konntest du da so schnell drauf kommen

vielen dank nochmal

von Stefan E. (sternst)


Lesenswert?

Münzi Münzi schrieb:
> hast du den fehler zufällig gesehen oder hattest du das auch schonmal

Weder noch.

> oder wie konntest du da so schnell drauf kommen

Durch methodisches Vorgehen auf der Basis deiner Beschreibung.

> sobald ich TCCR1B wieder einfüge geht nur die pwm
-> Fehlverhalten ist abhängig vom Schreiben nach TCCR1B.

Was ist der Unterschied?
-> Einmal läuft der Timer, und einmal nicht. Fehlverhalten wird also 
durch das Laufen des Timers ausgelöst.

Wann nimmt ein laufender Timer direkten Einfluss auf die Codeausführung?
-> Bei Interrupts, also Interrupt-Konfiguration anschauen.

> ldi r16, 0b01010001       ;Aktion bei Overflow
> out TIMSK, r16
Wieso 3 Bits in TIMSK gesetzt, wo es doch nur 2 Interrupt-Routinen gibt?
-> Datenblatt öffnen und Bits in TIMSK kontrollieren.

=> Fehler gefunden

von Daniel M. (erfolgstyp)


Lesenswert?

dann war ja wenigstens meine fehlerbeschreibung gut^^
danke nochmal

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.