Forum: Mikrocontroller und Digitale Elektronik Atmega8535 Max232 Usart empfangen


von Daniel K. (camarril)


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:)

von Karl H. (kbuchegg)


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);

von Daniel K. (camarril)


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**

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.