Forum: Mikrocontroller und Digitale Elektronik Problem mit Z-Pointer


von Bohb (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bohb (Gast)


Lesenswert?

Kann ich das evtl. auch über die Adressierung mit dem Z-Pointer lösen?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bohb (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Hinweis: Stackpointer erst das SPH Register beschreiben, danach das SPL

von Johannes M. (johnny-m)


Lesenswert?

Martin wrote:
> Hinweis: Stackpointer erst das SPH Register beschreiben, danach das SPL
Nö, die Reihenfolge ist egal.

von Karl H. (kbuchegg)


Lesenswert?

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

von Bohb (Gast)


Lesenswert?

Danke, werd ich mal so versuchen

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.