Forum: Mikrocontroller und Digitale Elektronik AVR-C Compiler Verständniss-Problem bei AVR-Controller


von U. B. (ub007)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

PINC5 ist die Nummer des Pins, nicht der Pin selbst. Bleibt also:
  while(1<<5)
Besser:
  while (PINC & BIT(RxF))

von Grrrr (Gast)


Lesenswert?

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)!

von (prx) A. K. (prx)


Lesenswert?

Na dann, der Basics und der Lesbarkeit wegen:
  while (bit_is_set(PINC, RxF))
oder gleich
  loop_until_bit_is_clear(PINC, RxF);

von U. B. (ub007)


Lesenswert?

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
Noch kein Account? Hier anmelden.