Switch Case Anweisung

Gast #2751025
Hallo,
möchte eine Switch Case Anwendung verwenden. Das Programm hat nur die 
Funktion das wenn ich Schalter1 drücke LED 1 Leuchtet... Benütze das 
STK500 und einen Atmega 8. Das Problem ist es leuchtet immer irgendeine 
LED (nach reset ist es meistens eine andere) und es ändert sich nichts 
wenn ich einen Schaltern drücke.
1
#include <avr/io.h>
2
#include <util/delay.h>    //Libary für "_delay_ms()"
3

4
int main(void)
5
{
6
  DDRD=0xff;  //DDRD (LED´s) AUSGANG
7
  DDRB=0x00;  //DDRB (Schalter) EINGANG
8
  PORTD=0xff;  //PORTD (LED´s) PULL-UP Widerstand EIN
9
  PORTB=0xff;  //PORTB (Schalter) PULL-UP Widerstand EIN
10
   
11
    while(1)
12
    {
13
       switch (PINB)
14
     {
15
       case (255):
16
       PORTD=0b01010101;
17
       break;
18
       case (254):
19
       PORTD=0b11111110;
20
       break;
21
       case (253):
22
       PORTD=0b11111101;     
23
       break;
24
       case (251):
25
       PORTD=0b11111011;     
26
       break;
27
       case (247):
28
       PORTD=0b11110111;
29
       break;
30
       case (239):
31
       PORTD=0b11101111;
32
       break;
33
       case (223):
34
       PORTD=0b11011111;       
35
       break;
36
       case (191):
37
       PORTD=0b10111111;     
38
       break;
39
       case (127):
40
       PORTD=0b01111111;     
41
       break;
42
     }     
43
    }
44
}
#2751042
Was ist, wenn du ganz einfach mal das PinB Register auf das PORTD 
Register ausgibst
1
int main(void)
2
{
3
  DDRD=0xff;  //DDRD (LED´s) AUSGANG
4
  DDRB=0x00;  //DDRB (Schalter) EINGANG
5
  PORTD=0xff;  //PORTD (LED´s) PULL-UP Widerstand EIN
6
  PORTB=0xff;  //PORTB (Schalter) PULL-UP Widerstand EIN
7
   
8
  while(1)
9
  {
10
    PORTD = PINB;
11
  }
12
}

entsprechen die LED dann deinen Tasterzuständen?
(Hast du die Taster richtig angeschlossen?)
#2751064
Anfänger schrieb:
> möchte eine Switch Case Anwendung verwenden. Das Programm hat nur die
> Funktion das wenn ich Schalter1 drücke LED 1 Leuchtet

Dann ist Switch Case der falsche Ansatz!
Es nimmt den ganzen Port und das willst Du nicht.

Du willst eine Taste, dann nimm auch nur das eine Bit:
1
  if( !(PINB & 1<<0) ){
2
    // mache was wenn Pegel 0 an Pin B0
3
  }
4
  // usw.
5
  if( !(PINB & 1<<7) ){
6
    // mache was wenn Pegel 0 an Pin B7
7
  }


Peter
Gast #2751101
Danke jetzt funktionierts weiss aber gar nicht genau was ich geändert 
habe :-)

Wie macht ihr das wenn ihr einen bestimmten Port z.B. PB4 abfragen wollt 
und den zustand an z.B. PC2 übergeben wollt.
#2751115
Anfänger schrieb:

> Wie macht ihr das wenn ihr einen bestimmten Port z.B. PB4 abfragen wollt
> und den zustand an z.B. PC2 übergeben wollt.


Gneau so, wie du das da hingeschrieben hast.
Wir nehmen erst mal den ganzen Port

     PINB

und setzen dann von diesem Ergebnis gezielt alle Bits ausser dem 
interessierenden auf 0

     PINB & ( 1 << PB4 )

und wenn da etwas anderes als 0 rauskommt, dann wird eben PC2 auf 1 
gesetzt, bzw. wenn 0 rauskommt, dann wird PC2 auf 0 gesetzt

    if( PINB & ( 1 << PB4 ) )
      PORTC |= ( 1 << PC2 );
    else
      PORTC &= ~( 1 << PC2 );


*** Bitmanipulation ***

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.