PIC 16F690 Signal einlesen und dann verlängern

OP #2385819
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
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
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
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 -> }
Gast
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
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
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
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?
Gast
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.