Forum: Mikrocontroller und Digitale Elektronik Tastenverriegelung (Tastensperre)


von el p. (elpistolero84)


Lesenswert?

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

von blub (Gast)


Lesenswert?

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.

von sieben von neun (Gast)


Lesenswert?

Es kann doch kein Problem sein eine Zeit zu messen. Allenfalls mehr mals 
aufwachen und vergleichen

von el p. (elpistolero84)


Lesenswert?

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

von ein dork (Gast)


Lesenswert?

>nach so vielen unbrauchbaren Kommentaren hoffe ich...

und bye, bye

von bla (Gast)


Lesenswert?

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.

von el p. (elpistolero84)


Lesenswert?

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

von el p. (elpistolero84)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von el p. (elpistolero84)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von el p. (elpistolero84)


Angehängte Dateien:

Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von el p. (elpistolero84)


Lesenswert?

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

von spontan (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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!

von el p. (elpistolero84)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von el p. (elpistolero84)


Lesenswert?

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

von Fer T. (fer_t)


Lesenswert?

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

von Joachim .. (joachim_01)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Joachim .. (joachim_01)


Lesenswert?

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.

von el p. (elpistolero84)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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
Noch kein Account? Hier anmelden.