Forum: Mikrocontroller und Digitale Elektronik MSP430 Fragen/Probleme rund um PCF8574


von Martin (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade einen PCF8574 an meinem MSP ans Laufen zu bekommen. 
Das funktioniert eigentlich auch soweit. Ich habe an die Ports P4-P7 
LEDs angeschlossen und an die anderen Ports Taster. Ich kann die LEDs 
zum Leuchten bringen und die Taster abfragen. Zur Kontrolle habe ich ein 
Programm geschrieben, mit welchem man mit jedem Taster eine LED 
anschalten kann. Im Moment bin ich soweit, dass bei jedem Tastendruck 
die entsprechende LED an geht und auch die LEDs, die bereits an sind an 
bleiben.

Nun würde ich das ganze gerne so erweitern, dass die LEDs bei 
entsprechendem Tastendruck auch wieder aus gehen. Ich drücke also Taster 
1 -> LED 1 geht an, erneutes Drücken von Taster 1 -> LED 1 geht wieder 
aus. Allerdings hab ich keine Idee, wie man das umsetzen könnte. Ich 
hatte überlegt für jede LED eine Variable anzulegen, um zu speichern, ob 
die LED gerade an ist. Das ginge sicherlich, aber geht es nicht 
vielleicht auch noch einfacher, effizienter? Hat jemand eine Idee?

Hier einmal ein Teil des Codes:
1
  for(;;)
2
  {      
3
      input= pcf8574_get_inputs(0x20);
4
      in= input;
5
      switch (in|=0xF0)          // |=0xF0 dient als Maske, damit nur die ersten 
6
                                 // vier Bit (Port 0-3) des PCF8574 ausgewertet
7
                                 // werden
8
      {
9
          case 254:
10
              pcf8574_set_outputs(0x20, input & 0xEF | 0x0F);
11
              break;
12
          case 253:
13
              pcf8574_set_outputs(0x20, input & 0xDF | 0x0F);
14
              break;
15
          case 251:
16
              pcf8574_set_outputs(0x20, input & 0xBF | 0x0F);  
17
              break;
18
          case 247:
19
              pcf8574_set_outputs(0x20, input & 0x7F | 0x0F);
20
              break;       
21
      }/* switch (input|=0xF0) */
22
  }/* for(;;) */

Grüße

Martin

von Falk B. (falk)


Lesenswert?

@Martin (Gast)

>anschalten kann. Im Moment bin ich soweit, dass bei jedem Tastendruck
>die entsprechende LED an geht und auch die LEDs, die bereits an sind an
>bleiben.

Wo ist dann das Problem?

>Nun würde ich das ganze gerne so erweitern, dass die LEDs bei
>entsprechendem Tastendruck auch wieder aus gehen. Ich drücke also Taster
>1 -> LED 1 geht an, erneutes Drücken von Taster 1 -> LED 1 geht wieder
>aus.

Das kann man leicht per Flankendetetktion und Variable machen.

Tasten periodisch abragen und speichern
Wenn alte Taste = 1 und neue = 0 -> Vairable invertieren
LEDs periodisch ausgeben

>hatte überlegt für jede LED eine Variable anzulegen, um zu speichern, ob
>die LED gerade an ist. Das ginge sicherlich, aber geht es nicht
>vielleicht auch noch einfacher, effizienter? Hat jemand eine Idee?

Pack deine LEDs und Tasten in ein Byte. Per Bitmanipulation kann man 
die Zustände abfragen und schreiben.

>Hier einmal ein Teil des Codes:  for(;;)

Uhhhh, das ist megaumständlich und ineffizient. Schau dir den Artikel 
oben an und setze es um.

MFG
Falk

von Klaus R. (klara)


Lesenswert?

Hallo,
ganz einfach nach jedem Tastendruck den Zustand der LED´s abfragen und 
den Status negieren.

Sind die Taster OK oder prellen sie? Sonst müsste man das Prellen 
mittels Verzögerung und Totzeit entschärfen.

Gruss Klaus.

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.