mikrocontroller.net

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


Autor: Mephisto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mephisto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mephisto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mephisto (Gast)
Datum:

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

danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.