Forum: Mikrocontroller und Digitale Elektronik Probleme mit UART ATmega8


von Ber n. (bernhard_s43)


Lesenswert?

Hallo liebes Forum,

ich habe ein Problem mit dem UART meines Mega8.
Das Uart ansich funktioniert einwandfrei. Der Controller soll, wenn ein 
externer Interrupt ausgelöst wird zwei Zeichen im Abstand von 10ms 
empfangen.
Das Problem ist, das das Zeichen zwar anscheinend empfangen wird, die 
Anweisungen im jeweiligen case-Fall jedoch erst beim nächsten Interrupt 
ausgeführt werden. Das heisst: ich sende zwei Zeichen (data kommt im 
switch vor) und löse gleichzeitig einen Interrupt aus -> es passiert 
nichts, wenn ich jetzt ein zweites Mal zwei Zeichen sende (data kommt 
dieses mal nicht im switch vor) und einen Interrupt auslöse, passiert 
das, was eigendlich beim ersten mal hätte passieren sollen usw.

Ich hoffe Ihr könnt mir helfen!

Frohe Weihnachten!
1
ISR(INT1_vect)      //Interruptroutine für INT1 (BSY-Eingang)
2
{
3
  idGot = uart_getc();      //ID lesen
4
  _delay_ms(10);        //kurz warten
5
  dataGot = uart_getc();      //DATA lesen
6
    
7
  if (idGot == 0x30)
8
  {
9
    switch(dataGot)
10
    {
11
      case 0x01:  busWrite(0x01, 0x02);
12
          setLEDstatus(OFFLINE);
13
          break;
14
      
15
      case 0x03:  setLEDstatus(ONLINE);
16
          break;
17
      
18
      case 0x31:  setLEDstatus(OFFLINE);
19
          _delay_ms(500);
20
          setLEDstatus(ONLINE);
21
          break;
22
    }  
23
  }
24
  _delay_ms(10);
25
    
26
  dataGot = 0x00;
27
  idGot = 0x00;  
28
}

von Torsten B. (torty)


Lesenswert?

hast Du die F_CPU für die delay richtig eingestellt ?

Warum nicht gleich mit USART RX Int ??

von Bernd (Gast)


Lesenswert?

Ber ni schrieb:
> _delay_ms(10);        //kurz warten

warum denn warten?

was ist denn ein BSY-Eingang?

Poste doch Mal mehr Infos, ich glaube das gesamte Konzept ist 
verbesserungsfähig

von Bernie (Gast)


Lesenswert?

Warum soll er denn Zeichen empfangen, wenn ein Interrupt
ausgelöst wurde? Die Zeichen selbst können doch genug
Interrupt auslösen!

Liegt das erste Zeichen denn schon fertig im Empfänger vor,
wenn der Interrupt kommt? Sonst dürfte idGot = uart_getc();
ins Leere greifen.

Liegt dataGot dann auch schon vor? - Dann wurde idGot
vielleicht schon überschrieben???

Kann mich eigentlich nur  <Torsten B. (torty)> anschließen:
Lass den zusätzlichen INT1-Quatsch und benutze USART RX Int
mit nem knuffigen kleinen Ringspeicher...

Oder erläutere deine Vorgehensweise besser!

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.