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