Timer3 Atmega128

Gast #1568411
Lesenswert?

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
Gast #1568455
Lesenswert?

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
Gast #1568472
Lesenswert?

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
Gast #1571177
Lesenswert?

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
Angehängte Dateien:
Gast #1571274
Lesenswert?

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
Gast #1571327
Lesenswert?

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
Angehängte Dateien:
#1587189
Lesenswert?

1
sts  OCR3BL, r16
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren