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))
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.