www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer3 Atmega128


Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Status hat die M103C-Fuse?

Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
deaktiviert

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Das ist aber nicht dein komplettes Programm? Oder?

MfG Spess

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: neuling (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: neuling (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.