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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.