Atmega8535 Max232 Usart empfangen

OP #2015229
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/doc2502.pdf) 
kopiert, als der aus dem Tutorial nicht funktionierte:
1
[...]
2
#define F_CPU 4000000UL
3

4
#define BAUD 9600UL      // Baudrate
5

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

14
void main( void )
15
{
16
[...]
17
USART_INIT ( BAUD_REAL );
18
[...]
19
}
20
void USART_Init( unsigned int baud )
21
{
22
/* Set baud rate */
23
UBRRH = (unsigned char)(baud>>8);
24
UBRRL = (unsigned char)baud;
25
/* Enable receiver and transmitter */
26
UCSRB = (1<<RXEN)|(1<<TXEN);
27
/* Set frame format: 8data, 2stop bit */
28
UCSRC = (1<<USBS)|(3<<UCSZ0);
29
}

Anschließend warte ich per
1
unsigned char USART_Receive( void )
2
{
3
/* Wait for data to be received */
4
while ( !(UCSRA & (1<<RXC)) )
5
;
6
/* Get and return received data from buffer */
7
return UDR;
8
}
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:)
#2015283
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);
OP #2015320
Lesenswert?
• ▲
▼
Danke, das war einer meiner Fehler, dummerweise habe ich auch die 
falsche Baudrate verwendet, die "clever gerundete" ist die richtige.
1
UBRRH = (unsigned char)(UBRR_VAL>>8);
2
UBRRL = (unsigned char)UBRR_VAL;
3
UCSRB = (1<<RXEN)|(1<<TXEN);
4
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

Damit Funktioniert schreiben UND lesen **freu**

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.