Hallo, ich möchte ein Eingangsbyte (PIND) auf eine Variable transferieren und dann die 4 höherwertigen Bits löschen (ich könnte auch links- bzw. rechtsschieben auch eine UND-Funktion wäre möglich). Leider arbeitet verarbeitet der Compiler (ich nutze Atmel Studio 6.2) offenbar meine Zeile nicht, zumindest funktioniert es nicht mit dem Controller und wenn ich es in den Simulator lade überspringt er jedesmal die Zeile Code...und ich verstehe einfach nicht warum. Fehler erhalte ich keine. Folgendes Programm habe ich: #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRC = 0x20; // Port C5 =Ausgang (CLOCK) DDRD = 0x00; // Alle Pins v. Port D als Eingang (BCD) uint8_t zehner_stelle; uint8_t dezimalzahl; uint8_t Anzeige; while(1) { Anzeige = PIND & 0b00001111; // diese Zeile wird übersprungen if (PINC &(1<<PINC4)) { while(dezimalzahl >= 1) { -- dezimalzahl; PORTC = 0x20; _delay_ms(100); PORTC = 0x00 ; _delay_ms(100); } } //PORTC &=(1 << PC5); // } return 0; } Kann mir jemand weiterhelfen? Grüße
Nun, die Variable wird nur an dieser einen Stelle beschrieben und nirgends sonst benutzt. Dementsprechend wird der Compiler sie einfach wegoptimieren, da überflüssig.
Aber ich ändere doch den Wert der variablen bzw versuche es. Den Wert des Eingangsregisters nimmt sie ja auch an... Müsste den dann der Compiler nicht auch ignorieren? Grüße
Zi P. schrieb: > Aber ich ändere doch den Wert der variablen bzw versuche es. Aber du verwendest den Wert von Anzeige nirgends. Wenn du die Optimierungsstufe von deinem Compiler runter setzt, könntest du mehr Glück haben.
Wolfgang schrieb: > Zi P. schrieb: >> Aber ich ändere doch den Wert der variablen bzw versuche es. > > Aber du verwendest den Wert von Anzeige nirgends. Wenn du die > Optimierungsstufe von deinem Compiler runter setzt, könntest du mehr > Glück haben. Kannst du mir sagen wo ich die Optimierungsstufe einstellen kann?
Einfacher ist, testhalber die Variable mal volatile zu machen und zu sehen, ob es sich dadurch ändert. Dann muss der Compiler den Zugriff ausführen.
Hallo, die Optimierung kann wie folgt verändert werden: 1. Öffne im AtmelStudio Dein Projekt 2. Drücke "Alt-F7", es öffnet sich ein neues Fenster mit einem Menü auf der linken Seite 3. Gehe in diesem Menü auf den Eintrag "Toolchain" 4. Hier gehtst Du auf "AVR/GNU C Compiler" und klappst das Untermenü auf (wenn nicht schon sichtbar) 5. Jetzt gehst Du auf "Optimization" 6. Im Optimization Level stellst Du None ein Ab jetzt werden keine Optimierungen mehr seitens GCC unternommen und nur übersetzt. Somit kannst Du in alle Variablen, Strukturen usw. reinschauen. Viele Grüße Stefan
Besten Dank! Hatte den Compiler angepasst und schon funktionierte alles wie gewünscht! Grüße
Stefan schrieb: > die Optimierung kann wie folgt verändert werden: > 1. [...] > 2. [...] > 3. [...] > 4. [...] > 5. [...] > 6. [...] OMG. Noch komplizierter geht's net? Wer überlegt sich so ne GUI...?
Zi P. schrieb: > Besten Dank! > > Hatte den Compiler angepasst und schon funktionierte alles wie > gewünscht! Kannst du vielleicht noch erklären, wozu das ganze gut sein soll? Warum willst du unbedingt, dass in einer nachher nie mehr benutzten Variable ein bestimmter Wert steht? Außer im Debugger kann man das ja nirgends überhaupt erkennen.
Die meisten Leute wollen, auch wenn sie es nicht wissen, die Optimierung auf Codegrösse. Ich würde dieses Problem nicht durch drehen an der Optimierung "lösen". Volatile oder eine dummy-use Funktion für die Variable einbauen. Dass sowas wegoptimiert wird ist standard und davon geht man eigentlich auch aus, wenn man deinen Code liest. Eher den Code anpassen, als die Umstände.
Nils S. schrieb: > Eher den Code anpassen, als die > Umstände. Ich sehe das ähnlich. Was einem eine Variable bringen soll die nicht benutzt wird verstehe ich auch nicht. Bei mir ist der Compiler so eingestellt, dass er deshalb sogar ein Warning wirft und da ich mit -werror übersetze… ;)
Für mich als Programmier-Anfänger ist es einfacher zu sehen was passiert, wird also der Wert übertragen. Die variable wird nun verwendet natürlich verwendet... Ich habe gar nicht weitergeschrieben weil ich nicht verstand warum keine Werte verändert wurden. Danke für eure Hinweise. Grüße
Zi P. schrieb: > Ich habe gar nicht weitergeschrieben weil ich > nicht verstand warum keine Werte verändert wurden. So ist dasmit modernen Geistern, wie Optimierung im Compiler, automatischer Rechtschreibkorrektur, automatischer Worterkennung/-ergänzung oder Datenkompression im Xerox Scanner http://winfuture.de/news,77252.html
Michael K. schrieb: > Bei mir ist der Compiler so > eingestellt, dass er deshalb sogar ein Warning wirft und da ich mit > -werror übersetze… ;) -Wall und -Werror halte ich gerade für Anfänger sinnvoll, dann kommen solche Fragen meist gar nicht erst auf. Der Compiler meckert schon beim Versuchen der meisten Schandtaten und bricht ab. Ebenso bei Code der veröffentlicht wird. Spätestens das Release muss mit -Wall -Werror durchcompilieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.