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