AtMega8 und g++ Optimierung: PIN einlesen wird wegoptimiert

Gast #2425307
Lesenswert?

Hallo,

ich steuere ein Display mit dem Atmega8 an, der Code ist in C++ 
geschrieben.
Unter anderem gibt es folgende Methode mit der "PROBLEMZEILE".
1
unsigned char readByte()
2
{
3
  unsigned char byte;
4

5
  DDRD=0x00; //PortD as input
6
  PORTD=0xFF; //PortD with internal Pull-Up
7

8
  PORTB |= (1 << WRB); // Read
9

10
  //Dummy read after setting address
11
  PORTB |= (1 << RDB);
12
  PORTB &= ~(1 << RDB);
13
  PORTB |= (1 << RDB);
14

15
  // really read
16
  PORTB |= (1 << RDB);
17
  PORTB &= ~(1 << RDB);
18
  byte = PIND;                 //PROBLEMZEILE
19
  PORTB |= (1 << RDB);
20

21
  return byte;
22
}

Ohne Compileroptimierung gibt es keine Probleme. Wenn ich die 
Compileroptimierung einschalte geht es nicht mehr richtig.

Wenn ich byte mit einem eigenen Wert überschreibe also z.B.
byte = 0; statt byte = PIND;
Dann funktioniert die Funktion. Aber so ist es ja nicht gedacht.

Kann es sein das der Lesezugriff PIND einfach wegoptimiert wird?
Wie kann ich das verhindern?

Danke

Stefan
#2425320
Lesenswert?

stefan-koch schrieb:

> Kann es sein das der Lesezugriff PIND einfach wegoptimiert wird?

Wird er nicht.
Dein Problem ist ein anderes. Du überfährst dein LCD, dein Code ist zu 
schnell. Nach dem Anlegen des RDB Pulses braucht das LCD eine gewisse 
Zeit, bis die Information bereit steht.

In der nicht optimierten Version, sind diese ganzen Operation
  PORTB |= (1 << RDB);
etc.
so implementiert, wie du sie hingeschrieben hast. Über den Daumen führt 
jede Zeile zu 3 Assmembler Instruktionen. In der optimierten Version 
optimiert der Compiler das aber zu nur einer einzigen Assembler 
Instruktion. D.h. das vorgeplänkel vor

  byte = PIND;

läuft jetzt wesentlich schneller ab. Zu schnell für dein LCD.

(AUs dem gleichen Grund hast du wahrscheinlich auch den Dummy Read 
eingeführt. Einfach nur um etwas Zeit zu gewinnen. Das ist keine gute 
Idee. Wenn dir das LCD vorschriebt, dass du eine gewisse Zeit zu warten 
hast, dann warte auch diese Zeit. Die _delay_xx Funktionen sind da 
nützlich).
Gast #2425454
Lesenswert?

Mit einem delay klappt es...
Wenn ich mit delay, den Code nicht optimiere ist das image gleich um 3K 
größer...

Mein Ziel ist aber, das Display ziemlich flott zu beschreiben, 
unoptimiert dauert das komplette Display zu initialisieren noch 1-2 Sek.

Wie kann ich verhindern, dass der Dummy-Read wegoptimiert werden kann?
(Ich konnte aber nicht feststellen, dass er wegoptimiert wurde - 
brauchen tue ich ihn aber)

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