Forum: Mikrocontroller und Digitale Elektronik Initializierung mikrocontroller 644p


von Monkey Luffy (Gast)


Lesenswert?

Hallo,

ich arbeite Momentan mit einem Mikrocontrollerboard 644p. Der 
Mikrocontroller 644p besizt zwei USARTs. Eine der Schnittstelle (RS232) 
von USART dient zum Empfang von Daten (X und Y Koordinaten), die von PC 
gesendet wurden. Die Zweite Schnittstelle (RS485) von USART der 644p 
soll die Daten von Mikrocontrollerboard zu einem anderen Gerät 
übertragen.

Bevor ich die C-Code für die Datenübertragung schreibe, muss ich die 
USART von 644p initializieren. Ich habe selber versucht, die beide USART 
vom 644p zu initializieren und die C-Code lautet:

#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define FOSC 8000000 // Clock Speed
#define BAUD 9600UL

// Berechnungen zur Baudrate:

#define UBRR_VAL ((FOSC+BAUD*8)/(BAUD*16)-1)   // clever runden

// USART Initialization

void USART_Init (unsigned int ubrr)
{
/* Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char) ubrr;
UBRR1H = (unsigned char)(ubrr>>8);
UBRR1L = (unsigned char) ubrr;

/* Enable receiver, transmitter  */

UCSR0B = (1<<RXEN0)|(1<<TXEN0));
UCSR1B = (1<<RXEN1)|(1<<TXEN1);

/* Set frame format: 8data, 2stop bit */
 UCSR0C = (1<<USBS0)|(3<<UCSZ00);
 UCSR1C = (1<<USBS1)|(3<<UCSZ10);
}
/*============Erste USART=====================*/

/* Data Reception (The USART Receiver) */

unsigned char USART_Receive (void)
{
 /* Wait for data to be received */
  while(!(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */
return UDR0;
}

// Data Transmission (The USART Transmitter)

void USART_Transmit (unsigned char data)
{
/* Wait for empty transmit buffer */
while ( !(UCSR0A & (1<<UDRE0)) ); //warten bis Senden moeglich
/* Put data into buffer and sends the data */
UDR0 = data;
}

/*=============Zweite USART===========================*/

unsigned char USART_Receive (void)
{
 /* Wait for data to be received */
  while(!(UCSR1A & (1<<RXC1)) );
/* Get and return received data from buffer */
return UDR1;
}

// Data Transmission (The USART Transmitter)

void USART_Transmit (unsigned char data)
{
/* Wait for empty transmit buffer */
while ( !(UCSR1A & (1<<UDRE1)) ); //warten bis Senden moeglich
/* Put data into buffer and sends the data */
UDR1 = data1;
}

Kann jemand mir sagen, ob meine Initializierung stimmt.

Ich bitte Sie um Hilfe.

MFG Luffy

von Krapao (Gast)


Lesenswert?

Du hast mehrere Funktionen mit gleichem Namen definiert!

Mach dir Paare:

unsigned char USART0_Receive (void)
unsigned char USART1_Receive (void)

void USART0_Transmit (unsigned char data)
void USART1_Transmit (unsigned char data)

von Monkey Luffy (Gast)


Lesenswert?

Hallo nochmal,

du hast recht Krapao. Ich habe vergessen, die Funktionen anders zu 
definieren. Danke für die Bemerkung.

Gibt es sonst noch was in meinem C-Code zu modifizieren ?

Danke im Voraus.

Luffy.

von Uwe (de0508)


Lesenswert?

Luffy,

das siehst du beim Compiler lauf...

Warum wird immer wieder nicht übersetzter Code zur Diskussion gestellt ?

von Krapao (Gast)


Lesenswert?

Auf den ersten Blick verwendest du die gleiche Initialisierung, wie sie 
im Datenblatt auf Seite 177 zu sehen, ist mit dem Unterschied, dass du 
in einer Funktion beide UARTs initialisierst. Da ist IMHO nix 
problematisch dran. Von der Praxis her musst du halt sicher stellen, 
dass du genaue 8 MHz als Taktquelle hast. Das ist aber in der [[AVR 
Checkliste]] und wahrscheinlich auch in den diversen Tutorials zum AVR 
UART erläutert.

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.