Switch case geht nicht auf MC

Gast #1180649
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
}
Gast #1180658
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
#1180685
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...)
Gast #1180698
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.
#1180705
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.
Gast #1180707
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.
Gast #1180709
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. ;)
#1180713
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
Gast #1180728
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 :-)
#1180754
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

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