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