Forum: Mikrocontroller und Digitale Elektronik Tasterverriegelung und Tasterentprellung


von Achim S. (achims)


Lesenswert?

Hallo Gemeinde
Auf einem Board verwende ich die folgenden Pins:

"Ortsbedienung direkt am AT1284p":

PC 2 - Taste 1
PC 3 - Taste 2
PC 4 - Taste 3
PC 5 - LED 1
PC 6 - LED 2

Anschluss "Motorshield"

PA 0 - Clock
PA 1 - CW/CCW (L/R)
PA 2 - EN

bisherige Funktion der Tasten und Pins

Taste 1 - EN einschalten - freigabe Schrittmotor mit L6208
LED 1 - Anzeige "Motor ein"
LED 2 - Anzeige Taktfrequenz durch Timer

Ich verwende einen Atmega 1284p mit 16 MHz, Timer mit 1ms und Toogle 
PA0,
mit der Taste PC 1 gebe ich EN frei. PA 1 hat ständig H und gibt dadurch 
die Drehrichtung an.

1
if(get_key_press(1<<KEY_2))// nur Taste press        
2
  {          // LED an
3
    PORTC &= ~(1<<PC1);  
4
  }
5
if(get_key_press(1<<KEY_3))    // nur Taste press
6
  {          // LED aus
7
    PORTC |= (1<<PC1);      
8
  }

Verwende ich die Tasterentprellung von Peter, ist es kein Problem, den 
Eingang ein und auszuschalten.

Wie mache ich das am besten, wenn ich 2 Taster verwende und damit eine 
Umschaltung Links / Rechtslauf mache?

Bevor ich die Richtung umschalte muss EN ausgeschaltet werden.
Beide Taster kann man leicht "verriegeln" ohne Peter sein Code.
Das setzen der Richtung muss vor dem Einschalten des Motors erfolgen.
Hat jemand eine Idee dazu?
achim

: Verschoben durch Moderator
von Achim S. (achims)


Lesenswert?

Mit Verriegelung meine ich, die Benutzung von T1 oder T2. Je nachdem 
welche taste ich drücke läuft der Motor links oder rechts rum. Während 
der Motor die eine Richtung läuft ist die andere Taste gesperrt und es 
muss erst mit der Taste 3 ausgeschaltet werden.
Umschaltung der Drehrichtung über aus, andere Drehrichtung gesperrt.

von Max B. (theeye)


Lesenswert?

Setzte doch eine Variable (Motor=0, 1 oder 2 für aus, links oder rechts) 
und frage damit den Zustand des Motors bei der Erkennung eines 
Tastendrucks ab. Entweder realisierst du das Ausschalten bei der Umkehr 
der Drehrichtung dann in Software oder verweigerst die Umschaltung wenn 
der Motor nicht aus ist.

Gruß Max

von Simpel (Gast)


Lesenswert?

Wenn Drehrichtung_IST <> Drehrichtung_Soll dann EN-OFF --> 
Drehrichtung-IST = Drehrichtung_Soll --> EN-ON.

P.S.
Das Analysieren von Aufgaben und deren Umsetzung in logische 
Einzelschritte ist das Fundament des Programmierens. Nur fertige 
Routinen zu suchen und zu verwenden trägt nicht dazu bei, dass man bald 
auch komplexere Aufgaben aufzudröseln und umzusetzen vermag.

von Achim S. (achims)


Lesenswert?

ich such kein fertges Programm oder so. Eine kleine Leitung oder Hinweis 
wirkt Wunder. Habe schon eine Idee nach den letzten Antworten und bin 
gerade beim Umsetzen

von Wolfgang (Gast)


Lesenswert?

Achim S. schrieb:
> Mit Verriegelung meine ich, die Benutzung von T1 oder T2. Je nachdem
> welche taste ich drücke läuft der Motor links oder rechts rum. Während
> der Motor die eine Richtung läuft ist die andere Taste gesperrt und es
> muss erst mit der Taste 3 ausgeschaltet werden.

Warum soll der Benutzer beim Umschalten der Drehrichtung extra eine 
Taste 3 drücken? Und warum willst du zeitweilig Tasten blockieren?

Wenn der Benutzer von Links- auf Rechtslauf umschalten möchte, kann er 
doch einfach die "Rechts"-Taste drücken. Was die Tastendrücke steuern, 
ist für die Kommandoeingabe doch erstmal ziemlich egal. Erst der 
Motorsteuerteil des Programms kann sich dann darum kümmern, dass der 
Motor vernünftig angesteuert wird, d.h. vorübergehend ausreichend lange 
auf "Stop" gehen und dann auf "Rechtslauf"

von Max B. (theeye)


Lesenswert?

Ich glaube "Simpel (Gast)" bezog sich darauf, dass du die 
Entprellroutine verwendest (was kein Problem ist) aber selbst hättest 
auf eine mögliche Lösung kommen sollen.

Wie auch immer, wenn du noch Fragen hast, immer her damit ;-). Wie du 
vermutlich weißt, freuen wir uns auch immer über erfolgreiche Lösungen 
(= umgesetzter Code).

Gruß Max

von Karl M. (Gast)


Lesenswert?

Zu den Thread Regeln, dort steht:

"Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen 
und diskutieren. Bitte hier keine Fragen posten!"

von Achim S. (achims)


Lesenswert?

Das umschalten der Drehrichtung erfolgt durch den Pin PA1. Liegt der Pin 
auf H dreht der Motor in die eine Richtung, liegt er auf L dreht der 
Motor in die andere Richtung. Bei kleinen drehzahlen mag es gehen. Bei 
höheren drehzahlen und einer angeschlossenen Last könnte es zu Problemen 
kommen. Das "Motorsteuerteil" besteht aus dem IC L6208. So weit mir 
bekannt ist, gibt es dort kein Anlauf oder Verzögerung. Bei einer 
entsprechend grossen Last könnet sogar ein Stop des Motors überwacht 
werden.

Eine Umschaltung der Drehrichtung kann direkt erfolgen (ohne über aus)
Start --> links/rechts --> stop - mit 3 Tasten

oder Umschaltung der Drehrichtung über aus
Start --> links --> stop --> rechts --> stop - auch mit 3 Tasten

achim

von Peter D. (peda)


Lesenswert?

Max B. schrieb:
> Ich glaube "Simpel (Gast)" bezog sich darauf, dass du die
> Entprellroutine verwendest (was kein Problem ist) aber selbst hättest
> auf eine mögliche Lösung kommen sollen.

Die Entprellung ist doch nicht das Problem, daher würde ich abraten, 
sich da noch zusätzliche Baustellen aufzureißen.

Das Problem ist, sich erstmal einen Programmablaufplan zu erstellen.
Gerade als Anfänger sollte man vermeiden, direkt aus dem Gedächtnis zu 
coden.
https://de.wikipedia.org/wiki/Programmablaufplan

von achim (Gast)


Lesenswert?

Habe das folgender Massen gelöst:
1
if(get_key_press(1<<KEY_1))  // mit Taste 1 einschalten 
2
  {    
3
    if (richtung==0)
4
      {
5
    richtung=1;
6
    PORTA &= ~(1<<PA1);  // CW – Umschaltung links / rechts
7
    PORTA |=(1<<PA2);    // ENein          
8
    PORTC &= ~(1<<PC5);  // LED 5 an
9
       }        
10
   }
11
if(get_key_press(1<<KEY_2))  // mit Taste 2 einschalten 
12
   {  
13
      if (richtung==0)
14
    {
15
      richtung=2;
16
      PORTA |= (1<<PA1);  // CW - Umschaltung links / rechts  
17
      PORTA |=(1<<PA2);  // EN ein        
18
      PORTC &= ~(1<<PC5);  // LED 5 an
19
    }         
20
          }
21
if(get_key_press(1<<KEY_3))  // mit Taste 3 alles ausschalten 
22
   {              
23
      PORTA &= ~(1<<PA2);  // EN ausschalten
24
      PORTC |= (1<<PC5);   // LED aus
25
      richtung=0;
26
    }
Damit kann entweder links oder rechts auswählen, Beide Taster sind gegen 
doppeltes drücken verriegelt. Die 1 und 2 nutze ich für eine Anzeige der 
Drehrichtung. Habe es so ziemlich gemacht wie max es vorgeschlagen hat. 
Sicher gibt es bessere Lösungen, es geht aber.
achim

von Thomas E. (thomase)


Lesenswert?

Warum beschäftigst du den Controller mit sinnlosen Tastenabfragen, die 
du dann ignorierst?

Wenn die Tasten gesperrt sein sollen, dann frag sie einfach nicht ab:
1
if(!richtung)
2
{
3
if(get_key_press(1<<KEY_1))  // mit Taste 1 einschalten 
4
  {    
5
    richtung=1;
6
    PORTA &= ~(1<<PA1);  // CW – Umschaltung links / rechts
7
    PORTA |=(1<<PA2);    // ENein          
8
    PORTC &= ~(1<<PC5);  // LED 5 an     
9
   }
10
if(get_key_press(1<<KEY_2))  // mit Taste 2 einschalten 
11
   {  
12
      richtung=2;
13
      PORTA |= (1<<PA1);  // CW - Umschaltung links / rechts  
14
      PORTA |=(1<<PA2);  // EN ein        
15
      PORTC &= ~(1<<PC5);  // LED 5 an
16
    }         
17
}

mfg.

von Max B. (theeye)


Lesenswert?

Peter D. schrieb:
> Die Entprellung ist doch nicht das Problem, daher würde ich abraten,
> sich da noch zusätzliche Baustellen aufzureißen.

Das wollte ich damit auch gar nicht sagen :-)

@ TE: Schön, dass es jetzt läuft!

Gruß Max

von Peter D. (peda)


Lesenswert?

Thomas E. schrieb:
> Warum beschäftigst du den Controller mit sinnlosen Tastenabfragen, die
> du dann ignorierst?

Ganz einfach, weil sie ignoriert werden sollen.
Ansonsten würden sie gemerkt.

von Peter D. (peda)


Lesenswert?

achim schrieb:
> Sicher gibt es bessere Lösungen, es geht aber.

Du hast soeben die Statemaschine erfunden.
Man könnte es noch etwas aufhübschen mit aussagefähigen Konstanten:
1
enum{ OFF, LEFT, RIGHT };
2
//..
3
    if (richtung==OFF)
4
      {
5
    richtung=LEFT;

von Achim S. (achims)


Lesenswert?

Sorry Peter, dein Kommentar erschliesst sich mir nicht.

Peter D. schrieb:
> Du hast soeben die Statemaschine erfunden.

Kenne die Beiträge zur Statemaschine, arbeite damit und habe hier schon 
lange Diskussionen geführt.
Mit enum hast du recht. Da bleibt ein grosses Potential zur Verbesserung
achim

von F. F. (foldi)


Lesenswert?

Peter D. schrieb:
> Das Problem ist, sich erstmal einen Programmablaufplan zu erstellen.
> Gerade als Anfänger sollte man vermeiden, direkt aus dem Gedächtnis zu
> coden.

Oh ja! :-)

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.