Forum: Compiler & IDEs Probleme mit Switch Case


von Sebastian S. (sebastian_s25)


Lesenswert?

Hallo

Hab da mal ne Frage. Kann es sein, dass man beim avr eine 
Switchanweisung so nicht programmieren kann?
1
switch(UDR0)
2
  {
3
    case 0xD0 :      // Set Retry
4
    case 0xD1 :      // Set RF Power
5
    case 0xD2 :      // Set Sensing Time
6
    case 0xE0 :      // Set PWM1 compare
7
    case 0xE1 :      // Set PWM2 compare
8
    case 0xE2 :      // Set PWM3 compare
9
    case 0xE3 :      // Set PWM4 compare
10
            Flag = UDR0;
11
      break;
12
13
    default  :
14
      break;
15
  }


Irgendwie bekomm ich da immer nur sch... raus...

mfg
Bastian

von avr (Gast)


Lesenswert?

Wie ist UDR0 definiert?

von Sebastian S. (sebastian_s25)


Lesenswert?

Ah sorry hatte ich vergessen zu erwaehnen

Dieser Codeteil steht in einer USART-ISR und UDR0 ist der Buffer!!

Da hab ich den AVR Standart verwendet.

habs schon getestet, das richtige wuerde ich bekommen...

mfg
Bastian

von Michael R. (dj_motionx)


Lesenswert?

Doch sollte schon funktionieren.
Du musst dir nur klar sein dass Flag = UDR0; immer ausgeführt wird 
sobald UDR0 0xD0, 0xD1, 0xD2, 0xE0, 0xE1,0xE2 oder 0xE3 ist. Ansonsten 
sehe ich nichts verbotenes.

L.g.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Und wenn du "Flag" auch außerhalb der ISR auswerten möchtest, musst du 
die Variable als volatile deklarieren.

von Krapao (Gast)


Lesenswert?

Du kannst so nicht arbeiten. UDR0 ist ein SFR und verloren, wenn es 
einmal ausgelesen und nicht zugewiesen wurde. Die Zuweisung an Flag in 
den case-Anweisungen liest ein neues UDR0 aus und übergibt nicht 
unbedingt den Wert aus der switch-Bedingung.
1
  volatile uint8_t tmp;
2
  switch( (tmp = UDR0) )
3
  {
4
    case 0xD0 :      // Set Retry
5
    case 0xD1 :      // Set RF Power
6
    case 0xD2 :      // Set Sensing Time
7
    case 0xE0 :      // Set PWM1 compare
8
    case 0xE1 :      // Set PWM2 compare
9
    case 0xE2 :      // Set PWM3 compare
10
    case 0xE3 :      // Set PWM4 compare
11
      Flag = tmp;
12
      break;
13
    default  :
14
      break;
15
  }

von Rolf M. (rmagnus)


Lesenswert?

Krapao schrieb:
> volatile uint8_t tmp;

Das volatile ist an dieser Stelle vollkommen überflüssig.

von Krapao (Gast)


Lesenswert?

Technisch ja; mir hilft es beim Lesen des Codes.

von Rolf M. (rmagnus)


Lesenswert?

Es macht den Code halt größer und langsamer und verbraucht mit hoher 
Wahrscheinlichkeit auch etwas mehr RAM.

von Krapao (Gast)


Lesenswert?

Aus dem Bauch raus geschätzt: An der Stelle wird es nix machen.

Das hängt natürlich von der nicht gezeigten Umgebung ab, d.h. wie viele 
Register der Codegenerator gerade noch frei hat. In einer ISR sind 1) eh 
alle gerettet und 2) vielleicht noch nicht so viele in Benutzung.

von Sebastian S. (sebastian_s25)


Lesenswert?

Hey danke fuer die Hilfe!!!

Jetzt weiss ich endlich warums nicht geht!!!

Danke!!

mfg
Bastian

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Sebastian S. schrieb:
> Jetzt weiss ich endlich warums nicht geht!!!

Klär uns auf...

von Tom (Gast)


Lesenswert?

Wäre echt super wenn du uns erzählen würdest an was es jetzt gelegen 
hat.

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:
> Wäre echt super wenn du uns erzählen würdest an was es jetzt gelegen
> hat.

Falsche Frage. Woran es gelegen hat ist klar, Krapao hat es 
angesprochen. Die Frage ist, ob er es auch verstanden hat.

von Stefan E. (sternst)


Lesenswert?

Krapao schrieb:
> Aus dem Bauch raus geschätzt: An der Stelle wird es nix machen.
>
> Das hängt natürlich von der nicht gezeigten Umgebung ab, d.h. wie viele
> Register der Codegenerator gerade noch frei hat. In einer ISR sind 1) eh
> alle gerettet und 2) vielleicht noch nicht so viele in Benutzung.

Doch, es wird was ausmachen.
Als volatile Variable wird sie ja eben nicht in einem Register gehalten, 
sondern sie existiert real im Speicher. Mit dem volatile zwingst du den 
Compiler dazu, extra für diese Variable einen Stack-Frame anzulegen. 
Ohne das volatile würde sie aller Wahrscheinlichkeit nach nur in einem 
Register existieren.

von Krapao (Gast)


Lesenswert?

Du hast mich überzeugt!

von Sebastian S. (sebastian_s25)


Lesenswert?

Hi
sorry dass ich mich jetzt erst wieder melde, aber hatte gestern keine 
Zeit mehr...

Also soweit ich das jetzt testen konnte, funktioniert es so wie es 
sollte...

und kapiert hab ich auch!! ;)

Wusste nur nicht, dass der Speicher nach dem auslesen wieder leer ist...

mfg
Bastian

von Fabian (Gast)


Lesenswert?

Steht so aber im Datenblatt und ist daher kein Geheimnis mehr. Grade als 
Einsteiger sollte man dies ständig griffbereit haben...

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.