switch case geht nicht

Gast #959555
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;
}
Gast #959559
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.
#959564
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.
(Firma: cool-robotix) Persönliche Seite #959568
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 :-)
Gast #959569
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;
}
Gast #959581
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. :-)
Persönliche Seite #959582
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren