Hallo an alle experten, wie in den beiträgen von mir zur erkennen sind bastele ich einen kapazitives tastelfeld mit 12 tasten mit einem PICLF45K22. jede taste führt zu einem analogen eingang. hat also kein matrix anschluss. hierzu wollte ich jetzt mit MPLABX und dem C18 Compiler eine tastensperre programmieren. Sodass durch eine bestimmte taste, solange eine festgelegte zeit(z.B 2s) gedrückt wird, dadurch eine verrieglung passiert!!! was ich mir auch überlegt habe, dass dadurch auch der pic ins schlaf modus geht.. kann mir da einer einen tipp geben????? wäre auch sehr dringend.. für jeden beitrag würde ich mich freuen mfg
Groß-/Kleinschreibung beachten. "Sehr dringend" ist immer gaaanz schlecht. el pistolero schrieb: > Sodass durch eine bestimmte taste, solange > eine festgelegte zeit(z.B 2s) gedrückt wird, dadurch eine verrieglung > passiert!!! Was ist los? Schreib das mal so dass man auch versteht was gemeint ist.
Es kann doch kein Problem sein eine Zeit zu messen. Allenfalls mehr mals aufwachen und vergleichen
blub schrieb: > Groß-/Kleinschreibung beachten. > "Sehr dringend" ist immer gaaanz schlecht. > > el pistolero schrieb: >> Sodass durch eine bestimmte taste, solange >> eine festgelegte zeit(z.B 2s) gedrückt wird, dadurch eine verrieglung >> passiert!!! > Was ist los? Schreib das mal so dass man auch versteht was gemeint ist. Hallo, nach so vielen unbrauchbaren Kommentaren hoffe ich, dass du auch fachlich eine Hilfe sein kannst :)) was ich auch wirklich brauche Also, wie gesagt 12 tasten, jeweils zur einen Analogen Eingang angeschlossen. Die taste „Stern“ soll durch betätigen über einer bestimmten Zeit (z.B 2s) alle anderen tasten verriegeln! Anschließend auch ins Schlaf-Modus gehen..
>nach so vielen unbrauchbaren Kommentaren hoffe ich...
und bye, bye
el pistolero schrieb: > nach so vielen unbrauchbaren Kommentaren hoffe ich, dass du auch > fachlich eine Hilfe sein kannst :)) können schon... aber wollen nach diesem Kommentar nicht mehr.
ein dork schrieb: >>nach so vielen unbrauchbaren Kommentaren hoffe ich... > > und bye, bye Es war nicht böse gemeint mit dem Wort "unbrauchbar"... jedes tipp habe ich zu gebrauchen :) mfg
Hallo, ich habe mit dem Programmieren vor ca einem Monat angefangen, daher auch die vielen fragen die ich gerne durch die Hilfe von euch gerne lösen würde. Also nochmal, nichts ist hier böse gemeint
el pistolero schrieb: > Anschließend auch ins Schlaf-Modus gehen. Dann mach' das doch einfach. Jetzt ist doch nur interessant, wie er wieder aufwacht. Dazu musst du die Freigabetaste zyklisch abfragen. Schlafen, abfragen, weiter schlafen oder freischalten. mfg.
Thomas Eckmann schrieb: > el pistolero schrieb: >> Anschließend auch ins Schlaf-Modus gehen. > Dann mach' das doch einfach. > Jetzt ist doch nur interessant, wie er wieder aufwacht. Dazu musst du > die Freigabetaste zyklisch abfragen. Schlafen, abfragen, > weiter schlafen oder freischalten. > > mfg. Hallo Thomas, das ist nur eine Gedanke was ich mir überlegt habe! Wie ich das machen soll habe ich ehrlich gesagt keine vorstellung? Wenn vllcht ein C-code als Beispiel geschrieben würde, hätte ich mehr verstehen können mfg
el pistolero schrieb: > Wenn vllcht ein C-code > als Beispiel geschrieben würde, hätte ich mehr verstehen können Drehen wir den Spieß doch mal um: zeig du, was du schon hast (Anhang als C-Datei), und dann kann man dir mal die Richtung weisen... BTW: warum sind die Taster an Analogeingängen angeschlossen?
Lothar Miller schrieb: > el pistolero schrieb: >> Wenn vllcht ein C-code >> als Beispiel geschrieben würde, hätte ich mehr verstehen können > Drehen wir den Spieß doch mal um: zeig du, was du schon hast (Anhang als > C-Datei), und dann kann man dir mal die Richtung weisen... > > BTW: warum sind die Taster an Analogeingängen angeschlossen? Hallo, den C-Code habe ich als Anhang hinzugefügt. Die Tasten sind in den Analogen angeschlossen, da die Tasten Kapazitiv arbeiten.. Hier nochmal die einzelnen Schritte für eine Kapazitiv arbeitende Taste 1. TRIS als ausgang (TRIS = 0) 2. Sample&Hold(Chold) kondensator über VREF aufladen 3. TRIS als eingang wählen (TRIS = 1) 4. ADCON wählen 5. Konvertierung starten (GODONE == 1) 6. ADCWERT ablesen (10Bits -> ADRESH und ADRESL) 7. Kondensator Clast am AN0 entladen (TRIS = 0) Also das ganze funktioniert soweit mit dem C-Code..Ich habe auch eine Funktion wo ich die ADC Werte 8x auslese und eine Mittelwert bilde. Die nächste Schritt wäre dann mit der Tastenverriegelung
> Wenn vllcht ein C-code > als Beispiel geschrieben würde Was hat C denn mit Sleep Modus zu tun ? Du meinst hoffentlich nicht die Sleep(1000) Funktion in C ? Das hängt alles von deiner Hardware ab. Ob du nen PC in den Sleep Modus schicken willst oder nen AVR oder MSP430 oder STM32 oder LPCxxx oder oder oder ...
Uwe schrieb: >> Wenn vllcht ein C-code >> als Beispiel geschrieben würde > Was hat C denn mit Sleep Modus zu tun ? Du meinst hoffentlich nicht die > Sleep(1000) Funktion in C ? Das hängt alles von deiner Hardware ab. Ob > du nen PC in den Sleep Modus schicken willst oder nen AVR oder MSP430 > oder STM32 oder LPCxxx oder oder oder ... Ich habe das C-Code für meine Anwendung veröffentlicht. Es ist für einen Kapazitives Tastenfeld einer Fernbedienung gedacht worden. Der mikrocontroller ist ein PIC..Geschrieben wird es in C
Du brauchst die Tasten nicht verriegeln, sie machen ja nix ;-) Du muß einfach den Zustand der Tasten irgendwo speichern (gedrückt / nicht gedrückt) Du muß eine Zeitbasis realisieren. In die nicht vorhandenen Aktionen nach einem Tastendruck mußt Du die Verriegelung einbauen, d.h. die Funktion darf nicht ausgeführt werden. Aber Du hast ja gar nix geschrieben, DU brauchst nicht mal die Tasten abfragen, die machen eh nix.
el pistolero schrieb: > Die Tasten sind in den Analogen angeschlossen, > da die Tasten Kapazitiv arbeiten.. Scheixx Salamitaktik, das... :-/ > Schwellwert bei ca. 3Newton Wie meinst du das? Kapazitive Tasten sind i.A. leitende Flächen, denen ein Finger angenähert wird. Da kann man keine Kraft messen! Sind das "fertige" käufliche Taster, die abhängig von der Kraft ein Analogsignal ausgeben? Du musst 12 gleiche Taster abfragen, und nimmst 12 einzelne Routinen dafür. Das hat was... :-o Seis drum. Wenn du dieses (vermurkste) Konzept weiter verfolgen willst, dann lässt du pro Schleifendurchlauf der Hauptschleife einfach einen Zähler hochlaufen. Dieser Zähler wird zurückgesetzt, wenn die Sterntaste nicht gedrückt ist. Und wenn dieser Zähler ausreichend hoch gezählt hat, dann gehst du Schlafen... Etwa so:
1 | void main(void) //Hauptprogramm main |
2 | {
|
3 | int counter=0; |
4 | |
5 | Initialisierung(); // Initialisierung wird fortgesetzt |
6 | |
7 | do
|
8 | {
|
9 | /* Aufruf der einzelnen Funktionen */
|
10 | Taste1(); |
11 | :
|
12 | TasteStern(); |
13 | TasteRaute(); |
14 | |
15 | counter++; |
16 | if (LED11=0) counter=0; |
17 | if (counter>2145) Sleep(); // durch Herumtricksen den Wert herausfinden... :-/ |
18 | |
19 | }while(1); |
20 | }
|
Lothar Miller schrieb: > Anhang als C-Datei Meine C-Dateien enden auf .c nicht auf .txt!
Lothar Miller schrieb: > el pistolero schrieb: >> Die Tasten sind in den Analogen angeschlossen, >> da die Tasten Kapazitiv arbeiten.. > Scheixx Salamitaktik, das... :-/ > >> Schwellwert bei ca. 3Newton > Wie meinst du das? > Kapazitive Tasten sind i.A. leitende Flächen, denen ein Finger > angenähert wird. Da kann man keine Kraft messen! > Sind das "fertige" käufliche Taster, die abhängig von der Kraft ein > Analogsignal ausgeben? > Hallo, also das sind kapazitive Tasten, wo eine Kapazitätsänderung durch änderung der Abstand d einer Plattenkondensator verursacht wird. Apllikation von Microchip AN1325(Anhang). Die durch einen Druck auf das Tastenfeld arbeiten. Also der zählt eine bestimmte Zeit(z.b dein Wert 2145) nach und geht dann ins Sleep modus. 1. Ich arbeite mit C18 Compiler. Ich glaube der hat keine Funktion Sleep(); 2. Wie wird das ganze wieder aufgeweckt?? (Hab mal gelesen durch MCLR, Watchdog Timer..)
el pistolero schrieb: > Also, wie gesagt 12 tasten, jeweils zur einen Analogen Eingang > angeschlossen. Die taste „Stern“ soll durch betätigen über einer > bestimmten Zeit (z.B 2s) alle anderen tasten verriegeln! Nun, dann setzt Du einen Timer auf und solange die Taste gedrückt ist, wird die Zeit gezählt. Sind 2s erreicht, machst Du eine Aktion. Z.B. ein Bit setzen, was die Abfrage der anderen Tasten überspringt. el pistolero schrieb: > Anschließend > auch ins Schlaf-Modus gehen.. Dann mache das. Die Schlafmodi sollten im Datenblatt stehen. Manche Compiler haben da was vorgefertigt, z.B. beim AVR-GCC in der "sleep.h". Interessant wäre noch, wie Du wieder aufwachen willst. Der ADC wird dann ja nicht mehr laufen, um die Tasten abzufragen. Peter
Peter Dannegger schrieb: > Nun, dann setzt Du einen Timer auf und solange die Taste gedrückt ist, > > wird die Zeit gezählt. Sind 2s erreicht, machst Du eine Aktion. Z.B. ein > > Bit setzen, was die Abfrage der anderen Tasten überspringt. Hallo, ich meine wie der Lothar Miller oben geschrieben hat, kann es auch Funktionieren. Jedoch habe ich das Problem wie ich es ins Sleep Modus schicken kann und anschließend wieder aufwecken????
Generell (von der Hardware erst mal abgesehen) wäre meine Idee gewesen: -> uC geht in den Sleep Modus (siehe Datenblatt). -> Tasten Druck -> uC wacht auf durch ein Pegel Interrupt -> uC zählt die Zeit solange wie gedrückt wird -> kleiner als 2 Sekunden --> wieder in den Sleep Modus MfG
Daß der PIC in den Sleep-Mod geht hat wie ein Vorredner schon schrieb nichts mit der kapazitiv reagierenden Taste an sich sondern an der Art der Programmierung zu tun. Was du machen mußt: Du richtest einen Zähler ein, der im Interrupt gestartet einen Wert hochzählt, der zB alle 1/10sek 1. Taste wird gedrückt -> Zähler startet im Interrupt 2. Nun prüfst du bei jedem Interrupt hintereinander ob die Taste noch gedrückt ist. Das machst du 20x (= 2sek) 3. Bit wird gesetzt und verriegelt alles weitere. Andernfalls Zähler = 0 und bei erneutem Tastendruck wieder alles im Hintergrund (Interrupt) mitprüfen. So mal ganz grob. Dein Problem: Solange du Zeitverzögerungen nur mit einer For-Schleife hinbekommst wird das nichts, das ist ein bisschen komplizierter. Und das alles hat mit SLEEP nichts zu tun. Du verwechselt da etwas bzw hast einfach noch vieeel zu wenig Erfahrung im schreiben von Software. Die Application Note die du benutzt ist schlicht ungeeignet für deine Aufgabe.
el pistolero schrieb: > Jedoch habe ich das Problem wie ich es ins Sleep Modus > schicken kann und anschließend wieder aufwecken???? Zuerst mußt Du mal prüfen, wieviel Strom Du maximal ziehen darfst und welcher Sleepmode das erfüllt. Vielleicht reicht ja schon der Idle-Mode. Und dann mußt Du dir überlegen, womit Du aufwachen willst. Eine Möglichkeit ist, man wacht durch den Watchdog auf, prüft eine Taste und geht wieder schlafen. Peter
Uups Fer T. war schneller. Er sagt im Großen und Ganzen aber das Gleiche. Und gewöhn' dir bitte eine vernünftige Rechtschreibung an, das macht die Sache leichter.
Hallo án alles, ich habe das Problem folgendermaßen gelöst, bzw. den Mikrocontroller kann ich in das Sleep modus bringen. Als nächstes sollte der Mikrocontroller i.wie wieder aufgeweckt werden. Ich weiss, wie oben schon durch einigen von Ihnen erwähnt haben, dass dies durch Interrupt, Reset oder durch Watchdog Timer gemacht werden kann. Mir fehlt noch leider die Erfahrung, wie ich das am besten handhaben kann! :) Danke nochmals an alle die mir mit den Kommentaren sehr Hilfreich geworden sind. void main(void) //Hauptprogramm main { int counter = 0; int LED_watch; Initialisierung(); // Initialisierung wird fortgesetzt do { /* Aufruf der einzelnen Funktionen */ Taste1(); Taste2(); Taste3(); Taste4(); Taste5(); Taste6(); Taste7(); Taste8(); Taste9(); Taste0(); TasteStern(); TasteRaute(); // LED_watch=LED_Watch(); // LED_Watch Funktion überprüft ob eine Taste gedrückt worden ist if(LED_watch==1) { counter=0; }//if else { counter++; if(counter > 1000) // Wartet ca. 10s und geht in den Sleep Modus { LEDRot = 1; // LED Rot deutet den Sleep Modus an LEDBlau = 0; // LED Blau deutet Betriebmodus an sleep(); // Sleep Modus Aktiviert }//if }//else }while(1); /////////////////// int LED_Watch(void) { int i=0; if(LED1 ==1 || LED2==1 || LED3==1 || LED4==1 || LED5==1 || LED6==1 || LED7==1 || LED8==1 || LED9==1 || LED10==1 || LED11==1 || LED12==1) { i=1; } return i; }
Ich kenne die Pics nicht. Aber der Atmega hat 2 Möglichkeiten sich zyklisch selbst aufzuwecken: Den Watchdog-Timer, nicht Watchdog-Reset, oder eine RTC mit Timer2. Damit lässt man den Controller z.B. alle 100ms aufwecken, misst die ADC-Eingänge, wertet das aus und entscheidet dann. Guck dir im Datenblatt an, was in welchem Sleepmode noch läuft. Du brauchst auf jeden Fall einen Timer. mfg.
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.