Hallo Hab da mal ne Frage. Kann es sein, dass man beim avr eine Switchanweisung so nicht programmieren kann?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Irgendwie bekomm ich da immer nur sch... raus... mfg Bastian
|
Anzeige
|
Probleme mit Switch CaseHallo Hab da mal ne Frage. Kann es sein, dass man beim avr eine Switchanweisung so nicht programmieren kann?
Irgendwie bekomm ich da immer nur sch... raus... mfg Bastian
Gast
#2476385
Wie ist UDR0 definiert? 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 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. Und wenn du "Flag" auch außerhalb der ISR auswerten möchtest, musst du die Variable als volatile deklarieren.
Gast
#2476405
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.
Krapao schrieb: > volatile uint8_t tmp; Das volatile ist an dieser Stelle vollkommen überflüssig.
Gast
#2476464
Technisch ja; mir hilft es beim Lesen des Codes. Es macht den Code halt größer und langsamer und verbraucht mit hoher Wahrscheinlichkeit auch etwas mehr RAM.
Gast
#2476490
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. Hey danke fuer die Hilfe!!! Jetzt weiss ich endlich warums nicht geht!!! Danke!! mfg Bastian Sebastian S. schrieb: > Jetzt weiss ich endlich warums nicht geht!!! Klär uns auf...
Gast
#2476543
Wäre echt super wenn du uns erzählen würdest an was es jetzt gelegen hat. 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. 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.
Gast
#2476821
Du hast mich überzeugt! 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
Gast
#2477847
Steht so aber im Datenblatt und ist daher kein Geheimnis mehr. Grade als Einsteiger sollte man dies ständig griffbereit haben... Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|