mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ich brauche hilfe, um folgendes Programm entsprechend zu erweitern


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen und Frohe Weihnachten erstmal.
Das folgende Programm soll mit Taster1 die LED1 ansteuern, mit Taster2 
die LED2 und mit Taster3 LED1 und LED2.
Was ich gerne miteinbauen würde, aber nicht wirklich drauf komme ist, 
das wenn mehr als ein Taster gedrückt wird, also Taster1 und 2 oder 
Taster 1 und 3 oder Taster 2 und 3 oder alle drei taster zusammen, keine 
LED gehen soll.
Das PRogramm sieht wie folgt aus:

#include <avr/io.h>

int main(void){

DDRD=0b11110000;

   while(1){
      if(PIND&(1<<PIND2))
        PORTD|=(1<<PD5);
      else PORTD&=~(1<<PD5);

      if(PIND&(1<<PIND3))
        PORTD|=(1<<PD6);
      else PORTD&=~(1<<PD6);

      if(PIND&(1<<PIND4))
        PORTD|=(1<<PD5)|(1<<PD6);
      else PORTD&=~(1<<PD5)|(1<<PD6);

      if(PIND&(1<<PIND2)&&(1<<PIND3) || (1<<PIND2)&&(1<<PIND4) || 
(1<<PIND3)&&(1<<PIND4))
        PORTD&=~(1<<PD5)|(1<<PD6);
      }
return0;
}

Der reine Teil wos ums anschalten geht Funktioniert bei mir. Einen 
fehler den ich gerade gefunden habe ist, das ich die Pins 0bis3 als 
eingang und die Pins 4 bis 7 als Ausgänge definiert habe, funktionieren 
tut das aber trozdem mit dem taster an PD4. Wieso?
Also mir geht es um die letzte if bedingung. Ich kann mir denken, dass 
man das noch viel Professioneller schreiben kann, aber ich steh noch am 
Anfang, deshalb wäre ich um eine Professionelle schreibweise dankbar, 
aber nicht böse wenns auch nur einfach simpel gehen würde.

Mfg und nen guten rutsch schonmal im Vorraus

JEns

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für den Zweck eignet sich besser ein switch + case Konstrukt.

switch(PIND){

//PD0
case 0x01:
PORTD |= 0x01;
break;

//PD1
case 0x02:
PORTD |= 0x02;
break;

//PD2
case 0x04:
PORTD |= 0x04;
break;

....

default:
PORTD = 0x00;
}

Allerdings baust du damit eine Priorität ein. Der erste Fall der 
zutrifft wird ausgeführt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>

#define KEY0    (1<<PD2)
#define KEY1    (1<<PD3)
#define KEY2    (1<<PD4)

#define LED0    (1<<PD5)
#define LED1    (1<<PD6)


int main()
{
  DDRD = LED0 | LED1;
  for(;;){
    switch( PIND & (KEY0 | KEY1 | KEY2 )){
      case KEY0: PORTD |= LED0;
                 break;

      case KEY2: PORTD |= LED0;

      case KEY1: PORTD |= LED1;
                 break;

      default:   PORTD &= ~(LED0 | LED1);
    }
  }
}


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Allerdings baust du damit eine Priorität ein. Der erste Fall der
> zutrifft wird ausgeführt.

Nö.

Bei einem Switch müssen sich alle Case gegenseitig ausschließen, sonst 
kriegst Du vom Compiler was auf den Deckel.


Peter

P.S.:
Ist es wirklich so schwer die Postingregeln (Formatierung) zu lesen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach dir eine Wahrheitstabelle mit allen Eingaben und Ausgaben

PIND4    PIND3    PIND2
Taster1  Taster2  Taster3   LED1  LED2
======================================
1        0        0         1     0
1        1        0         0     0
1        1        1         0     0
1        0        1         0     0
0        1        0         0     1
0        1        1         0     0
0        0        1         1     1
0        0        0         0     0

Dann quetschst du das ein ein großes Switch und fasst die identischen 
Fälle zusammen
#include <avr/io.h>

int main(void)
{
  DDRD = 0b11110000;
  while (1) 
  { 
    switch( (PINC & ((1<<PIND4)|(1<<PIND3)|(1<<PIND2))) )
    {
      case (1<<PIND4)|(0<<PIND3)|(0<<PIND2):
        PORTD |= (1<<PD5);
        PORTD &= ~(1<<PD6);
        break;
      case (0<<PIND4)|(1<<PIND3)|(0<<PIND2):
        PORTD &= ~(1<<PD5);
        PORTD |= (1<<PD6);
        break;
      case (0<<PIND4)|(0<<PIND3)|(1<<PIND2):
        PORTD |= (1<<PD5);
        PORTD |= (1<<PD6);
        break;
      // case (1<<PIND4)|(1<<PIND3)|(0<<PIND2):
      // case (1<<PIND4)|(1<<PIND3)|(1<<PIND2):
      // case (1<<PIND4)|(0<<PIND3)|(1<<PIND2):
      // case (0<<PIND4)|(1<<PIND3)|(1<<PIND2):
      // case (0<<PIND4)|(0<<PIND3)|(0<<PIND2):
      default:
        PORTD &= ~(1<<PD5);
        PORTD &= ~(1<<PD6);
        break;
    }
  }
}

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das dann eher über einen Tabellenzugriff lösen.

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.(einfach) den Port in eine Variable einlesen
2. und die definierten zustände abfragen,
3. else alles aus
4. dann neu einlesen (loop)

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, vielen dank für die Informativen Antworten.
Ich werde mir die alle gleich zu herzen nehmen und hintergründe dazu 
lernen.
Und das mit den Formatierungsregeln tut mir leid.
Habs gelesen und werde es beim nächsten mal zugunsten eurer Nerven 
beherzigen. Möchte ja einen angenehmen Kontakt mit euch Pflegen.

Grüße und Danke Jens

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.