Forum: Compiler & IDEs Atmel Studio 7 und ATtiny2313


von Tom F. (Firma: privat) (tommax)


Lesenswert?

Hallo Wissende,
in einem kleinen Enpfangsmodul mit einem ATtiny2313 läuft untenstehendes 
Programm. Beachtet bitte die zwei Zeilen innerhalb der While-Schleife 
ganz unten. Die empfangenen 16 Zeichen werden im Display korrekt 
angezeigt, => ISR korrekt. Kommentiere ich aber nun Zeile A aus wird das 
Display nicht mehr aktualisiert obwohl die LED an PD2 - 0-aktiv - kurz 
an und wieder aus geht.
Jetzt frage ich mich schon eine Weile wo der Bug versteckt ist? Compiler 
ist der gcc der im Atmel Studio 7 integriert ist.
Wo liegt hier das Problem?

Danke
Tom

schnipp---anfang

#define STX  0x7E  //->
#define ETX  0x7F  //<-
#define LF  0x24  //$

unsigned char RxDByte = 0;
unsigned char RxDCnt = 0;
unsigned char EmpfangOK = 0;

char Zeile0[16];
char Zeile1[16];

ISR (USART_RX_vect)
{
 RxDByte = UDR;
 switch (RxDByte)
 {
  case STX: RxDCnt=0; EmpfangOK = 0; PORTD &= ~(1<<PD2);
      break;
  case ETX: EmpfangOK = 1;  PORTD |= (1<<PD2);
      break;
  default:  Zeile1[RxDCnt] = RxDByte; RxDCnt++;
 }
}

int main(void)
{
    DDRD = DDRD | 0b11111100;
    PORTD = PORTD | 0b00000111;

   UBRRH = 0;
   UBRRL = 12;
   UCSRB |= (1<<RXCIE) | (1<<RXEN);

   lcd_gotoxy(0,1); lcd_puts("     RxD ?      ");

   sei();

   RxDCnt = 0; EmpfangOK = 0;

    while (1)
    {
  if (EmpfangOK == 1) { PORTD |= (1<<PD2); }  //Zeile A
  if (EmpfangOK == 1) { lcd_gotoxy(0,1); lcd_puts(Zeile1); EmpfangOK = 
0;}
  }
}
schnipp---ende

von Timmo H. (masterfx)


Lesenswert?

EmpfangOK solltest du als volatile deklarieren!

von Tom F. (Firma: privat) (tommax)


Lesenswert?

Hallo Timmo,
in der Tat, der Compiler hat die wegoptimiert. Warum auch immer? Auf 
jeden Fall mal wieder was dazu gelernt. Vielen Dank :-)

Glück Auf
Tom

von Timmo H. (masterfx)


Lesenswert?

Tom F. schrieb:
> in der Tat, der Compiler hat die wegoptimiert. Warum auch immer

Interrupt: Volatile Variablen

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.