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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren