Hallo ! Ich muss gerade ein Programm eines ehemaligen Kollegen debuggen und bin auf folgendes gestoßen: Zur Info: Ich verwende den AVR-gcc mit dem AVR-Sim Version 4 Im globalen Teil wurde folgendes deklariert (nur RxF ist wichtig!): #define BIT(x) (1<<(x)) // Schiebt Bit auf richtige Position (Macro) #define WR PC1 // (write) high to low #define RD PC0 // (write) low to high #define RxF PINC5 // (read) RxF high #define TxE PINC4 // (read) TxE high #define LED PC6 // Status LED #define PWREN PINC7 // (read) PWREN low In einer kleinen Einlese-C-Routine steht folgendes: unsigned char Receive_Byte(void) { unsigned char Wert; while( BIT(RxF) ) // solange RxF=1 => Warten { asm volatile ("NOP"); }; DDRD = 0x00; // PORTD hier als Eingang PORTC &= ~BIT(RD); // RD 0 setzen => Daten jetzt einlesen asm volatile ("NOP"); // warten bis Daten anliegen Wert = PIND; // Daten von PORT einlesen PORTC |= BIT(RD); // RD wieder auf 1 setzen return Wert; } Sobald der Compiler in die while-Schleife reinkommt, kann ich per Sim auf PINC5 und PORTC anklicken was ich will, der kommt gar nicht mehr aus der while-Schleife raus. Wird das Macro BIT(RxF) nur beim Eintritt in die while-Schleife gelesen und dann nicht mehr ? Ich finde die Schreibweise des ehemaligen Kollegen etwas sonderbar, dass er hier PORTS und PINS vermischt. Hätte man hier nicht statt PC1 auch PINC1 nehmen können ? O.K. die PORTS sind gepuffert während PINS den gerade anliegenden Wert beinhaltet, aber das sollte doch kein Unterschied geben, oder ? Wer kann mir helfen ? Gruß Uli
PINC5 ist die Nummer des Pins, nicht der Pin selbst. Bleibt also: while(1<<5) Besser: while (PINC & BIT(RxF))
Gast
#1643873
A. K. schrieb:
> bringt dich weiter? PINC5 ist die Nummer des Pins, nicht der Pin selbst.
Er hat ja geschreiben: "Programm eines ehemaligen Kollegen". Und der
zweite lernt jetzt die C-Basics (sic)!
Na dann, der Basics und der Lesbarkeit wegen: while (bit_is_set(PINC, RxF)) oder gleich loop_until_bit_is_clear(PINC, RxF);
Hallo ! Erstmal danke für die Antworten. O.K. ich Stand irgendwie auf dem Schlauch.... Vielen Dank Uli
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.