Atmega8 GCC: Bitmanipulation an einer Variablen

OP #4372684
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 #4372693
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.
Gast #4372715
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.