Forum: Mikrocontroller und Digitale Elektronik Nutzung des UARTs.


von AVR (Gast)


Angehängte Dateien:

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

von antworter (Gast)


Lesenswert?

Welche Fehler treten überhaupt auf ?

von AVR (Gast)


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

von xyz (Gast)


Lesenswert?

Du hast die Include Dateien vergessen.

von AVR (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

AVR wrote:
> Shit, danke. Seh es auch grad.
>
> Hab nun folgende eingebaut:
>
> #include <avr/io.h>
>
> Gibt es noch eine extra für den UART?

Nein.

>
> Muss ich Ausgänge bzw Eingänge einstellen, oder machen es die Funktionen
> eingenständig?

Nein, du musst nichts einstellen.


von AVR (Gast)


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

von AVR (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Poste nochmal dein jetziges Program.

Aber diesmal bitte nicht als PDF.
Für einfach den Quelltext in das Posting ein (solange
ist der ja nicht) oder hänge dein C-File als Attachment dran.
Das erhöht die Chancen ungemein, dass sich das jemand ansieht.

von AVR (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Nimm das Leerzeichen hier

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

raus.
Zwischen Makroname und Argumentliste darf keines sein.


von AVR (Gast)


Lesenswert?

Danke :)

Dass sind immer die besten Fehler. Es läuft.

von AVR (Gast)


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 ?

von antworter (Gast)


Lesenswert?

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

Ausprobieren - hängt ja kein Leben von der Funktion ab... hoffe ich :-)

von AVR (Gast)


Lesenswert?

Meine Hardware habe ich in der Schule. Also frühestens Montag 
ausprobieren. Morgen ist frei. Schade.
Naja vielleicht kann mir ja noch wer damit helfen.

Danke

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.