PIC 16F690 Signal einlesen und dann verlängern

#2385819
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
Gast #2385916
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
Gast #2385966
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
          }
Gast #2386021
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
Gast #2387038
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.
Gast #2387148
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???
Gast #2387214
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?
Gast #2388558
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.
Gast #2388567
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?
Gast #2388608
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
Gast #2388617
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren