Forum: Mikrocontroller und Digitale Elektronik switch case geht nicht


von Frank (Gast)


Lesenswert?

Hallo ich versuche mich seit neustem in C mit AVR Studio und möcht damit 
einen atmaga8 programieren. Ich habe ein Quelltext geschreiben aber 
bekomme ihn nicht zum laufen ( Build failed with 5 errors and 2 
warnings... ).
Die switch case anweisung soll den wert von PORT D verarbeiten und dann 
in den  passenden case gehen und die passenden Ausgänge an PIN B auf 1 
setzen.
BRAUCHE HILFE BITTE!!!!!!!!

#include <stdint.h>
#include <avr/io.h>

uint8_t sp1;

int main (void) {

   DDRB  = 0xff;
   DDRD  = 0x00;
   PORTD = 0xff;


  while(1)
    {

   PIND = sp1;

         switch (sp1)
         {
         case '0x01';
         0x01 = PORTB;
         break;



      case '0x02'
      0x02 = PORTB;
      break;

         default;
         }
       }
return 0;
}

von Peter (Gast)


Lesenswert?

von welcher Programmiersprache kommt du?


In C versucht die Anweisung einer Konstanten einen wert zuzuweisen

0x02 = PORTB;

richtig ist:

PORTB = 0x02


Im Case verwendest du '0x01', warum die ''. In C bedeutet das, das es im 
ein einzelnen zeichen geht. Hier geht es um zahlen also ' weglassen.

PIND = sp1;

ist auch falsch rum.

von Nico E. (masta79)


Lesenswert?

>          switch (sp1)
>          {
>          case '0x01';
>          0x01 = PORTB;
>          break;
>
>
>
>       case '0x02'
>       0x02 = PORTB;
>       break;

vermutlich willst du wohl eher
1
switch (sp1) {
2
  case 0x01:
3
    PORTB = 0x01;
4
    break;
5
  case 0x02:
6
    PORTB = 0x02;
7
    break;
8
}

je nachdem was du genau machen willst reicht da aber auch einfaches
1
PORTB = PINB & 0x03;

Das würde dann auch funktionieren wenn PINB.0 und PINB.1 gesetzt sind.

von Zoltan R. (Firma: cool-robotix) (cool-robotix) Benutzerseite


Lesenswert?

switch sieht etwa so aus:
1
//schnipp
2
3
unsigned char i;
4
unsigned char j;
5
6
i = 5;
7
j = 0x00;
8
9
switch (i){
10
11
case 1:  break;
12
13
case 2: j= 4;
14
        break;
15
case 3:
16
case 4: j= 6;
17
       break;
18
19
case 5: j=0x10;
20
        break;
21
22
default: break;
23
}
24
25
//schnapp


also hast du in deinem Code folgendes vergessen:

- default etwas zuweisen (wenn es auch nur ein break ist).
- nach case + Wert  KEIN Semikolon!
- siehe Peters Bemerkungen


--------------------------------

EDIT: Nico war schneller :-)

von Frank (Gast)


Lesenswert?

Ich komme aus der Elektrotechnik und habe noch nicht so viel erfahrung 
mit C

habe alles gemacht aber ich habe immer noch ein error:







#include <stdint.h>
#include <avr/io.h>

uint8_t sp1;





int main (void) {

   DDRB  = 0xff;
   DDRD  = 0x00;
   PORTD = 0xff;


  while(1)
    {

    sp1 = PIND;

         switch (sp1)
         {
         case 0x01:
         PORTB = 0x01;
         break;



      case 0x02:
      PORTB = 0x02;
      break;

         default;
         }
       }






return 0;
}

von Peter (Gast)


Lesenswert?

auf den ersten blick finde ich keinen Fehler, die Fehlermeldung mit der 
Passende Zeile könnte da weiter helfen.

von Mikes (Gast)


Lesenswert?

1
default;
so nicht, sondern so:
1
default:

von Peter (Gast)


Lesenswert?

default: break;

von Frank (Gast)


Lesenswert?

default:
  break;



das hatte ich vergessen danke für die Hilfe jetzt geht es

von yxcv (Gast)


Lesenswert?

Hi,

packe deinen Code bitte in die dafür vorgesehene Formatierung und 
generell solltest du dir das Einrücken angewöhnen, liest sich 
angenehmer. ;-)

Kennst du http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial 
schon?
Diesen Artikel zu lesen, würde dir viele Fragen und Zeit ersparen.

Gib uns bitte die Fehlerausgabe, das wäre sehr hilfreich und dafür ist 
sie ja auch da. ;-)

cu

EDIT: Ah, zu spät. :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal ganz genau Deine case-Labels an.

Was steht da?
1
case '0x01';

Mal vom an dieser Stelle auch syntaktisch fehlerhaften Semikolon 
abgesehen, steht da eine sehr merkwürdige char-Konstante.

Du meinst aber mit absoluter Sicherheit das hier:
1
case 0x01:

Dasselbe tritt auch bei "default" auf, bei "case '0x02'" fehlt das 
Semikolon bzw. der richtige Doppelpunkt.


Was spricht eigentlich dagegen, Dir die Fehlermeldungen des Compilers 
anszusehen?

Der wird genau diese Schlampereien bemängeln.

von ich (Gast)


Lesenswert?

Deine C Grundlagen-Hilfe muss ja grotten schlecht sein, wenn beim switch 
case Bsp so viel Syntaxfehler drin sind .....

von Simon K. (simon) Benutzerseite


Lesenswert?

Dir Variable sp1 ist bei dir global, was sie aber nicht sein muss.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>default etwas zuweisen (wenn es auch nur ein break ist).
Wenn sowas dasteht
1
default:   
2
   break;
dann lass ich das lieber ganz weg...

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.