Forum: Mikrocontroller und Digitale Elektronik Case-Abfrage


von Luni (Gast)


Lesenswert?

Hallo zusammen,

hab mal eine Frage zu meine Programm.

Zuerst mal der Code dann zu meinem Problem (=
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
#include "types.h"
4
5
#include "usart.h"
6
#include <avr/common.h>
7
8
9
void Zeitabfrage (Helligkeit)
10
11
{
12
13
//  s08 Helligkeit;
14
  
15
  Zeit = PINC; //vom a-Bit-Zähler
16
  PORTC = Zeit;  //Kontrolle ob der Wert übernommen wurde
17
  Helligkeit = PORTD;
18
//  NOP();
19
20
  switch (Zeit)
21
  {
22
  case 0x00: 
23
      break;
24
  case 0x01: 
25
      break;
26
  case 0x02: 
27
      break;
28
  
29
  case 0b00000011:
30
      Helligkeit = Helligkeit + 1;
31
      break;
32
33
  case 0x04:
34
      Helligkeit = Helligkeit++;
35
      break;
36
37
  case 0x05:
38
      Helligkeit = Helligkeit + 2;
39
      break;
40
41
  case 0x06:
42
      Helligkeit = Helligkeit + 2;
43
      break;
44
45
  case 0x07:
46
      Helligkeit = Helligkeit + 2;
47
      break;
48
49
  case 0x08:
50
      Helligkeit = Helligkeit++;
51
      break;
52
53
  case 0x0A ... 0x0B: 
54
      break;
55
56
  case 0x0C:
57
      Helligkeit = Helligkeit--;
58
      break;
59
60
  case 0x0D:
61
      Helligkeit = Helligkeit--;
62
      Helligkeit = Helligkeit--;
63
      break;
64
65
  case 0x0E:
66
      Helligkeit = Helligkeit--;
67
      Helligkeit = Helligkeit--;
68
      break;
69
70
  case 0x0F:
71
      Helligkeit = Helligkeit--;
72
      Helligkeit = Helligkeit--;
73
      break;
74
75
  case 0x10:
76
      Helligkeit = Helligkeit--;
77
      break;
78
79
  case 0x11:
80
      Helligkeit = Helligkeit--;
81
      break;
82
83
  case 0x12 ... 0x14:
84
      break;
85
  }
86
87
  PORTD = Helligkeit;
88
  Zeit = 0x00;  //Test das die Variable wieder auf 0 ist.
89
}

Also wenn ich den Wert 0x03 an PINC anlege springt das Programm in das 
case 0x08!

kann mir hier jemand weiterhelfen, hab es mit der 0bxxxx und der 
dezimalen schreibweise versucht.
Jedoch leiter ohne Erfolg.

Vielen dank im voraus.

LG

von Oliver R. (orb)


Lesenswert?

Luni schrieb:
> Zeit = PINC; //vom a-Bit-Zähler
> PORTC = Zeit;  //Kontrolle ob der Wert übernommen wurde

Die Konstruktion verstehe ich nicht ganz, wie ist denn DDRC gesetzt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Luni schrieb:
> Helligkeit = Helligkeit++;

Bist Du Dir sicher, daß Du damit das erreichst, was Du damit vermutlich 
erreichen möchtest?

von Dr. Sommer (Gast)


Lesenswert?

Luni schrieb:
> Helligkeit = Helligkeit--;
> Helligkeit = Helligkeit++;
wtf? diese zeilen sind wirkungslos, kannst du löschen.

von Achim S. (Gast)


Lesenswert?

Luni schrieb:
> Also wenn ich den Wert 0x03 an PINC anlege springt das Programm in das
> case 0x08!

woran siehst du das, am Debugger?

Da für die Eingaben 3, 4 und 8 jeweils genau das gleiche passiert 
(Helligkeit wird um 1 erhöht) hat sich der Compiler vielleicht gedacht, 
dass er die drei Fälle zusammenlegen kann. Das spart Codespeicher, im 
Debugger kann es aber etwas verwirrend aussehen.

von Dr. Sommer (Gast)


Lesenswert?

Achim S. schrieb:
> Da für die Eingaben 3, 4 und 8 jeweils genau das gleiche passiert
> (Helligkeit wird um 1 erhöht
Nein, 3 erhöht die Helligkeit um 1, 4 und 8 machen gar nichts.

von Achim S. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Nein, 3 erhöht die Helligkeit um 1, 4 und 8 machen gar nichts.

Hoppla, stimmt. Ich hätte genauer hinschauen sollen.

Dann ist die Beobachtung von Luni allerdings wirklich verwunderlich:

Luni schrieb:
> Also wenn ich den Wert 0x03 an PINC anlege springt das Programm in das
> case 0x08!

Schade, meine falsche Interpretation hätte schön zu einer 
Compileroptimierung gepasst ;-)

von Roland .. (rowland)


Lesenswert?

Ist "i = i++" überhaupt definiert? Mir kommt vor, ich habe in einem 
C-Buch mal gelesen, dass es undefiniert sein, kann mich aber 
auchirren...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Konstrukte wie X = X++ haben in C kein definiertes Verhaulten!

von Bastler (Gast)


Lesenswert?

Der Compiler scheint aber zu ahnen, was gemeint war und optimiert dann 
entsprechend bis zum vorgefunden Ergebnis. Bin immer wieder überrascht, 
was der GCC so kann. Ich würde allerdings mal die Warnings anschauen. 
Die geben mir oft wichtige Hinweise, was ich besser änderst schreiben 
sollte ;-)

von Luni (Gast)


Lesenswert?

Oliver R. schrieb:
> Die Konstruktion verstehe ich nicht ganz, wie ist denn DDRC gesetzt?

Diese Konstruktion ist für mich im Debugger hilfreich um zu sehen ob der 
uC wirklich das macht was er soll.


Rufus Τ. Firefly schrieb:
> Bist Du Dir sicher, daß Du damit das erreichst, was Du damit vermutlich
> erreichen möchtest?

Jap leider, hatte nicht dran gedacht dass ich das definieren muss, 
jedoch hat er mir das ausgeführt was ich erreichen wollte, werde ich 
aber noch ändern.


Achim S. schrieb:
> Da für die Eingaben 3, 4 und 8 jeweils genau das gleiche passiert
> (Helligkeit wird um 1 erhöht) hat sich der Compiler vielleicht gedacht,
> dass er die drei Fälle zusammenlegen kann. Das spart Codespeicher, im
> Debugger kann es aber etwas verwirrend aussehen.

sieht das in diesem Fall so aus?
1
case 0x03, 0x08, 0x09:
2
       .....

kann es leider nicht testen muss arbeiten.

von Ein Gast (Gast)


Lesenswert?

Luni schrieb:
> hab mal eine Frage zu meine Programm.

Ich auch. Wofür bindest du "types.h", wenn weder "Zeit" noch 
"Helligkeit" einem Variablentyp zugeordnet sind.

Verheimlichst du uns da irgendetwas?

von Luni (Gast)


Lesenswert?

nein, es ist nur ein eigenes c-file, damit ich die übersicht behalte!
dieses file gehört zu größeren, adc, uart. habe dies aufgesplittet.

lg

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.