Atmega8 GCC: Bitmanipulation an einer Variablen

OP #4372684
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
Gast #4372715
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
#4376926
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.
Persönliche Seite #4376970
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.
OP #4377001
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
Persönliche Seite #4377181
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren