Hallo,
ich Denke gerade über einem Problem nach, wo ich zu keiner andern Lösung
mehr komme als das Forum hier zu benutzen. Und zwar geht es um die
Switch Case Anweisung. Ich wollte ein Programm schreiben welches ,je
nach Eingabe, verschieden Muster aufruft .Das Programm soll eigentlich
nicht wirklich was machen es soll nur ein Test sein für die Switch Case
anweisung.
Nun habe ich das ganze auf das STK500 geladen den PortD mit den LED's
verbunden und den PINB 0 fest auf die 5V gelegt.Und es Passiert rein gar
nichts auch nicht wenn man PINB 0 auf GND legt.Ich weiß aber das die
For-Schleifen alle arbeiten wenn man sie ohne Switch-Case ablaufen
lässt.
Ich weiß das ist ein Noob-Problem aber ich bitte nur die zu Antworten
die wirklich helfen wollen. Ich habe auch schon die SuFu genötigt
genauso hab ich Google gefragt aber das Problem nicht wirklich lösen
können.
Villeicht sieht ja einer von Euch meinen Denkfehler in der ganzen
Geschichte.Programmieren tue ich mit dem AVR-Studio und dem aktuellen
WINAVR. Die Optimirungstufe ist auf -01 gestellt. Als µC wird der
ATMEGA8 benutzt.
Danke fürs Durchlesen
Gruß
Gismo
Wenn du nur PINB Bit 0 auf 0 oder 5V legst, weiß du noch nicht
welchen Wert die anderen Bits haben.
Wahrscheinlich kommst du gar nicht auf die Werte 0x00 oder 0x01,
sondern auf irgendwelche anderen.
Leg doch mal alle 8 auf 0 oder 5V, was passiert dann?
@ Lord_Gismo (Gast)
>Switch Case Anweisung. Ich wollte ein Programm schreiben welches ,je>nach Eingabe, verschieden Muster aufruft .Das Programm soll eigentlich>nicht wirklich was machen es soll nur ein Test sein für die Switch Case>anweisung.
Nimm ein zweidimensionales Feld, das ist deutlich einfacher. Und ein
_delay_ms() mit variablem Paramter funktioniert nicht wirklich.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
Besser so.
>verbunden und den PINB 0 fest auf die 5V gelegt.Und es Passiert rein gar>nichts auch nicht wenn man PINB 0 auf GND legt.
Weil deine Tastenabfrage falsch ist. Du musst einzelene Bits mit
Bitmanipulation testen.
>WINAVR. Die Optimirungstufe ist auf -01 gestellt.
Wozu? Praktisch nutz man meist nur -O0 (keine Optimierung, zum Debuggen
und Simulieren) und -Os (minimale Größe) in der realen Anwendung.
MfG
Falk
Also klar ich danke euch mit dem Beispiel von Falk funktioniert das
super einziges Problem es ist keine Switch Case anweisung.
Ich benutze die Optimirungsstufe weil ansonsten die delay.h ein fehler
verusacht wo drinne steht das die Optimirung eingeschaltet werden soll.
Gruß
Gismo
Lord_Gismo schrieb:> Also klar ich danke euch mit dem Beispiel von Falk funktioniert das> super einziges Problem es ist keine Switch Case anweisung.
So toll ist die dann auch wieder nicht :-)
Dein Problem war ja nicht der switch-case. Dein Problem war das
Aufbereiten des Wertes, der nacheinander mit allen case-Fällen
verglichen wurde.
Wann immer du einen Port komlpett benutzt, musst du dir Gedanken darüber
machen, was wohl die Bits machen, die dich nicht interessieren. Wenn sie
dich wirklich nicht interessieren, dann setzt man sie gezielt auf 0,
damit man auf keinen Fall von irgendwelchen äusseren Einflüssen abhängig
ist.
> Ich benutze die Optimirungsstufe weil ansonsten die delay.h ein fehler> verusacht wo drinne steht das die Optimirung eingeschaltet werden soll.
dann nimm gleich -Os
Von -Os wurde mir von mehrenen Personen abgeraten, da es passieren kann
das der Compiler dann einfach nur einmal genutzte Funktionen einfach weg
Rationalisiert.
gruß
Gismo
Lord_Gismo schrieb:> Von -Os wurde mir von mehrenen Personen abgeraten, da es passieren kann> das der Compiler dann einfach nur einmal genutzte Funktionen einfach weg> Rationalisiert.
Und was ist daran falsch?
Ja, ganz genau das macht die Os Optimierung, das s steht insgeheim nicht
für small sondern für single, genau diese Funktionen werden entfernt...
Jetzt mal im Ernst, glaubst du da wirklich dran?
>Ja, ganz genau das macht die Os Optimierung, das s steht insgeheim nicht>für small sondern für single, genau diese Funktionen werden entfernt...>Jetzt mal im Ernst, glaubst du da wirklich dran?
Ich sage nicht das es so ist nur in meiner Berufsschulklasse ist es halt
erzählt worden das genau das passiert ist und somit das Programm nicht
lief.
@ Lord_Gismo (Gast)
>Ich sage nicht das es so ist nur in meiner Berufsschulklasse ist es halt>erzählt worden
Nicht nur dort wird viel Unsinn erzählt . . . ;-)
> das genau das passiert ist und somit das Programm nicht lief.
Zu 99,9% liegt das Problem vor der Tastatur.
MFG
Falk
Lord_Gismo schrieb:> Ich sage nicht das es so ist nur in meiner Berufsschulklasse ist es halt> erzählt worden das genau das passiert ist und somit das Programm nicht> lief.
Das kann nur passieren, wenn der Compiler fehlerhaft ist oder wenn es
sonst irgendeinen Grund gibt, warum bestimmter Code unbedingt in Form
einer Funktion vorliegen muss.
Aber ansonsten kannst du nicht unterschieden ob die Funktion erhalten
blieb, oder ob der Compiler sie aufgelöst hat. D.h. man kann es schon in
einem gewissen Sinne unterscheiden: die 2te Variante läuft meistens
etwas schneller :-)
Lord_Gismo schrieb:>>Ja, ganz genau das macht die Os Optimierung, das s steht insgeheim nicht>>für small sondern für single, genau diese Funktionen werden entfernt...>>>Jetzt mal im Ernst, glaubst du da wirklich dran?>> Ich sage nicht das es so ist nur in meiner Berufsschulklasse ist es halt> erzählt worden das genau das passiert ist und somit das Programm nicht> lief.
Das Problem dürfte gewesen sein, das der Erzähler beim Debuggen nicht
verstanden hat warum seine tolle Funktion auf einmal weg war und hat die
Schuld bei der Compileroptimierung gesucht.
Es werden aber nur Sachen wegoptimiert deren Lösungen vorhersehbar oder
für den weiteren Ablauf nicht gebraucht werden, in diesem Fall wird aber
die entsprechende richtige Lösung vorher eingesetzt.
Bei der Ausführung merkst du davon nichts, bis auf eventuell etwas
weniger Speicherbedarf und/oder Geschwindigkeit.
Und es gibt durchaus auch eigene Fehler, die erst bei eingeschalteter
Optimierung auffallen (vergessenes volatile ist da wahrscheinlich der
Spitzenreiter).
Insofern ist die Geschichte nicht unglaubwürdig, nur die
Schlußfolgerung daraus ist falsch ("keine Optimierung einschalten,
weil dann meine Fehler auffallen").
Lord_Gismo schrieb:> Ich sage nicht das es so ist nur in meiner Berufsschulklasse ist es halt> erzählt worden das genau das passiert ist und somit das Programm nicht> lief.
Naja, viele (nicht alle!) Berufsschullehrer befinden sich eher am
alleruntersten Ende der Fahnenstange, was die Fachkenntnisse, sogar in
ihren eigenen Unterrichtsfächern, angeht.
Wenn es einen Seiteneffekt durch das Einschalten der Optimierung gab,
dann lag er mit sehr hoher Wahrscheinlichkeit an einem
Programmierfehler. Der Klassiker "vergessenes volatile" wurde ja schon
erwähnt.
Wird eine Funktion als Interrupthandler eingesetzt und die entsprechende
Adresslage nur im Linker-File angegeben, stellen Compiler und Linker
auch nur fest, dass es keinen Bezug (Aufruf oder Definition eines
Funktionszeigers) darauf gibt und optimieren die Funktion weg. Daher
sollte man für solche Funktionen ggf. den Weg wählen, wie er solche
Anwendungen dokumentiert ist, z.B. beim AVR-GCC bzw. WinAVR mit ISR()
arbeiten.
Andreas Schweigstill schrieb:> Lord_Gismo schrieb:>> Ich sage nicht das es so ist nur in meiner Berufsschulklasse ist es halt>> erzählt worden das genau das passiert ist und somit das Programm nicht>> lief.>> Naja, viele (nicht alle!) Berufsschullehrer ...
Muß ja nicht mal vom Lehrer erzählt worden sein.