mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8535 Max232 Usart empfangen


Autor: Daniel K. (camarril)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey liebes Forum,
Ich habe das Tutorial auf dieser Seite verfolgt und stecke gerade beim 
Thema Uart fest.
Da es bei meinem Conrad dummerweise keinen Atmega8 gab, habe ich zum 
Atmega8535 gegriffen.
Bisher gab es keine Probleme, doch der in meinem Fall Usart will nicht 
richtig.
Daten senden klappt einwandfrei, doch wenn ich Daten empfangen will, 
kommen keine im uC an. Ich habe den Quelltext zum initialisieren aus dem 
Datenblatt(http://www.atmel.com/dyn/resources/prod_documents/...) 
kopiert, als der aus dem Tutorial nicht funktionierte:
[...]
#define F_CPU 4000000UL

#define BAUD 9600UL      // Baudrate

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 

void main( void )
{
[...]
USART_INIT ( BAUD_REAL );
[...]
}
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}

Anschließend warte ich per
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
auf ein Zeichen, welches ich per hTerm versende, doch der uC kommt nicht 
aus der Whileschleife.
Theoretisch müsste doch die Verkabelung richtig sein, wenn ich auch 
Daten senden kann, oder?

[Edit]
Mir ist gerade aufgefallen, dass mit der oben genannten init-Funktion 
auch keine Zeichen gesendet werden, mit der aus dem Tutorial klappt 
wenigstens das.

Ich hoffe, ihr könnt mir helfen:)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OOops.
Da ist tatsächlich ein Fehler im Datenblatt

   UCSRC = (1<<USBS)|(3<<UCSZ0);

Auch der 8535 hat das URSEL Bit, mit dem zwischen UCSRC und UBRRH 
unterschieden wird.
Das hier setzt daher nicht Frameformat, sondern greift in die Baudrate 
ein

Richtig muss es heißen:

   UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

Autor: Daniel K. (camarril)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das war einer meiner Fehler, dummerweise habe ich auch die 
falsche Baudrate verwendet, die "clever gerundete" ist die richtige.
UBRRH = (unsigned char)(UBRR_VAL>>8);
UBRRL = (unsigned char)UBRR_VAL;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

Damit Funktioniert schreiben UND lesen **freu**

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.