Forum: Mikrocontroller und Digitale Elektronik IO´s mit Taster richtig schalten


von Tekkineo T. (tekkineo)


Lesenswert?

Hallo Leute,
für meinen Pi möchte ich eine "Steuerung" realisieren. Im Prinzip sollen 
Taster einen Impuls an den Pi senden der einen Reboot auslöst. Je 
nachdem welcher Taster gedrückt wird, soll ein anderer Reboot erfolgen 
(2 verschiedene PIN´s am PI).
Nachdem ich gut 10 Jahre nicht mehr wirklich programmiert habe war schon 
das eine Herausforderung was ich als Code angehängt habe. Andererseits 
denke ich, ist es eine gute Übung, da es im Prinzip ähnliche Routinen 
sind und es einfach Tasterabfragen.
Meine Frage ist nun: ENTPRELLEN... im Internet findet man tausende 
Philosopienen (die einfachste ist ein delay). Allerdings würde ich gerne 
eine Lösung anstreben, die für diesen Anwendungsfall passt und nicht zu 
kompliziert ist. Hier würde ich einen Tipp benötigen. Könnt ihr mir hier 
helfen? Vielen Dank!


Code:
1
int main(void)
2
{
3
  int i;
4
  DDRD = 0b10101010;  //Port definition: Ein-/Ausgang
5
  /*  D0 = Taster 1
6
    D1 = LED 1      
7
    D2 = Taster 2  
8
    D3 = LED 2      
9
    D4 = Taster 3
10
    D5 = LED 3      
11
    D6 = Taster 4
12
    D7 = LED 4      
13
  */
14
  DDRB = 0b00000111;
15
  /*  B0 = Signal PI    reboot 1
16
    B1 = Signal PI    reboot 2
17
    B2 = TFT    Transistor TFT
18
  */
19
        
20
    while (1) 
21
    {
22
  PORTB = 0b000000;  //Startinitialisierung Port B  
23
            //B0-B7 aus
24
  PORTD = 0b000000;  //Startinitialisierung Port D
25
            //D0-D7 aus
26
    
27
  /*...*/
28
29
  
30
  if (PIND & (1<<0))      //Taster 1
31
    {
32
    PORTD = 0b00000010;    //LED 1 ein
33
    PINB |= (1<<TFT);    //TFT ein
34
    PINB |= (1<<0);      //reboot 1
35
    _delay_ms(200);
36
    PINB |= (0<<0);      
37
    }
38
    
39
  else if (PIND & (1<<4))            //Taster 3
40
    {
41
    PORTD = 0b00100000;    //LED 3 ein
42
    PINB |= (1<<TFT);    //TFT ein
43
    PINB |= (1<<1);      //reboot 2
44
    _delay_ms(200);
45
    PINB |= (0<<1);
46
    }

: Verschoben durch User
von Peter D. (peda)


Lesenswert?

Tekkineo T. schrieb:
> Je
> nachdem welcher Taster gedrückt wird, soll ein anderer Reboot erfolgen
> (2 verschiedene PIN´s am PI).

Wozu will man denn sowas verrücktes?
Das erinnert mich an mein Praktikum im Studium. Da gab es einen 
Mainframe, an 2 Tagen wurde VMS gebootet und an 3 Tagen UNIX.

Tekkineo T. schrieb:
> Meine Frage ist nun: ENTPRELLEN... im Internet findet man tausende
> Philosopienen (die einfachste ist ein delay).

Im Internet findet man leider viel Müll und nur wenige Perlen.
Der Grund ist, daß viele das Problem nicht verstehen (wollen) und 
Entprellen für popeleinfach halten, was man ohne Überlegen einfach so 
hinrotzen kann.

Tekkineo T. schrieb:
> Allerdings würde ich gerne
> eine Lösung anstreben, die für diesen Anwendungsfall passt

Das ist der falsche Ansatz. Da muß man ja bei jedem Programm von neuem 
darüber nachdenken, d.h man verschwendet nur unnötig Entwicklungszeit.
Besser ist eine Lösung, die für jeden Anwendungsfall paßt und so wenig 
wie möglich Seiteneffekte hat.

von Stefan F. (Gast)


Lesenswert?

Was genau bedeutet "ein anderer Reboot"?

Worin unterscheiden sich die beiden Reboot's und reden wir wirklich vom 
Rebooten im Sinne des "reboot" Kommandos?

Warum du da etwas entprellen willst, ist mir völlig rätselhaft. Man muss 
Taster nur entprellen, wenn die ANzahl der Tastendrücke eine Rolle 
spielt. Also wenn man damit zum Beispiel die Zeit einer Uhr einstellt.

Ich verstehe deinen Anwendungsfall aber so: Jeder Taster löst genau eine 
Reaktion aus. Dann mach das doch. Was gibt es da zu entprellen? Bis der 
Rechner rebootet hat, ist der Taste schon laaaaaange fertig mit Prellen.

von Peter D. (peda)


Lesenswert?

Stefan U. schrieb:
> Was gibt es da zu entprellen?

Ach das hatten wir doch schon 1000 mal erklärt.

von Stefan F. (Gast)


Lesenswert?

> Ach das hatten wir doch schon 1000 mal erklärt.

Der Tekkineo kennt deine Entprellroutine und vor allem die Erklärungen 
dazu offensichtlich noch nicht. Sonst hätte er warscheinlich nicht 
gefragt.

@Tekkineo: Such mal nach "Peter Dannegger Entprellen", der hat sich mit 
dem Thema wirklich intensiv auseinandergesetzt und eine Menge gutes dazu 
geschrieben.

Allerdings sehe ich in dieser konkreten Anwendung tatsächlich keinen 
Bedarf, überhaupt zu entprellen. Vielleicht liegt es auch daran, dass du 
nur einen Teil des Programmes gezeigt hast.

von Clemens W. (daxmus)


Lesenswert?

Stefan U. schrieb:
> Jeder Taster löst genau eine
> Reaktion aus. Dann mach das doch. Was gibt es da zu entprellen?

Es gibt wohl Anwendungsfälle, da soll eine Taste eine Aktion ausführen, 
aber eben nur einmal pro Drücken.

von Tekkineo T. (tekkineo)


Lesenswert?

Hallo,
nun, einmal soll ein Reboot in Kodi erfolgen und einmal nach Raspian 
bzw. Recalbox. der Pi so an seinen IO "gucken". Jenachdem welcher Io 
eben ausgelöst wird soll ein script starten, dass einen Reboot mit dem 
entsprechend passenden OS ausführt. Daher diese idee.
Grundsätzlich habt ihr recht. Ein Taster soll eine Aktion auslösen. Dass 
man dann diese Taste 5Minuten lang gedrückt hält ist eher 
unwahrscheinlich :). Aber man soll einen Anwender (oder Kinder) nicht 
unterschätzen :).
Ohne entprellen wäre es mir sicherlich lieber, da dann der Aufwand auch 
sinkt (und ich das iwann nachprogrammieren kann. Danke für den Tipp 
bzgl. Peter Dannegger. Ich werde mir das mal zu gemüte füren und hoffe 
etwas schlauer zu werden was die Wissenschaft des Entprellen angeht. 
spätestens bei einem Drehimpulsgeber holt mich das ganze ja doch wieder 
ein...

von Clemens W. (daxmus)


Lesenswert?

Eine Taste wird ja nicht entprellt, weil sie von irgendwem 5Min lang 
gedrückt werden könnte, sondern weil sie auch schon bei einem kurzem 
Druck "schwingt".

Entprellen ist eigtl. keine große Sache und sollte m.M. nach so gut wie 
immer gemacht werden.
Damit schließt man schon einmal eine große Fehlerquelle, bzw. 
ungewolltes Programmverhalten aus und mit der Zeit erachtet man es als 
Routine und kann sich auf den Rest des Programmes, bzw. der Schaltung 
konzentrieren.

von Route_66 H. (route_66)


Lesenswert?

Tekkineo T. schrieb:
> Ich werde mir das mal zu gemüte füren und hoffe
> etwas schlauer zu werden was die Wissenschaft des Entprellen angeht.

Ausserdem solltest du dich dringend schlau machen, was es mit 
Bit-Schiebe-, Bit-Setz- und Bit-Löschbefehlen auf sich hat.

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Da Du ja eh noch Software auf dem RPi brauchst, um die Signale 
auszuwerten, kannst Du die Taster auch gleich an dessen GPIOs hängen. 
Ich weiß nicht, was da ein extra Controller bringen soll.

von Tekkineo T. (tekkineo)


Lesenswert?

@Clemens:
Ja, ich bin auch der Meinung dass die Enptrellung dazu gehört (sicher 
ist eben sicher)... vorteil ist dass ich das Nachträglich ja recht 
einfach implementieren könnte, sofern die Experten hier meinen es ist 
(noch) nicht notwendig.

@Mario:
wie gesagt möchte ich die Steuerung aus zweierlei Gründen realisieren:
Primär: umd den Pi zu entlasten
Sekundär: damit ich mich mit der Materie besser beschäftige

@Route66:
warum meinst du das Bit-Schiebe-, Bit-Setz- und Bit-Löschbefehlen hier 
sehr von vorteil sind?


Nachdem ich heute heim gekommen bin hoffe ich das Programm am WE mal auf 
die schnelle auf den Mega32 spielen zu können und dann mal kurz 
probelaufen zu lassen. Die Beschaltung ist ja recht schnell aufgebaut 
bzw. am STK500 kann ich das ja ganz gut sehen was passiert

: Bearbeitet durch User
von Loran (Gast)


Lesenswert?

1) Beide Tasten lösen den RESET aus.
   Entprellen nicht nötig, muss SOFORT wirken.

2) Beim (Re)-BOOT wird geschaut, welche Taste (noch) gedrückt ist.
   (Default - keine Taste: Code 1.)

3) Es wird gewartet, bis beide Tasten "lange genug" wieder
   losgelassen, also unbetätigt sind (z.B. 100...500 ms), dann
   wird je nach Taste in den gewünschten Code 1 / 2 gesprungen.

Fertig.

Und wenn beide Tasten gedrückt werden, kommt halt was Unbestimmtes
raus. Das kann auch niemand "entprellen"...

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.