IO Port mit polling auslesen

Gast #4999765
Hallo,

Ich habe momentan folgende Aufgabe zu lösen.
An einem IO Port kommt ein Signal an. Das Signal hat 3 unterschiedliche 
längen. 1ms 1,5ms 2ms. Bei 1ms soll nur IO port '1' gesetzt werden. bei 
2ms soll nur IO port'2' gesetzt werden. Bei 1,5ms passiert nichts. Hat 
jemand eine Idee wie man so etwas in C programmiert in einem pic 16F630.

Grüße Karl-Heinz
Gast
Interrupt on Change Event für den Eingang parametrieren, Flanke zu High 
-> Zeitpunkt speichern, Flanke zu Low -> Länge auswerten und 
entsprechenden Ausgang setzen.
Gast
Ich bin durchaus kein fauler Schüler (bin 59 Jahre alt).
Ich will das in meiner Freizeit erlernen und würde so etwas für mein 
Hobby Schiffs-Modellbau brauchen.
Da ich gerne weiß was da in solch einem Pic abläuft.

Ihr habt ja recht das man kein fertiges Listing haben kann, aber verbal 
alle Leute so schäbig zu behandeln finde ich jetzt nicht gut.

Werde mich aus diesem Forum verm. abmelden.

Grüße
Karl-Heinz
Zeidler schrieb:
> Ich will das in meiner Freizeit erlernen
Das ist gut.
Zeidler schrieb:
> Hat jemand eine Idee wie man so etwas in C programmiert in einem pic 16F630.
Das neigt dazu, fehlinterpretiert zu werden, da das für 'Eingeweihte' 
eigentlich nur eine Art Fingerübung ist. Überhaupt kein Hexenwerk!

Deshalb also:
- Kannst du 'C' oder eine andere Programmiersprache? (So leidlich 
reicht)
- Schon mal was von einem Programmablaufplan gehört?

-> Zeichne dir einen schematischen Ablauf. Den kann man dann Punkt für 
Punkt abarbeiten und fragen, wenn was unklar ist.

PS:
und lies dir deine Frage, wenn alles läuft, in einem Jahr noch mal 
durch...
Gast
Zeidler schrieb:
> Das Signal hat 3 unterschiedliche längen. 1ms 1,5ms 2ms.
> Bei 1ms soll nur IO port '1' gesetzt werden. bei 2ms soll nur
> IO port'2' gesetzt werden. Bei 1,5ms passiert nichts.

Genau wirst du diese Zeiten mit keiner Fernsteuerung treffen. Statt 
irgendwelcher diskreten Werte solltes du immer auf Intervalle prüfen. 
Deine Beschreibung lässt völlig offen, wie sich das Programm bei 
anderen, außer deinen drei genannten Zeiten, benehmen soll.
Gast
Georg schrieb:
> Wenn du in C programmierst, wirst du das nicht erfahren.

Angeblich soll es Entwicklungsumgebungen geben, die einem beim Debuggen 
sogar erlauben, das erzeugte Programm im Einzelschrittmodus laufen zu 
lassen und jede Änderung von Registerwerten anzeigen. Mehr Einblick in 
die Dinge, die da wirklich im µC passieren, gibt es doch fast nicht ;-)
Gast
Hallo Herr Zeidler,

vielleicht hilft Ihnen dieser Ansatz,
über einen Timer mit 200µs wird regelmäßig das Pin abgefragt.

1) ist es eine fallende Flanke, beginnt die Messung (Start-Zustand).
2) ein Zähler wird so lange um 1 erhöht (Run-Zustand),
bis die steigende Flanke erkannt wird (Start-Zustand).
3) der Zählerwert wird mit 5 Intervallen abgeglichen:

a) 0 <= count < 4 --> error lower
b) 4 <= count < 7 --> 1ms
c) 7 <= count < 9 --> 1,5ms
d) 9 <= count < 12 --> 2ms
e) 12 <= count < oo --> error upper

Damit hätte man dann ein Ereignissystem, aus diesem leitet man die 
weiteren Aktivitäten ab, z.B. auch Zustandsänderungen von I/O Portpins 
und Fehlerzustandsverarbeitung.
Gast
Karl M. schrieb:
> vielleicht hilft Ihnen dieser Ansatz,

Nein nein, Karl-Heinz wollte ja eine Lösung auf dem
Silbertablett geliefert bekommen, nicht so ein verbales
Herumprogrammieren.

Zeidler schrieb:
> Hat jemand eine Idee wie man so etwas in C programmiert
> in einem pic 16F630.

Ausserdem hat er sich bereits beleidigt zurückgezogen (das
ist schon eine mittlere Drohung ...)

Zeidler schrieb:
> Werde mich aus diesem Forum verm. abmelden.

Obwohl er noch gar nicht angemeldet war ....
Gast
Zeidler schrieb:

>  aber verbal
> alle Leute so schäbig zu behandeln finde ich jetzt nicht gut.

IMHO hast genau die Ansprache bekommen die du verdienst: Direkt und ohne 
Schnörkel.

> Werde mich aus diesem Forum verm. abmelden.

Dazu musstest du dich erst mal anmelden...
Gast
Das Programm ist jetzt fertig.
Hat mich viel schweiß und Nerven gekostet.
Zum einen da ich gar keinen Ansatz hatte wie so etwas zu Realisieren 
ist, und zum zweiten, da ich mir sehr schwer tat mit manchen 
Begriffsdefinitionen und dem Handling der Befehlsstruktur.

Aber alles halb so wild .... jetzt geht es ja.
Das Programm habe ich unten aufgelistet, falls es einen Interessiert.

Im übrigen, warum ich als Gast erscheine weiß ich nicht. obwohl ich 
einen Account habe.


while(1)                   // Hauptschleife
 {
     if (WTA1 == 0){
      zaehler();
    }else if (WTA1 == 1){
      auswertung();
    }
  }
}

void zaehler (count) {
     if (WTA1 == 0){
     count +=1;
     } else if (WTA1 == 1){
     }
}

void auswertung(void){
     if (count == 0){
      LED0 = 0;
     } else if( count >=115){
      LEDl = 0,LEDm = 0,LEDh = 1;
     } else if( count >=75){
      LEDl = 0,LEDm = 1,LEDh = 0;
     }  else if(count >=35){
      LEDl = 1,LEDm = 0,LEDh = 0;
     }
     count = 0;
}
Account "haben" und sich anmelden sie 2 Paar Stiefel.
Vielleicht bist einfach nur nicht angemeldet?

Das sieht man ja bei der Erfassung eines Textes recht schön, ob man als 
Gast schreibt oder als angemeldeter Benutzer.

Freut mich dass Deine Software läuft.

Grüße

Bernhard
Gast
Ich habe mich schon öfters versucht mit dem LOGIN anzumelden.
Aber ich bekomme keine Fehlermeldung aber auch keine Bestätigung das ich 
nicht oder doch Angemeldet bin. An was kann das liegen.

Ich sehe auch jetzt, beim schreiben dieser Nachricht, ob ich als Gast 
diesen Artikel schreibe.

Gruß
Zeidler
Gast
Hallo Karl-Heinz,

ich vermute, Du hast Deinen Code so nicht durch den Compiler bekommen, 
sondern uns eine ähnliche/modifizierte Version angeboten. Macht aber 
nix, wir sollen ja darin keinen Fehler suchen.

Gestatte einen Vorschlag, es kompakter und zugleich lesbarer zu 
gestalten (lesbarer, weil die count-Variable nur noch in der 
while-Schleife verändert wird).

while(1)                  // Hauptschleife
{
  if (WTA1 == 0){         // zu messender Puls liegt an (LOW-aktiv)
    count++;              // Dauer hochzaehlen
  }else{
    auswertung(count);    // Setzen der Ausgaenge je nach Pulslaenge
    while ( WTA1 == 1 );  // Warten, bis Eingang wieder auf 0 geht
    count = 0;            // Zaehler fuer Pulslaenge zuruecksetzen
  }
}

void auswertung(int count){
     if (count == 0){
      LED0 = 0;
     } else if( count >=115){
      LEDl = 0,LEDm = 0,LEDh = 1;
     } else if( count >=75){
      LEDl = 0,LEDm = 1,LEDh = 0;
     }  else if(count >=35){
      LEDl = 1,LEDm = 0,LEDh = 0;
     }
}


Noch netter (meine Meinung) wird es mit einer weiteren while-Schleife:

while(1)                // Hauptschleife
{
  while (WTA1 == 0)     // zu messender Puls liegt an (LOW-aktiv)
    count++;            // Dauer hochzaehlen

  auswertung(count);    // Setzen der Ausgaenge je nach Pulslaenge
  while ( WTA1 == 1 );  // Warten, bis Eingang wieder auf 0 geht
  count = 0;            // Zaehler fuer Pulslaenge zuruecksetzen
}

Gruß Jens

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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.