Hallo Ich will ein Rechtecksignal mit meinen PIC16F690 einlesen und dann den High Pegel bereich um einen bestimmten bereich verlängern. Das große problem ist das ich nicht weiß wie ich ein PWM Programmier und auch nicht wie ich das rechtecksignal einlesen soll. Das einzige was ich weiß ist wie man einen ADC Pogrammiert ich will das ganze in C programmieren Danke
Hallo Marcel, um das beschriebene Problem einfach zu lösen würde ich einfach mit einem PIN das Signal Digital einlesen, wenn es auf high geht setzt Du einen Digitalen Ausgang auf high. Je nach gewünschter Pulsverlängerung machst Du den Ausgang Abfallverzögert zB 1ms. Den PWM Ausgang brauchst Du für diese Anwendung nicht unbedingt. Codemässig könnte das etwa so aussehen (ka wie der Syntax genau ist): 1 IF (PIN_SIGNAL == 1) THEN SET PIN_OUTPUT HIGH WHILE (PIN_SIGNAL==1) WEND PAUSE_1ms SET PIN_OUTPUT LOW GOTO 1
Also das sähe etwa so aus (der Einfachheit halber ein Pin als "Eingang" und einer aus "Ausgang" definiert..)
1 | while (1){ |
2 | |
3 | if (Eingang == 1) { |
4 | Ausgang = 1; |
5 | while (counter > x){ //x -> Länge der Zeitverzögerung |
6 | counter ++; } |
7 | Ausgang = 0; |
8 | }
|
9 | }
|
ah.. der counter sollte noch zurückgesetzt werden.. also vor
1 | Ausgang = 0; |
schreibst du einfach noch ein
1 | counter = 0; |
.. natürlich nach der Klammer -> }
hallo dave, wenn ich deinen code richtig interpretiere bin ich nicht einverstanden: dieser generiert einen Puls mit bestimmter Länge sobald am Eingang eine 1 ist. Es geht aber darum einen bestehenden Puls zu verlängern. Ausserdem macht in der Schlaufe "while counter > x" keinen Sinn wenn Du counter erhöhst, ausser Du wartest auf einen Überlauf der variable counter. Grüsse martin
Ok ignorier das bitte, das sollte natürlich counter < x heissen. Martin schrieb: > dieser generiert einen Puls mit bestimmter Länge sobald am Eingang eine > 1 ist. Es geht aber darum einen bestehenden Puls zu verlängern. Eingang: ____|--|_____|--|_____|--|_____|--|_____|--|_____|--|_____ Ausgang: ____|----|___|----|___|----|___|----|___|----|___|----|___ Genau das, was es sollte, oder nicht? Ausser natürlich, dass Signal, welches er "verlängern" will ist kein digitales aber dann macht es auch keinen Sinn mit einem µC zu arbeiten.. (tut es sowieso nicht meiner Ansicht nach.) Ein bisschen mehr Infos vom Threadsteller wären schon ganz hilfreich.
danke für die vielen antworten. das programm ist schon mal ein anfang ich würd nur gerne das signal immer um z.b 10% verlängern. danke
Ist es denn ein regelmässiges Signal? Oder sind es unterschiedliche Rechtecke?
unterschiedliche es ändert sich sowohl die frequenz als auch die länge des high pegels daher kann ich keine feste zeit programmieren
marcel ettenauer schrieb: > das programm ist schon mal ein anfang ich würd nur gerne das signal > immer um z.b 10% verlängern. Heißt das jetzt, dass zuerst die Pulslänge ausgemessen werden soll und daraus dann berechnet werden muß, wie lang die Verlängerung ist? Oder sind alle Pulse gleich lang und man kann eine fest Zeit als Verlängerung ansetzen. Vielleicht verrätst du mal, in welchem Zeitbereich sich das ganze abspielt? ns .. s .. min .. d???
Ja auch in diesem Fall kannst du auf PWM verzichten denke ich.. Das Programm wird dadurch leicht länger. Weisst du ca. wie du so etwas zu programmieren hast?
Und weil ich gerade Zeit hatte:
1 | while (1){ |
2 | |
3 | while (Eingang == 1){ |
4 | if (Eingang == 1){ |
5 | Zähler ++; } |
6 | Ausgang = 1; } |
7 | |
8 | Zähler = Zähler / x; |
9 | |
10 | while (Zähler > 0){ |
11 | Ausgang =1; |
12 | Zähler --; } |
13 | |
14 | Zähler = 0; |
15 | |
16 | }
|
Zur Erklärung: Die Variable x dient der Einstellung der Verlängerung.. willst du beispielsweise 10% Verlängern gibst du eine 10 ein... willst du 20% verlängern gibst du eine 5 ein etc.. Ist das so verständlich?
Hallo, das gefällt mir nicht: Ausgang wird nicht zurückgesetzt beim Einstellen der Verlängerung müssen zwei Dinge beachtet werden: -Der Prozessor hat für das abarbeiten der Schleife wo der Zähler erhöht wird kaum genau gleich lang hat wie für die Schleife wo er verkleinert wird. -Wenn der Zähler durch x geteilt wird weiss ich nicht was mit dem Rest der Division geschieht.
Na dann..
1 | Ausgang = 0; |
am Ende des Programms. :P Nächstens: Hat der Prozessor länger eine Variable raufzuzählen als runterzuzählen? Martin schrieb: > -Wenn der Zähler durch x geteilt wird weiss ich nicht was mit dem Rest > der Division geschieht. Wie soll ich das verstehen?
Hallo Dave, Hat der Prozessor länger eine Variable raufzuzählen als runterzuzählen? --> Nein, aber deine Schleifen sind unterschiedlich Wenn der Zähler durch x geteilt wird weiss ich nicht was mit dem Rest der Division geschieht. --> Ein beispiel: Der Zähler steht nach dem Signal auf 13 dann kommt Zähler = Zähler / 10; (annahme x=10) ich glaub nicht das der Block: while (Zähler > 0){ (Zähler =1,3) Ausgang =1; Zähler --; } saubere Resultate liefert Grüsse
1 | while (1){ |
2 | |
3 | while (Eingang == 1){ |
4 | if (Eingang == 1){ |
5 | Zaehler ++; } |
6 | Ausgang = 1; } |
7 | |
8 | Zähler = Zaehler / x; |
9 | |
10 | |
11 | while (Zaehler > 0){ |
12 | if (Eingang == 0){ |
13 | Zaehler --; } |
14 | Ausgang =1; } |
15 | |
16 | Ausgang = 0; |
17 | Zaehler = 0; |
18 | |
19 | }
|
Das mit dem Rest der Division ist unter Umständen gar nicht zu beachten oder nicht? Dazu müsste man ja erstmal wissen, wie schnell sein Signal ist. Resp. wie hoch die Frequenz ist.
Hallo, ich weiss ich bin nervig ^^ Die erste IF Schleife ist glaub unnötig? Die zweite IF Schleife unnötig mit Potenzial für Fehler? Grüsse
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.