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
Was denkst du denn, was dein Code macht, nachdem das sei ausgeführt wurde? Und wo wird der Stackpointer initialisiert?
Und wie soll im 8-Bit-Fast-PWM-Modus überhaupt je der Compare-Wert von 1600 erreicht werden?
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, 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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.