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
Interrupt on Change Event für den Eingang parametrieren, Flanke zu High -> Zeitpunkt speichern, Flanke zu Low -> Länge auswerten und entsprechenden Ausgang setzen.
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.
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...
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.
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
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
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 ;-)
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.
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 ....
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...
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
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
Das vielleicht einfach mal einem Moderator weiterleiten. Vielleicht haben die eine Idee warum das bei Dir nicht geht. Bernhard
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.