Forum: Mikrocontroller und Digitale Elektronik Atmega8 GCC: Bitmanipulation an einer Variablen


von Zi P. (zippo)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

Nun, die Variable wird nur an dieser einen Stelle beschrieben und 
nirgends sonst benutzt. Dementsprechend wird der Compiler sie einfach 
wegoptimieren, da überflüssig.

von Zi P. (zippo)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Zi P. (zippo)


Lesenswert?

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?

von Rolf M. (rmagnus)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Zi P. (zippo)


Lesenswert?

Besten Dank!

Hatte den Compiler angepasst und schon funktionierte alles wie 
gewünscht!

Grüße

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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...?

von Rolf M. (rmagnus)


Lesenswert?

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.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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.

von M. K. (sylaina)


Lesenswert?

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… ;)

von Zi P. (zippo)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.