Forum: Mikrocontroller und Digitale Elektronik Timer3 Atmega128


von neuling (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Welchen Status hat die M103C-Fuse?

von neuling (Gast)


Lesenswert?

deaktiviert

mfg

von spess53 (Gast)


Lesenswert?

Hi

Das ist aber nicht dein komplettes Programm? Oder?

MfG Spess

von Stefan E. (sternst)


Lesenswert?

Was denkst du denn, was dein Code macht, nachdem das sei ausgeführt 
wurde? Und wo wird der Stackpointer initialisiert?

von Stefan E. (sternst)


Lesenswert?

Und wie soll im 8-Bit-Fast-PWM-Modus überhaupt je der Compare-Wert von 
1600 erreicht werden?

von spess53 (Gast)


Lesenswert?

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

von neuling (Gast)


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

von spess53 (Gast)


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

von neuling (Gast)


Lesenswert?

HALLO,
wäre es denn möglich mir das nochmal zuzeigen mit dem time3 ist ja ein 
16bit timer damit ich die led erstmal zum dimmen kriege


mfg

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Teste mal das angehängte Programm. Sollte periodisch innerhalb von 2s 
die Led von 0 auf 100% dimmen. Ist aber nicht praktisch erprobt.

MfG Spess

von neuling (Gast)


Angehängte Dateien:

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

von spess53 (Gast)


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

von spess53 (Gast)


Angehängte Dateien:

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

von neuling (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan E. (sternst)


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.

von neuling (Gast)


Lesenswert?

vielen dank erstmal,
wenn ich nur einen wert in OCR3B schreibe kann ich keine änderung in der 
helligkeit feststellen,

wie macht ihr denn das,

mfg

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.