Forum: Mikrocontroller und Digitale Elektronik PIC 16F690 Signal einlesen und dann verlängern


von marcel e. (etti1993)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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

von heinzhorst (Gast)


Lesenswert?

Wozu dafür ein Mikrocontroller? Warum nicht einfach ein nachtriggerbares 
Monoflop, z.B. 74HC123?

von dave_chappelle (Gast)


Lesenswert?

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
          }

von dave_chappelle (Gast)


Lesenswert?

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 -> }

von Martin (Gast)


Lesenswert?

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

von dave_chappelle (Gast)


Lesenswert?

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.

von marcel e. (etti1993)


Lesenswert?

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

von dave_chappelle (Gast)


Lesenswert?

Ist es denn ein regelmässiges Signal?
Oder sind es unterschiedliche Rechtecke?

von marcel e. (etti1993)


Lesenswert?

unterschiedliche
es ändert sich sowohl die frequenz als auch die länge des high pegels 
daher kann ich keine feste zeit programmieren

von ??? (Gast)


Lesenswert?

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???

von dave_chappelle (Gast)


Lesenswert?

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?

von dave_chappelle (Gast)


Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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.

von dave_chappelle (Gast)


Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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

von dave_chappelle (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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

von anfaenger (Gast)


Lesenswert?

Ja dann lässt du sie weg :)

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.