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


von Anfänger (Gast)


Lesenswert?

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

1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include "lcd.h"
4
5
6
int main(void) {
7
lcd_init();
8
while(1) {
9
DDRB = 0x00;
10
11
12
switch (PORTB) 
13
{
14
    case 0b00000001:
15
        lcd_clear();
16
    set_cursor(1,1);
17
    lcd_string("-");
18
    _delay_ms(120);
19
   
20
    case 0b00000010:
21
        lcd_clear();
22
    set_cursor(1,2);
23
    lcd_string("-");
24
    _delay_ms(120);
25
        
26
  case 0b00000100:
27
    lcd_clear();
28
    set_cursor(1,3);
29
    lcd_string("-");
30
    _delay_ms(120);
31
32
  case 0b00001000:
33
    lcd_clear();
34
    set_cursor(1,4);
35
    lcd_string("-");
36
    _delay_ms(120);
37
38
}
39
40
41
42
43
44
45
46
47
48
49
50
51
52
}
53
return 0;
54
}

von Oliver (Gast)


Lesenswert?

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

Oliver

von Ne_Ne (Gast)


Lesenswert?

unsigned char uPortB;

 uPortB = PORTB;

 switch (uPortB )
 .
 .
 .

von Stephan (Gast)


Lesenswert?

Falsch.
In C kann man kein Binärformat darstellen!

von Martin Schneider (Gast)


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

von Anfänger (Gast)


Lesenswert?

break :-) danke

von Simon K. (simon) Benutzerseite


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.

von der peterle (Gast)


Lesenswert?

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

von Stephan (Gast)


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.

von Stephan (Gast)


Lesenswert?

Jeder C-Compiler heisst für dich wohl gcc?

von Johannes M. (johnny-m)


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...)

von Bastler (Gast)


Lesenswert?

1
switch (baud_select)
2
{
3
  case 1:
4
  {    
5
     set_baud(115200);          
6
     break;
7
  }
8
  
9
  case 2:      
10
  {
11
     set_baud(57600);
12
     break;
13
  }
14
}

von Stephan (Gast)


Lesenswert?

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

von Gast (Gast)


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.

von Johannes M. (johnny-m)


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.

von der peterle (Gast)


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.

von Johannes M. (johnny-m)


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.

von der peterle (Gast)


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. ;)

von Peter D. (peda)


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:
1
if( PINB & 1<<0 )
2
  mache dies
3
if( PINB & 1<<1 )
4
  mache das
5
if( PINB & 1<<2 )
6
  mache jenes
7
...


Peter

von Sven P. (Gast)


Lesenswert?

Wenns wirklich Bitmuster sein müssen (und ja, auch dafür gibt es absolut 
rechtfertigende Umstände):
1
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 :-)

von Stephan (Gast)


Lesenswert?

wtf :)

von Bernhard M. (boregard)


Lesenswert?

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

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

von Stephan (Gast)


Lesenswert?

Danke, jetzt hab auch ich's begriffen.

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.