Hallo, ich will gern mit Meag8 per Software PWM 4 langsame (ca. 2-10Hz) Signale ausgeben, die sollten Phasenverschoben ausgegeben werden, im Moment laufen alle synchron, wie krieg ich die Phasenverschiebung rein??? Danke
indem du die PWM versetzt auf die einzelnen Kanäle anwendest. Dein PWM Counter läuft von 0 bis 127. Ob du einen PWM Ausgang einschaltest, wenn der PWMCounter im Bereich 0 bis 30 liegt, oder ob du ihn einschaltest, wenn der PWMCounter im Bereich 30 bis 60 liegt, ändert nichts am Puls/Pause Verhältnis. Aber die Phase verschiebt sich.
Ich wüsste nicht, was der Z-Pointer damit zu tun haben soll (Übrigens hast du einen Fehler in deiner Z-Pointer Verwendung) Der Z-Pointer wird doch nur dazu benutzt um aus dem Speicher den korrekten Grenzwert zu holen. Das hat doch nichts damit zu tun, ab welchem PWMCounter Wert der Ausgang auf 0 oder 1 geschaltet wird. So wie es momentan läuft, schaltest du die Eingänge immer bei einem Counter Wert von 0 auf 1. Das kann dann nicht mehr so bleiben.
Also irgendwie häng ich da jetz, wär des großer Aufwand des schnell in den code reinzuschreiben, wie das funktionieren soll? mfg Bohb
Martin wrote:
> Hinweis: Stackpointer erst das SPH Register beschreiben, danach das SPL
Nö, die Reihenfolge ist egal.
Der Aufwand ist gar nicht mal so gross. Ich würde das so machen, dass ich den PWMCounter für die Vergleiche manipuliere. Im Grunde läuft es darauf hinaus, 4 PWMCounter zu haben, die jeweils um 32 versetzt laufen. Dadurch hat jede PWM einen anderen 0-Durchgang und damit eine andere Phase. 32 deshalb, weil der PWM Counter bis 127 läuft, also 128 Stufen hat. Dividiert durch 4 macht also einen Versatz von 32 für jeden Kanal.
1 | WorkPWM: |
2 | mov r18, PWMCount |
3 | ldi temp, 0b11110000 ; 0 .. Led an, 1 .. Led aus |
4 | |
5 | cp r18, pulse_width_1 ; Ist der Grenzwert f?s 1 erreicht |
6 | brlt OneOn |
7 | ori temp, 0x01 |
8 | |
9 | OneOn: |
10 | subi r18, -32 ; PWMCounter + 32 |
11 | andi r18, 0x7F ; Modulo 128 |
12 | cp r18, pulse_width_2 ; Ist der Grenzwert f?s 2 erreicht |
13 | brlt TwoOn |
14 | ori temp, 0x02 |
15 | |
16 | TwoOn: |
17 | subi r18, -32 ; PWMCounter + 64 |
18 | andi r18, 0x7F ; Modulo 128 |
19 | cp r18, pulse_width_3 ; Ist der Grenzwert f?s 3 erreicht |
20 | brlt ThreeOn |
21 | ori temp, 0x04 |
22 | |
23 | ThreeOn: |
24 | subi r18, -32 ; PWMCounter + 96 |
25 | andi r18, 0x7F |
26 | cp r18, pulse_width_4 ; Ist der Grenzwert f?s 4 erreicht |
27 | brlt SetBits |
28 | ori temp, 0x08 |
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.