hallo,
ich habe folgendes problem mit dem timer3 vom Atmega128,
und zwar möchte ich an OC3A pin3 porte eine pwm ausgeben,zurzeit ist
eine
led angeschlossen,aber egal welchen wert ich in ocr3 reinschreibe die
led leuchtet immer.
die led sollte eigendlich gesimmt werden,
vielleicht kann mir jemand weiterhelfen
;Port E = Ausgang
ldi r16, 0xFF
out DDRE, r16
ldi r16,low(1600) ;Teilerwert für Timer3a
ldi r17,high(1600) ;laden
sts ocr3ah,r17
sts ocr3al,r16 ;und setzen (H zuerst)
ldi r16,(1<<com3a1)|(1<<wgm30) ;
sts tccr3a,r16 ;setzen
ldi r16,(1<<wgm32|1<<cs32)
sts tccr3b,r16 ;setzen
ldi r16,1<<ocie3a ;Interrupt bei OutputCompareA
sts etimsk,r16 ;für Timer3 aktivieren
sei ;interrupts freigeben
TIM3_COMPA:
in sregtemp, sreg ;Sreg sichern
push xl
push xh ;
lds xl,ocr3al
lds xh,ocr3ah
subi xl,low(-1000)
sbci xh,high(-1000)
sts ocr3ah,xh
sts ocr3al,xl
pop xh
pop xl
out sreg, sregtemp ;Sreg wiederherstellen
reti
mfg
Hi
>ldi r16,(1<<com3a1)|(1<<wgm30) ;>sts tccr3a,r16 ;setzen>ldi r16,(1<<wgm32|1<<cs32)>sts tccr3b,r16 ;setzen
wgm32=1 und wgm30=1 ergibt eine Fast PWM, 8-bit
MfG Spess
das ist erstmal die mainloop nur zum testen,
ldi r17,0
ldi r16,0
sts ocr3ah,r17
sts ocr3al,r16 ;und setzen (H zuerst)
ldi r16,255
main:
dimm:
dec r16
sts ocr3al,r16
brne dimm
rjmp main
aber so flackerts nur
vielleicht könnte mir jemand helfen wie ich den timer richtig einstelle
damit auch das dimmen
Hi
>aber so flackerts nur>dimm:>dec r16>sts ocr3al,r16>brne dimm
Diese Schleife wird in 255 von 256 Fällen in 4 Takten durchlaufen.
main:
dimm:
....
brne dimm
rjmp main
macht beim 256. mal 5 Takte.
Der OCR-Wert wird aber bei deiner Einstellung nur alle 256*256 = 65536
Takte (8Bit PWM und Vorteiler 256) übernommen.
MfG Spess
hallo,
vielen dank für das beispiel das haut hin:).
so nun hab ich das dimmen mal mit einer tabell versucht das funktioniert
einiger maßen,aber wenn ich in der Mainloop noch andere dinge tun möchte
funktionierts nicht , irgendwie kommt der nicht aus der isr heraus an
was kann das den liegen
mfg
Hi
>irgendwie kommt der nicht aus der isr heraus an>was kann das den liegen.
Na was denkst du den?
Der Interrupt wird ein mal während einer PWM-Periode aufgerufen. Dafür
gilt genau ein OCR-Wert. Du gibst aber in dieser Zeit 32 Werte an das
OCR-Registen aus. Und beim nächsten Interrupt das gleiche. Ich habe es
jetzt nicht nachgerechnet, aber es kann sein, das durch die Schleife der
Interrupt so lang geworden ist, das sich Interrupts überschneiden.
Mfg Spess
Hi
Ich habe dein 'Programm' mal etwas überarbeitet (nicht getestet). Wenn
es funktioniert, erklärst du mir warum.
Noch was:
1. Finger weg von der Tabulatortaste!
2. Wenn die Anzahl der Werte einer db-Direktive kein Vielfaches von 2
sind,
hängt der Assembler eine Null dran. Hast du beim Assemblieren die
Warnungen nicht bemerkt?
MfG Spess
Hallo,
so ich habs mal getestet,in der mainloop blockiert die schleife somit
kann ich keine anderen aufgaben machen,
so ich habs nochmal anders versucht aber auch hier kann ich kein
richtigen dimmen erkennen
vielleicht hat nich jemand eine idee
mfg
OCR3_B_L ?
Außerdem ist immer noch diese unsinnige Schleife in der ISR. Du musst in
der ISR nur einen Wert nach OCR3A schreiben, nur halt bei jedem
Interrupt den jeweils nächsten aus der Tabelle. Oder noch sinnvoller:
nach einer angemessenen Zeit, denn sonst wirst du keine Änderung der
Helligkeit wahrnehmen können. Das verschmilzt sonst für das Auge zu
einem Durchschnittswert.