Hallo Leute, um bei einen PIC mit einen Drucktaster eine andere Routine zu wählen, während der sich in eine "Warteschleife" befindet, habe ich eine eigentlich blöde Idee erfunden. (Mit Interrupt geht es nicht, weil der dann nachher in denselben Warteschleife zurückspringt) An einen Eingang lege ich einen Widerstand von 47 kΩ mit parallel daran einen Kondensator von 22 µF. t etwa 1 Sekunde. Mit ein Wechseltaster unterbreche ich die Versorgungsspannung, und lege die 5V am Eingang mit RC. Wird der Taster wieder losgelassen, fängt der Kontroller von Vorne an, und kontrolliert einige Eingänge, ähnlich wie diese beschriebene. Daraus können dann verschiedene Routinen gewählt werden. Frage ist nun: Darf ein Eingang 5 Volt haben, wenn der Kontroller keine Versorgungsspannung hat. Mit ein Transistor kann es verhindert werden, aber die Platine wird dann wieder viel komplizierter. Schonmal vielen Dank für die Infos LG, Evert
Evert D. schrieb: > Frage ist nun: Darf ein Eingang 5 Volt haben, wenn der Kontroller > keine Versorgungsspannung hat. Nein; sieh ins Datenblatt, da ist die maximale Eingangsspannung in Relation zur Versorgungsspannung angegeben. Die Eingangsspannung darf üblicherweise maximal ein paar hundert mV über der Versorgungsspannung liegen. Dein Problem aber ließe sich wesentlich einfacher lösen, wenn Du statt der Warteschleife ein etwas anderes Softwarekonzept anwenden würdest. Du könntest z.B. den Taster in der Warteschleife abfragen ...
Evert D. schrieb: > habe > ich eine eigentlich blöde Idee erfunden. Ich stimme dir zu! PIC sind mir fremd. Aber blockierende Schleifen zu verwenden ist eine Dummheit, wenn man keine blockierende Schleife braucht, bzw. sie einem Vorhaben im Wege steht.
Evert D. schrieb: > habe > ich eine eigentlich blöde Idee erfunden. Das ist eine ziemlich blöde Idee. Sorry. > (Mit Interrupt geht es nicht, weil der dann nachher in denselben > Warteschleife zurückspringt) Ich denke du solltest dich mit Programmierung beschäftigen. Was du erreichen möchtest ist in Software zu machen. Ganz einfach. Interrupt und Taster ist übrigens eher keine gute Idee. Evert D. schrieb: > Frage ist nun: Darf ein Eingang 5 Volt haben, wenn der Kontroller > keine Versorgungsspannung hat. Nein. Im Datenblatt in der I/O-Sektion steht sowas wie Vdd+0,25V. Wenn die Versorgungsspannung Vdd 0 ist, dann darfst du maximal 0,25V anlegen. Der Hintergrund sind integrierte Schutzdioden auf dem IC von I/O nach Vdd. Alternativ könntest du z.B. einen 100k Widerstand in Serie schalten, das begrenzt den Strom. Aber wie gesagt - dein Problem ist ein (eigentlich triviales) Programmierproblem. Jetzt eine komplizierte Hardwarelösung hinzubauen bringt nichts. Wenn du mehr von deinem Schaltplan zeigst und konkret beschriebst was das Programm machen soll, können wir dir helfen.
Danke Rufus, für Dein Antwort. (und auch alle anderen in der Zwischenzeit) Nur, an das abfragen habe ich natürlich schon gedacht, nur daß es um 16 Stunden handelt, und sollte schon innerhalb 5% liegen bleiben. Insgesammt geht es um drei Tasten. Es sollte dann aus drei verschiedene Routinen gewählt werden. Und so ein gute Programmierer bin ich auch nicht. Wenn es um interrupts geht, oder die Timern, bin ich schnell überfragt. Ich benutze Great Cow Basic. Darin gibt es ein Befehl "WAIT xx" gefolgt von us, ms, s, m, oder h. So schön habe ich noch nie eine Timing Prozedur gesehen. Aaaaber..... in der Praxis kommt da wohl wieder etwas dazwischen. LG, Evert
:
Bearbeitet durch User
Darfst Du. Im Datenblatt wird ein maximaler Strom stehen, den die Schutzdioden am Eingang abkönnen. Und wenn Du den nicht überschreitest, darfst Du das. Aber Du wirst ein anderes Problem bekommen: Wenn Du am Eingang 5V anlegst und kein VCC, dann wird über die Eingangsdiode ein kleiner Strom fließen, und der wird dir Deinen PIC versorgen. PIC läuft dann mit ca. 4.3V. Es gibt dann vermutlich kein Reset.
Evert D. schrieb: > Nur, an das abfragen habe ich natürlich schon gedacht, > nur daß es um 16 Stunden handelt, und sollte schon innerhalb > 5% liegen bleiben. Und? Wo liegt das Problem? Die Zeit Deiner "Warteschleife" solltest Du nicht mit stupidem Däumchendrehen und Zyklenzählen verbraten, sondern die Hardwareressourcen Deines µC dafür verwenden. Auch Dein PIC wird einen Hardwaretimer haben, den kannst Du so konfigurieren, daß er in einem festen und klar definierten Zeitraster einen Interrupt auslöst. Im Interrupthandler kannst Du beispielsweise eine Variable herunterzählen, mit der Du feststellen kannst, wann die Zeit abgelaufen ist. Dabei dann noch den Taster abzufragen (und gegebenenfalls zu entprellen) ist nichts, was großartig Zeit verbraucht, und vor allem, es ist nichts, was das definierte Zeitraster des Timerinterrupts irgendwie beeinflussen würde.
Mich würde mal interessieren, was hinter dieser "Blöden Idee" steckt. Was soll das für ein Problem lösen? Mir erschließt sich einfach nicht, warum dem Pic, die Versorgung kurzfristig gekappt werden soll/muss.
An Alle: Nochmal vielen Dank. Ich werde nochmal schauen ob es softwaremässig zu lösen ist. Diese 16 Stunden sollten unterbrochen werden können, und dabei dann eine Routine gewählt werden können, die der Ausgang nur 30 Sekunden pro Stunde (oder so ähnlich) einschaltet. Aber auch umgekehrt sollte auf die 16 Stunden geschaltet werden können.
Teo D. schrieb: > Mich würde mal interessieren, was hinter dieser "Blöden Idee" steckt. > Was soll das für ein Problem lösen? > Mir erschließt sich einfach nicht, warum dem Pic, die Versorgung > kurzfristig gekappt werden soll/muss. Damit der Kontroller von vorne anfängt, und die Eingänge abfragt, damit die richtige Routine gewählt wird.
Evert D. schrieb: > Damit der Kontroller von vorne anfängt, Meine Frage war. WARUM MUSS der µC von vorne beginnen, nur um was anders zu machen?
Evert D. schrieb: > Darf ein Eingang 5 Volt haben, wenn der Kontroller > keine Versorgungsspannung hat Unterschiedlich. Normale Eingänge haben eine Diode vom Eingang in Richtung Versorgungsspannung. Da läuft also der uC weiter mit 4.3V und entlädt deinen Kondensator schneller. RESET/MCLR/PROG hat diese Diode nicht, sonst könnte man ihn nicht auf 13V legen. Bei manchen PICs kann man den als I/O nutzen. Aber: Deine 'Lösung' ist sicher grober Murks, das geht sicher in richtiger Software auch ohne solchen Murks.
Teo D. schrieb: > Meine Frage war. WARUM MUSS der µC von vorne beginnen, nur um was > anders zu machen? Das hat er doch geschrieben: Der Basic Befehl "wait 16h" (warte 16 Stunden) lässt sich nicht vorzeitig per Software beenden.
Arduino F. schrieb: > Gibts auch ein "wait 1ms"? Anscheinend: Evert D. schrieb: > Ich benutze Great Cow Basic. > Darin gibt es ein Befehl "WAIT xx" gefolgt von us, ms, s, m, oder h.
John schrieb: > Das hat er doch geschrieben: > Der Basic Befehl "wait 16h" OK, Sorry. Der Beitrag ist mir völlig entgangen.
Test schrieb: > Alternativ könntest du z.B. einen 100k Widerstand in Serie > schalten, das begrenzt den Strom. Dafür braucht man nicht solche Geschütze aufzufahren. Selbst mit 4,7kΩ als Strombegrenzungswiderstand (zwischen Kondensator und DIO) wird man die Schutzdioden nicht überfordern.
Wolfgang schrieb: > Selbst mit 4,7kΩ > als Strombegrenzungswiderstand (zwischen Kondensator und DIO) wird man > die Schutzdioden nicht überfordern. Mit ein bisschen Pech reicht es dann sogar dafür, dass er weiter läuft.
Evert D. schrieb: > (Mit Interrupt geht es nicht, weil der dann nachher in denselben > Warteschleife zurückspringt) Naja, an sich wäre das schon die Lösung. Mann muss halt in der ISR die Register sichern und den Stack entsprechend manipulieren damit er anschließend in die gewünschte Routine "zurückspringt". Ich kenne PICs und Cow Basic leider nicht, aber vielleicht gibt's dafür ja irgendein kleines OS/Scheduler welches du dafür verwenden kannst? PS: Eine andere Softwarearchitektur wäre aber wahrscheinlich dennoch die bessere Lösung.
Benutze den Reset-Eingang und nimm ihm nicht die Versorgungsspannung.
Halllo Leute, vielen nDank für die neue Ideeën. Indertat, ein "RESET" wäre das schönste in diese blöde / komische Idee von mir, um es trotzdem vernünftig aussehen zu lassen. Aber, auch macht es Spaß, daß ein 10F20x nur etwa € 0,50 kostet :-) Ich habe nochmal die Umschreibung der Timern durchgelesen, aber komme damit leider nicht weiter. Es sei denn, jemand hat interesse in einen kleinen Urlaub, um es mich bei zu bringen, damit mein Hirn, falls noch was übrig geblieben ist, es noch verstehen kann. Ooooder, ich suche mir einen PIC mit "RESET" eingang. Außer RESET bräuchte ich noch 6 I/O. TIPs willkommen. Ja, stimmt, der 10F20x hat nur 4. Kleiner Fehler, denn mit dem habe ich keine ausreichende I/O um LEDs an zu steuern als Indikatoren um an zu geben in welcher Routine der Läuft. LG, Evert
Evert D. schrieb: > Ich habe nochmal die Umschreibung der Timern durchgelesen, aber > komme damit leider nicht weiter. Du brauchst einen "Systemtakt", wie er z.b. in der Arduino Welt "millis" heißt. Quasi eine Uhr die ständig weiter läuft, unabhängig von deinem Hauptprogramm. Das geht mit einem Timer, der eine Variable hoch zählt. Momentan sieht dein Hauptprogramm ja ca. so aus: If Modus=1 then wait 16h, else wait 1h; Aktion; Mit dem Zeitgeber sähe das so aus: var zeitpunkt; Loop: If zeitpunkt = now then Aktion; If (tastendruck or keinZeitpunkt) and taste = on then zeitpunkt = now + 16h; If (tastendruck or keinZeitpunkt) and taste = off then zeitpunkt = now + 1h; endloop; Der Trick ist, nicht einfach zu warten ob 16 Stunden vorbei sind. Sondern währenddessen immer wieder zu schauen ob sich der Modus ändert. Dafür brauchst du eine Uhr/Timer, der im Hintergrund weiter läuft während zu prüfst was an den Eingängen passiert.
Evert D. schrieb: > Ich habe nochmal die Umschreibung der Timern durchgelesen, aber > komme damit leider nicht weiter. Nun vielleicht noch ein bisschen über Interrupts, dann fällt der Groschen eventuell. Auch wanns da nicht um Bascom geht, solltest du dir das mal anschauen. http://www.sprut.de/electronic/pic/index.htm
Hallo Läude, das Problem ist vorläufig gelöst. Habe einen Kontroller gesucht mit 'Reset-Eingang'. Gefunden: 16F54. Und jetzt Lachen: HAHA.... davon habe ich schon etwa 10 herumliegen ! Korrektur: Es sind sogar 18 ! Nur.... Diese hat 18 Pins, und der 10F204 nur 8. Das war der zweite Spaß, die Platine konnte so schön klein sein. Jetzt muß die Platine vergrössert werden. ok, es sind nur einige mm, aber zu hoffen ist jetzt, das auch diese in die bereits vorhandene Gehäuschen passen. Jedenfalls vielen Dank für's mitdenken. LG, Evert
:
Bearbeitet durch User
Evert D. schrieb: > Jedenfalls vielen Dank für's mitdenken. Kein Problem... Du baust also lieber die Platine um, als die Software auf Vordermann zu bringen. Ist ok... ist deine Baustelle. Muss ich ja nicht verstehen. ..
Nein, besser nachdenken..... Ich habe eine neue Kontroller genommen, einen mit RESET-Eingang. Der hat 18 Pins, und die Platine war für eine 10F204, der hat nur 8 Pins. Das paßt nicht, deshalb eine neue Platine. Tschau ! Evert
Arduino F. schrieb: > Ist ok... ist deine Baustelle. > Muss ich ja nicht verstehen. .. Evert D. schrieb: > Nein, besser nachdenken..... Oje. Das ist wie den Vorwärts-Gang im Auto nicht zu finden und den Hinweis bekommen, 'Das Handbuch licht im Handschuhfach'. Sich aber dazu zu entscheiden, lieber einen größeren Rückspiegel einzubauen, auch wenn dafür die Windschutzscheibe geopfert werden muss. Herauszufinden was es mit Timmern und Interrupts auf sich hat, ginge schneller als ne neue Platine hinzu pfuschen!
Um Dein Problem zu lösen, wäre weder ein Reset-Eingang noch ein anderer Controller, geschweige denn eine neue Platine nötig gewesen. Aber wenn Du Dich dem so hartnäckig widersetzt, bitte, nur zu.
Beitrag #5421971 wurde von einem Moderator gelöscht.
Evert D. schrieb: > (Mit Interrupt geht es nicht, weil der dann nachher in denselben > Warteschleife zurückspringt) Geht zwar auch, macht man aber nicht. Besser legt man eine Mainloop an, die z.B. 10ms wartet und dann eine Statemaschine aufruft. Die macht dann genau eine Aktion und kehrt wieder zurück. Mit einer 32Bit Zählvariable kannst Du dann in der Statemaschine bis >1 Jahr Aktionen ausführen. Die Mainloop kann somit alle 10ms die Taste abfragen, entprellen, Flanke erkennen und eine andere Statemaschine neu starten. Die 10ms warten macht man mit Timer oder mit Delay.
Peter D. schrieb: > Die 10ms warten macht man mit Timer .. Genau! Da dieses Basic (sehe ich zum ersten mal) einen wenigstens halbherzigen Durchgriff zu den Timern erlaubt, und sich ISR etablieren lassen, sehe ich kein ernstes Problem, sowas wie einen Millis Counter zu bauen. Nebenbei: Bei 16h Wartezeit, bleibt genug Zeit, zum pollen dieses Counters und auch Tastenabfragen durch zu führen. Das Problem dürfte nur in der Abstraktion liegen. Dass man 3 endliche Automaten braucht. Ein Automat um den Programmfluss zu verteilen, Und eben für jede der beiden Hauptaufgaben einen eigenen Automaten welcher nicht blockiert. "Wait" und seine Brüder sind dann in den Hauptautomaten natürlich verboten.
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.