Nutzung des UARTs.

Gast #581984
Lesenswert?

Hallo,
Ich möchte mich in den UART einarbeiten. Habe dass Toturial 
durchgearbeitet so weit. Möchte nun ein Zeichen senden (Als erster 
Versuch). Im Anhang seht ihr den Quelltext.

Ich vermute, bzw bin mir sicher, dass die Fehler daran liegen, dass ich 
kein Port/ Pin deklariert habe. Ich habe es bisher nicht gemacht, da ich 
nicht sicher bin, ob ich es einfach mit ...

DDRD  = 0xff; ... machen kann. Also als Beispiel.

Der Pin, RX und der Pin TX muss ja jeweils als Ausgang, und der andere 
als Eingang festgelegt werden. Liegt darin mein Fehler?

Muss ich in der Fusebitkonfiguration dem Controller noch erzählen, dass 
ich auf die Zweitfunktion der Pins zugreife?

Danke
Angehängte Dateien:
Gast #581997
Lesenswert?

../RS232.c:37: error: 'UDR' undeclared (first use in this function)
../RS232.c:27: error: 'FREQ_' undeclared (first use in this function)
../RS232.c:32: error: 'UCSRA' undeclared (first use in this function)

und so
Gast #582006
Lesenswert?

Shit, danke. Seh es auch grad.

Hab nun folgende eingebaut:

#include <avr/io.h>

Gibt es noch eine extra für den UART?

Muss ich Ausgänge bzw Eingänge einstellen, oder machen es die Funktionen 
eingenständig?
Gast #582014
Lesenswert?

Okay. Habe dieses nachgefragt, da es noch immernicht übersetzt wird.

../RS232.c:30: error: 'BAUD_' undeclared (first use in this function)
../RS232.c:30: error: (Each undeclared identifier is reported only once
../RS232.c:30: error: for each function it appears in.)
../RS232.c:30: error: 'FREQ_' undeclared (first use in this function)
../RS232.c:30: warning: left-hand operand of comma expression has no 
effect
../RS232.c:31: warning: left-hand operand of comma expression has no 
effect
Gast #582038
Lesenswert?

Habe es 1 zu 1 aus dem Toturial übernommen. Es ist für einen ATMega 16 
geschrieben. Nun ist mir aufgefallen, dass Baud_ ja in der Formel zur 
Berechnung herangezogen wird und nirgends deklariert ist. Aber wie ? 
Dass Toturial gibt das nicht her.
Gast #582064
Lesenswert?

#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 8000000UL              //Einstellen der Oszillator - 
Frequenz in Hz
#endif

#define UART_UBRR_CALC (BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)

#define UART_BAUD_RATE 9600

int main (void)
{

UCSRB  |=  (1<<TXEN);
UCSRC  |=  (1<<URSEL)  |  (3<<UCSZ0);

UBRRH  =  (uint8_t) (UART_UBRR_CALC(UART_BAUD_RATE, F_CPU) >> 8);
UBRRL  =  (uint8_t)  UART_UBRR_CALC(UART_BAUD_RATE, F_CPU);


while (!(UCSRA & (1<<UDRE)))
{
}

UDR    =  'x';

return (0);
}
Gast #582117
Lesenswert?

Nun da alles geht bin ich dabei zu senden UND zu Empfangen.

Nun folgt die Initialisierung für einen ATMega16:
1
#include <avr/io.h>                    
2
#ifndef F_CPU
3
#define F_CPU 8000000UL      
4
#endif              
5

6
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)      
7
#define UART_BAUD_RATE 9600               
8

9

10
UBRRH  =  (uint8_t) (UART_UBRR_CALC(UART_BAUD_RATE, F_CPU) >> 8);    
11
UBRRL  =  (uint8_t)  UART_UBRR_CALC(UART_BAUD_RATE, F_CPU);
12

13
    
14
UCSRB = (1<<RXEN)  |  (1<<TXEN);          
15
UCSRC = (1<<URSEL)  |  (1<<UCSZ1)|(1<<UCSZ0);

Ist diese Fehlerfrei ? Habe ich alle Register korrekt gesetzt ? Habe ich 
auch nichts vergessen ?

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