mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Switch case geht nicht auf MC


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bin neu in MC un mein Switch case geht nicht kann mir jemand 
helfen?

#include <util/delay.h>
#include <avr/io.h>
#include "lcd.h"


int main(void) {
lcd_init();
while(1) {
DDRB = 0x00;


switch (PORTB) 
{
    case 0b00000001:
        lcd_clear();
    set_cursor(1,1);
    lcd_string("-");
    _delay_ms(120);
   
    case 0b00000010:
        lcd_clear();
    set_cursor(1,2);
    lcd_string("-");
    _delay_ms(120);
        
  case 0b00000100:
    lcd_clear();
    set_cursor(1,3);
    lcd_string("-");
    _delay_ms(120);

  case 0b00001000:
    lcd_clear();
    set_cursor(1,4);
    lcd_string("-");
    _delay_ms(120);

}













}
return 0;
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du schreibst zwar nicht, was nicht geht, aber hier und da ein "break;" 
eingefügen könnte helfen.

Oliver

Autor: Ne_Ne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char uPortB;

 uPortB = PORTB;

 switch (uPortB )
 .
 .
 .

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsch.
In C kann man kein Binärformat darstellen!

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau geht denn nicht?
Compilerfehler?
Gar keine Ausgabe?
Falsche Ausgabe?

Funktioniert eine simple Textausgabe?

Vielleicht kannst du mal genaueres schreiben,
so wird es eher Kristallkugel-Lesen...

Martin

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
break :-) danke

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Einlesen eines Ports musst du das PINx Register benutzen und nicht 
das PORTx Register.
Binäre Konstanten gehen wohl, zumindest beim GCC mit vorhandenem Patch.
Und Die Sache mit uPortB wird vermutlich auch genau den gleichen Code 
kompilieren, wie das andere.

Autor: der peterle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Falsch.
> In C kann man kein Binärformat darstellen!
Öh, laut C-Standard nicht, aber eigentlich kann das jeder C-Compiler
dann doch. ;-)

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem Sachen wie 0birgendwas gehören nicht zum C-Programmieren.
Schliesslich ist er Anfänger und will bestimmt Ansi-C und nicht 
irgendeinen "Frickler"-Dialekt lernen.

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jeder C-Compiler heisst für dich wohl gcc?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan wrote:
> Jeder C-Compiler heisst für dich wohl gcc?
Der GCC kann das auch noch gar nicht so lange...

Abgesehen davon kann die Binärdarstellung in einigen Fällen Sinn 
machen, wenn es tatsächlich um Bitmuster geht. Und mit Bitmustern hat 
man im µC-Bereich des öfteren zu tun. (Ich selbst nutze die 
Binärschreibweise allerdings so gut wie gar nicht...)

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
switch (baud_select)
{
  case 1:
  {    
     set_baud(115200);          
     break;
  }
  
  case 2:      
  {
     set_baud(57600);
     break;
  }
}

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nicht gesagt das sowas sinnlos ist. Nicht Standardkonform zu 
programmieren ist jedoch sehr wohl NICHT SINNVOLL.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach mit der hexadezimalen Darstellung vertraut machen.
Die kann wirklich jeder C compiler und nach etwas Übung "sieht" man 
hinter jeder Hex-Zahl auch das Bitmuster.

Geht mir jedenfalls so.

Btw. sollten die Magic Numbers durch Defines ersetzt werden.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan wrote:
> Ich habe nicht gesagt das sowas sinnlos ist. Nicht Standardkonform zu
> programmieren ist jedoch sehr wohl NICHT SINNVOLL.
In diesem Zusammenhang widersprichst Du Dir in diesem Satz selbst...

Es gibt auf 8-Bit-µC-Plattformen mittlerweile praktisch keinen Compiler 
mehr, der das nicht kann. Und angesichts der sonstigen besonderen 
Anforderungen bei Embedded-System-Programmierung sind ein paar 
nicht-Standard-Erweiterungen sowieso fast unumgänglich. Und zumindest in 
der Hinsicht ist der AVR-GCC noch harmlos.

Ich bin auch ein Freund weitgehend standardkonformer Programmierung, 
aber es gibt nunmal je nach Plattform Dinge, die ein Compiler, dessen 
Sprachstandard sich auf die Programmierung ganz anderer Plattformen (PC) 
bezieht, nicht bringt. Auf einem PC jucken einzelne Bits praktisch 
niemanden, auf einem 8-Bit-µC aber durchaus.

Autor: der peterle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Jeder C-Compiler heisst für dich wohl gcc?
Da ich Linux nutze und ab, zu in meiner Freizeit ATmegas programmiere
und früher unter Windows DevCPP benutze habe... Ja. ;-)
Die Verbreitung habe ich aber wirklich überschätzt, der Compiler vom
CodeComposer meckert, Visual Studio meckert...
Und das man dem Standard folgen sollte ist auch richtig.

> Abgesehen davon kann die Binärdarstellung in einigen Fällen Sinn
> machen, wenn es tatsächlich um Bitmuster geht. Und mit Bitmustern hat
> man im µC-Bereich des öfteren zu tun. (Ich selbst nutze die
> Binärschreibweise allerdings so gut wie gar nicht...)
Ich früher nur am Anfang, jetzt ist es dann doch immer Hex und dann
auch noch oft über ein define. ;-)

@ Bastler (Gast)
Die geschweiften Klammern braucht man nicht, habe ich so auch noch nie
gesehen... würde mich wohl eher verwirren.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Einfach mit der hexadezimalen Darstellung vertraut machen.
> Die kann wirklich jeder C compiler und nach etwas Übung "sieht" man
> hinter jeder Hex-Zahl auch das Bitmuster.
Das ist in diesem Fall sicher die beste Methode, die ich selbst auch 
empfehle.

Autor: der peterle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> @ Bastler (Gast)
> Die geschweiften Klammern braucht man nicht, habe ich so auch noch nie
> gesehen... würde mich wohl eher verwirren.
Ich beziehe mich auf die Klammern in der switch-case-Anweisung... nicht
auf die anderen. ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Hauptfehler dürfte sein, daß er davon ausgeht, daß alle anderen Pins 
0 sind.

Wenn nur ein Pin interessiert, dann darf man auch nur diesen einen 
testen, d.h. switch ist hier völlig fehl am Platze.
Z.B. so:
if( PINB & 1<<0 )
  mache dies
if( PINB & 1<<1 )
  mache das
if( PINB & 1<<2 )
  mache jenes
...


Peter

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns wirklich Bitmuster sein müssen (und ja, auch dafür gibt es absolut 
rechtfertigende Umstände):
for i in `seq 0 255`; do echo -n "#define B"; for b in `seq 7 -1 0`; do if [ $(($i & (1 << $b))) -gt 0 ]; then echo -n "1"; else echo -n "0"; fi; done; echo -e "\t\t$i"; done

Richtig schön ineffizient, aber funktioniert :-)

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wtf :)

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. wrote:
> Wenns wirklich Bitmuster sein müssen (und ja, auch dafür gibt es absolut
> rechtfertigende Umstände):
>
>
> for i in `seq 0 255`; do echo -n "#define B"; for b in `seq 7 -1 0`; do
> if [ $(($i & (1 << $b))) -gt 0 ]; then echo -n "1"; else echo -n "0";
> fi; done; echo -e "\t\t$i"; done
> 
>
> Richtig schön ineffizient, aber funktioniert :-)

Klasse, generiert einem die defines, das kann man brauchen....
#define B00000000               0
#define B00000001               1
#define B00000010               2
#define B00000011               3
#define B00000100               4
#define B00000101               5
...
#define B11111011               251
#define B11111100               252
#define B11111101               253
#define B11111110               254
#define B11111111               255

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, jetzt hab auch ich's begriffen.

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.