mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik switch case geht nicht


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nico Erfurth (masta79)
Datum:

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

vermutlich willst du wohl eher
switch (sp1) {
  case 0x01:
    PORTB = 0x01;
    break;
  case 0x02:
    PORTB = 0x02;
    break;
}

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

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

Autor: Zoltan R. (Firma: cool-robotix) (cool-robotix) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
switch sieht etwa so aus:

//schnipp

unsigned char i;
unsigned char j;

i = 5;
j = 0x00;

switch (i){

case 1:  break;

case 2: j= 4;
        break;
case 3:
case 4: j= 6;
       break;

case 5: j=0x10;
        break;

default: break;
}

//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 :-)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Peter (Gast)
Datum:

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

Autor: Mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
default;
so nicht, sondern so:
default:

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
default: break;

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
default:
  break;



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

Autor: yxcv (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh Dir mal ganz genau Deine case-Labels an.

Was steht da?
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:
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.

Autor: ich (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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.