Forum: Mikrocontroller und Digitale Elektronik PWM mit Capcom2, Timer8, undefinierter Null-Wert, XC164CS


von Anton M. (manser)


Angehängte Dateien:

Lesenswert?

Hallo, ich simuliere mit uVision2, ein PWM Signal.

Timer8 ist im Compare Mode3 geschaltet und an Port9 wird ein PWM
Signal ausgegeben.

In der Simulation funktioniert dies, das heisst im Beispiel, siehe
Anhang, ist Port9 abwechselnd, auf Low oder mit PWM50%.

Wenn ich das Programm jedoch zum Beispiel auf einem Phytec Board
betreibe, verhält sich Port9 unregelmässig.

Port9 wechselt nun 2 bis 3x auf Low, danach 2 bis 3x High usw.
(immer abwechselnd mit PWM50%)

Mit Channel 16 = 0x0000, schaltet also Port9 zeitweise
auf Low und zeitweise auf High.

Würde mich freuen wenn mit jemand den Ablauf für dieses
Verhalten erklären kann.

Danke zum Voraus.

A.M.

von TManiac (Gast)


Lesenswert?

Hi Anton,

ich glaube du bringst da was durcheinander.
Die PWM läuft, wenn sie einmal initialisert ist ohne Softwareeingriff 
konstant durch.
Du änderst dein Tastverhälniss der PWM regelmäßig mit:
1
CC2_CC16 = 0x7D00;
 -> ca 50& PWM (genau sind es 48,8%)
bzw
1
CC2_CC16 = 0x0000;
 -> 0% PWM

Und da diese Änderung nicht mit der PWM synchron läuft siehst du eben 
mal zwei und mal drei PWM-Wechsel.

Wenn du also konstant 50% PWM haben willst, lässt du die 0x7D00 im 
CC2_CC16 Register stehen. Wenn du dann später die PWM rauf und runter 
regeln willst, kannst du das ganz bequem über dieses Register machen.

Was hattest du mit dem Wechesl eigentlich vor?

Gruß,
TManiac

von Anton M. (manser)


Lesenswert?

Hallo TManiac,

danke für deine Antwort.
Das Tastverhältniss wechsle ich, zur Demostration des Fehlers.

Mit dem Beispiel im Anhang, verhält sich Port9 (Pin Out 9), zum Beispiel
an einem Phytec Board, nach dem Start wie folgt:

1.  Start, Low Signal, PWM 0%, 0 Volt,

2.  nach  3 Sekunden, PWM 48.8%,
3.  nach  6 Sekunden, PWM 100%, High Signal, 5 Volt,
4.  nach  9 Sekunden, PWM 48.8%,
5.  nach 12 Sekunden, PWM 100%,
6.  nach 15 Sekunden, PWM 48.8%,

7.  nach 18 Sekunden, PWM 0%,
8.  nach 21 Sekunden, PWM 48.8%,
9.  nach 24 Sekunden, PWM 0%,
10. nach 27 Sekunden, PWM 48.8%,
11. nach 30 Sekunden, PWM 0%,
12. nach 33 Sekunden, PWM 48.8%,

13. nach 36 Sekunden, PWM 100%,
14. nach 39 Sekunden, PWM 48.8%,
15. nach 42 Sekunden, PWM 100%,
16. nach 45 Sekunden, PWM 48.8%,
17. nach 49 Sekunden, PWM 100%,
18. nach 52 Sekunden, PWM 48.8%,

19. nach 55 Sekunden, PWM 0%,

20. ... und so weiter

Wenn ich das Programm jedoch mit uVision2 simuliere,
zeigt Port9 (Pin Out 9), folgenden Ablauf:

1.  Start, Low Signal, PWM 0%

2.  nach  2 Sekunden, PWM 48.8%,
3.  nach  4 Sekunden, PWM 0%,
4.  nach  6 Sekunden, PWM 48.8%,
5.  nach  8 Sekunden, PWM 0%,
6.  nach 10 Sekunden, PWM 48.8%,

7.  nach 12 Sekunden, PWM 0%,
8.  nach 14 Sekunden, PWM 48.8%,
9.  nach 16 Sekunden, PWM 0%,
10. nach 18 Sekunden, PWM 48.8%,
11. nach 20 Sekunden, PWM 0%,
12. nach 22 Sekunden, PWM 48.8%,

13. ... und so weiter

Gruss
A.M.

von TManiac (Gast)


Lesenswert?

Hi Anton,

Wie ich schon sagte. die CapCom arbeitet völlig asynchron zum Program. 
Auch wenn es in der Simulation so aussehen mag als würde das gehen, 
heißt das noch lange nicht, dass es in Wirklichkeit auch so ist. Daher 
heißt es ja auch Simulation. Im PC steckt nun mal kein echter Controller 
drin.

Gegenfrage: Stimmen die Frequenzen in der Simulation auch mit denen auf 
dem Board überein? -> Ich vermute eher nicht.
Wie sehen die Ergebnisfrequenzen deiner PWM aus? sind die in Simulation 
und real gleich? Du sprichst ja immer nur vom Tastverhältnis.

Aber um mal weiter zu helfen:
Du stellst
1
 CC2_M4         =  0xFFFF;      // load CAPCOM2 mode register 4
ein. Damit Konfigurierst du übrigens gleich 4 CapCom Kanäle auf :
> Compare Mode 3: Set Output Pin on each Match Reset output pin on each
> timer overflow; only one interrupt per timer period.

Also kann es tatsächlich passieren, dass du die PWM mal im High und mal 
im Low Zustand abschaltest.

Gruß,
TManiac

von Anton M. (manser)


Lesenswert?

Hallo TManiac,

du schreibst die CapCom arbeitet völlig Asynchron zum Programm.

Wenn ich das richtig verstehe, meinst du, das wenn ich im Programm das 
Tastverhältnis mit CC2_CC16 ändere, dies nicht Synchron zum Timer 8 
passiert.

Dies sollte jedoch kein Problem sein, da ein neu gesetzter CC2_CC16 
Wert, spätestens beim nächsten Timer 8 Überlauf, übernommen wird, also 
lange bevor in meinem Beispielprogramm der CC2_CC16 Wert ein weiteres 
mal gesetzt wird.

Auf dem Phytec Board vergehen 3 Sekunden, bis ein neuer Wert gesetzt 
wird und am Port 9 ausgegeben wird.
Die eingestellte Timer 8 Overflow Zeit beträgt 3.28 ms.

> Compare Mode 3: Set Output Pin on each Match Reset output pin on each
> timer overflow; only one interrupt per timer period.

-> Heisst für mich, das der Output bei Übereinstimmung von Timer 8 mit
   CC2_CC16, auf High gesetzt wird und nach dem Timer 8 Überlauf der
   Output auf Low gesetzt wird.

Sehe ich das alles richtig so?

Ich verstehe aber nicht, wie zeitweise ein permanentes High (5V, während 
3 Sek.) an Port 9, Pin 0, entstehen kann, obwohl CC2_CC16 im Programm 
nie auf zum Beispiel 0x0001 gesetzt wird.

Der Fehler tritt auch auf, wenn ich CC2_CC16 mit einem Timer 8 Interrupt 
neu setze, ich weiss aber nicht genau ob dies der richtige Weg ist um
zum Beispiel eine bessere Stabilität zu erreichen?

Was genau meinst du mit den gleichen Frequenzen in der Simulation und 
auf dem Board?

- In der Simulation und auf dem Board wird das gleiche Beispielprogramm
  verwendet.

- Im Compiler ist die gleiche Clock-Frequenz (8MHz) eingestellt, wie
  der Quarz (8MHz) hat, der auf dem Board vorhanden ist.

- Die gemessene Frequenz (PWM50%) vom Tastverhältnis beträgt 3.2 ms
  (gemessene Zeit zwischen zwei Low-auf-High-Flanken)

In der Simulation zeigt die CAPCOM 2 Unit, das CC2_CC16 abwechselnd auf 
0x0000 und 0x7D00 gesetzt wird.
Timer 8 läuft von 0x0000 bis 0xFFFF, das T8REL Register zeigt 0x0000, 
Compare Mode 3 wird angezeigt.
Timer 8 hat ein Input Prescaler von 1.
CPU Clock beträgt 20 MHz.

In der Simulation, wechselt Parallel Port 9 von Low auf Pulsierend, dann 
wieder auf Low usw.

CC2_M4 habe ich auf 0x000F geändert.
-> Port 9, Pin 0, auf dem Board verhält sich noch gleich wie weiter oben
   im Thread beschrieben.

Gruss
A.M.

von TManiac (Gast)


Lesenswert?

Ich muss gestehen, dass ich auch etwas falsch gedacht hatte, aber rein 
von der Theorie her würde ich erwarten dass du wenn CC2_CC16=0x0000 ist 
nur High-Pegel sehen solltest.
Lass mich die Erklärung schritt weise durchgehen:

Angenommen der Timer steht auf 0xFFFF.
Nun wird eins drauf gezählt. -> Der Timer erkennt den Overflow
Es wird der Pegel auf Low gesetzt. Und der Timer wird mit 0x0000 neu 
geladen. Alles in einem Zyklus.
Die Gleichheit des Timers mit dem CC2_CC16 Register kann nun im nächsten 
Zyklus das Setzen des Ausgangs-Pins bewirken. Du weißt also nicht was zu 
erst eintrifft, das Hochzählen (von 0x0000 zu 0x0001) oder das Erkennen, 
dass der Timer gleich dem CCC2_CC16 (=0x0000) ist. Zoom mal in dein Oszi 
in die Messung rein ob du bei High-Pegel ganz kleine Negativ-Peaks 
siehst.

Und genau dabei spielt die Asynchronität rein. Du weißt nicht an welcher 
Stelle dein Program zum Overflow Zeitpunkt steht. Auch wenn fast alle 
Befehle des XC164 in einem Zyklus abgearbeitet werden, so hast du Pech 
(oder Glück), wenn genau zum Überlauf ein Jump im Programm ausgeführt 
wird. Weil ein Jump leider mehr als einen Zyklus braucht. Wenn der Jump 
also beirkt, dass der Timer = 0x0000 kein Compare erkennt, dann bleibt 
dein Pegel auf Low.

Du kannst die CapCom im Mode 3 nicht sicher mit 0x0000 abschalten. 
Besser wäre auf 0xFFFF zu setzen, dann wäre zwar noch ein kurzer 50ns 
High-Puls da, der sollte aber die wenigsten Schaltungen stören. Oder 
noch Besser man disabled per CC2_Mx. Daher gibt es ja diese Option.

zu den zwei Sekunden und drei Sekunden:
Ok es ist im Simulator genauso 8MHz Quarz eingestellt, wie auf dem 
Board. Aber wo hast du den CPU-Takt eingestellt? Im angegebenen Code 
steht es nicht drin. Die PLL kann durch externe Beschaltung am Port0 
(vor-)eingestellt werden. Wenn das genutzt wird, musst du die Pegel im 
Simulator auch voreinstellen, bevor du die Simulation startest. Der 
XC164 hat doch schon JTAG, bzw OCDS vergleiche mal die Inhalte vom 
RSTCFG - Register (Simulation vs Board). Wenn das nicht geht, dann 
vergleich wenigstens den Pegel am /EA-Pin. Wenn dieser nämlich auf 
Low-Pegel liegt (was im Sim default sein dürfte) wird nur mit 
Multiplikator 2 gestartet. Um aber die 20MHz aus den 8MHz Quarz zu 
machen brauchst du nen 2,5 Multiplikator. (wobei dan müsste aber die Sim 
2,4s für das Ändern des CCC2_CC16 brauchen, hmmm komisch)
Auf dem Board scheinen die 20MHz ja prima zu stimmen wenn du bei der PWM 
ein Zykluszeit von 3,2ms (ist eine Frequenz 312,5Hz) gemessen hast. 
Zeigt der Simulator (ich arbeite wenn dann mit Tasking und ohne Sim) 
evtl dir auch die PWM-Frequenz? Ich würde den Fehler im Sim vermuten.

Gruß,
TManiac

von Anton M. (manser)


Lesenswert?

Ich vermute auch, dass das Problem in der Reihenfolge der Abarbeitung 
bzw. der Asynchronität ist.

Der EA-Pin auf dem Board ist offen.

Der CPU-Takt ist im Startfile auf 20 MHz konfiguriert.

Wenn ich das Programm starte, ist erst einmal ein Low Pegel an P9.0 und 
auf dem Oszi ist kein Peak vorhanden.

Nach 3 Sek. wird PWM50% ausgegeben.

Nach 6 Sek. ein High Pegel an P9.0 und auf dem Oszi ist kein Peak 
vorhanden.

Wenn ich CC2_CC16 = 0x0001 anstelle von 0x0000 konfiguriere ist an P9.0 
ein High Pegel und auf dem Oszi ist ein kleiner Peak.

Weiter habe ich festgestellt, dass das stellen von P9.0 davon abhängig 
ist, welcher Wert in CC2_CC16 vor dem erneutem stetzen, eingestellt war. 
Wenn es ein Wert von 1 bis ca. 30000 war, wird P9.0 auf High geschaltet, 
wenn es ein Wert von 65535 bis ca. 34000 war, wird auf Low geschaltet. 
Vorausgesetzt, CC2_CC16 wird auf 0x0000 gestellt.

Im Manual steht:
when compare value and reload value for a channel are equal the 
respective interrupt requests will be generated, only the output signal 
is not changed (set and clear would coincide in this case).

Note: If the port output latch is written to by software at the same 
time it would be altered by a compare event, the software write will 
have priority. In this case the hardwaretriggered change will not become 
effective.

In order to use the respective port signal as compare signal output 
signal CCyIO for compare register CCy in compare mode 3 this port signal 
must be configured as output, i.e. the corresponding direction control 
bit must be set. With this configuration, the initial state of the 
output signal can be programmed or its state can be modified at any time 
by writing to the port output latch.

Wenn ich nun nach dem setzen von CC2_CC16 = 0x0000, CC2_OUT auf 0x0001 
setze, funktioniert es auf dem Board richtg.
P9.0 wechselt zwischen PWM50% und High-Pegel. Es entsteht also kein Low 
Pegel mehr, ausser beim Programmstart.

In der Simulation mit uVison2 jedoch wechselt P9.0 von PWM50% auf Low. 
Es entsteht nie ein High Pegel an Pin9.0

Gruss
A.M.

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.