Forum: Mikrocontroller und Digitale Elektronik IO Port mit polling auslesen


von Zeidler (Gast)


Lesenswert?

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

: Verschoben durch User
von Tek (Gast)


Lesenswert?

Interrupt on Change Event für den Eingang parametrieren, Flanke zu High 
-> Zeitpunkt speichern, Flanke zu Low -> Länge auswerten und 
entsprechenden Ausgang setzen.

von Ralf G. (ralg)


Lesenswert?

Wenn du hart im Nehmen bist, dann ignorierst du das hier am Besten:
https://www.mikrocontroller.net/articles/Netiquette
(Besonders den Abschnitt "Siehe auch")

Ansonsten zeigt man erstmal, was man schon selbst zu dem Thema geleistet 
hat. Deine Ausführungen sind da etwas dürftig.

von Zeidler (Gast)


Lesenswert?

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

von Ralf G. (ralg)


Lesenswert?

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

von Wolfgang A. (Gast)


Lesenswert?

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.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Allgemein sind die Zustände nicht ganz klar - wann werden die Ausgänge 
wieder abgeschaltet?

Trotzdem denke ich:
Ja, Das kann man mit einem nahezu beliebigem µC erschlagen.

MfG

von Georg (Gast)


Lesenswert?

Zeidler schrieb:
> Da ich gerne weiß was da in solch einem Pic abläuft

Wenn du in C programmierst, wirst du das nicht erfahren. Dein C-Programm 
läuft ja auf jedem beliebigen Prozessor - wenn es denn läuft.

Georg

von Wolfgang (Gast)


Lesenswert?

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 ;-)

von Karl M. (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

Sorry, unter 2.1 muss es heißen (Stopp-Zustand)

von NuMal Langsam (Gast)


Lesenswert?

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

von Berufsrevolutionär (Gast)


Lesenswert?

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

von Zeidler (Gast)


Lesenswert?

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

von Bernhard S. (dl9rdw)


Lesenswert?

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

von Zeidler (Gast)


Lesenswert?

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

von Bernhard S. (dl9rdw)


Lesenswert?

Das vielleicht einfach mal einem Moderator weiterleiten.
Vielleicht haben die eine Idee warum das bei Dir nicht geht.

Bernhard

von Jens (Gast)


Lesenswert?

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

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.