Forum: Mikrocontroller und Digitale Elektronik USART Probleme....


von Mephisto (Gast)


Lesenswert?

Moin, ich hab folgendes Problem mit der USART:

Es kommt nichts an, es ist so, als ob der Controller falsch
initializiert wäre...

Mein Code sieht so aus:

  /* Initialisierung der UART */

  UBRRH = 23; /*ext. Quarz 3,68.. MHz -> Baudrate : 9600
  UCSRB = ( (1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN) );
  UCSRC = ( (1<<URSEL) | (1<<UCSZ1)  | (1<<UCSZ0));
  CLEARBIT(DDRD,DDD0);  // Pullup für RxD aktivieren
  SETBIT(PORTD,DDD0);


void transmit ( unsigned char data )
{
   SETBIT(PORTD,PD2);        // RS485 auf Sendung
   while ( !(UCSRA & (1<< UDRE )) ) // Warten bis Senderegister leer
   ;

   UDR = data;
}

Kann mir jemand das Problem sagewn??

Vielen Dank

von Stefan Kleinwort (Gast)


Lesenswert?

>   SETBIT(PORTD,PD2);        // RS485 auf Sendung

Und wann setzt Du den Pin wieder auf Low?

Bedenkst Du, dass, nachdem Du in UDR geschrieben hast, die RS485 eine
Weile eingeschaltet bleiben muss?
Am besten direkt am TXD mit dem Oszi messen, dann kannst Du eingrenzen,
ob das Problem im mc oder an der Ansteuerung des RS485-Treibers liegt.

Stefan

von Mephisto (Gast)


Lesenswert?

Also, es kommt etwas an dem Controller an, allerdings wird es nicht
richtig verarbeitet...ich glaube ich frage das UDR zweimal ab, is ja
bei USART ein doppeltes FIFO im Vergleich zum UART...
Kann das der Fehler sein??
Wie behebe ich das am besten??

Der RS485 wird im TXC_Interrupt gecleared, daran liegt es also nicht...

von Mephisto (Gast)


Lesenswert?

Hab eben nachgemessen, der RS485 empfängt was...Das Problem schient also
im MC zu liegen...

Hier nochmal meiner Interrupts:

#pragma vector=USART_RXC_vect
__interrupt void USART_RXC_interrupt ( void )
{
    while( !(UCSRA & (1<<RXC)))
    ;
    transmit(UDR);   //empfangenes Zeichen ausgeben

        if (BUFPTR<12)
          {
            INBUF[BUFPTR]=UDR;
            BUFPTR++;
          }
       else
          {
             INBUF[BUFPTR-1]=UDR;
          }
}


#pragma vector=USART_TXC_vect
__interrupt void USART_TXC_Complete_interrupt ( void )
{
    CLEARBIT(PORTD,PD2);        // RS485 auf Empfang
}

von Stefan Kleinwort (Gast)


Lesenswert?

Du liest UDR zweimal. Das ist mal ein Fehler:

hier:     transmit(UDR);   //empfangenes Zeichen ausgeben
und hier: INBUF[BUFPTR]=UDR;

Zwischenspeichern in lokaler Variable ist da besser, macht den
effektiven Code eher kürzer:

  my_data = UDR,
  transmit(my_data);
  if ...   INBUF[BUFPTR] = my_data;

Folgende Zeile finde ich etwas fragwürdig:
  while( !(UCSRA & (1<<RXC)));
RXC ist an dieser Stelle IMMER gesetzt. Und wenn es nicht gesetzt WÄRE,
dann bist Du im IR in einer Endlosschleife, bis mal wieder Daten
ankommen.

Was ist eigendlich genau das Problem / wie macht sich der Fehler
bemerkbar? Ich dachte, Du hast beim Senden Schwierigkeiten? Steht in
INBUF was bzw. wird BUFTR erhöht?

Stefan

von Mephisto (Gast)


Lesenswert?

Problem war tatsächlich dass ich beim mega8 nicht zweimal auch dem UDR
lesen kann...also zwischenspeichern und schon gehts..

danke

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.