Forum: Mikrocontroller und Digitale Elektronik Routine zur Handhabung des UART´s entwickeln ?


von Timo P. (Gast)


Lesenswert?

Guten Morgen,
Ich möchte mir im Rahmen eines Projektes nun eine Routine zur Handhabung 
des UART´s am ATMega 16 schreiben.

Ich habe mir folgendes gedacht:

1. Definitionen

   - Baudrate
   - Formel zur Berechnung der Baud - Rate
   - Taktversorgung

2. Initialisierung

   - Einstellen Schreiben und Lesen
   - Einstellen der Baud-Register
   - Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
   - Flush Receive-Buffer

3. Funktionen

   - Sende_Zeichen
   - Sende_Zeichenkette
   - Sende_Ganzzahl
   - Sende_Fliesskommazahl
   - Empfange_Zeichen

Diese Routine möchte ich als 'Header' in spätere Programme einbinden 
können. Dort möchte ich dann "nur noch sagen: Rufe zum Beispiel die 
Funktion Sende_Ganzzahl und übergebe ihr den Wert '123'"

Wieso ich die Funktionen diferenziert schreibe möchte ist einmal der 
Grund, dass ich mich am Toturial orientieren möchte. Zum anderen möchte 
ich den UART „Schritt für Schritt“ begreifen und für ein Projekt 
dokumentieren.

Nun ein paar Fragen zu dem Vorhaben:

a. Fallen euch noch Funktionen ein, die in dem Zusammenhang gleich mit 
abgearbeitet werden könnten ?

b. Sollte man bei den Schritten 1. und 2. noch weitere Einstellungen 
vornehmen ?

c. Ist das Datenformat, welches ich in 2. gewählt habe eine "Gute 
Entscheidung" ?

Werde im nächsten Post den Anfang des Programms, also die Definitionen 
und die Initialisierung posten.

Dann werde ich auf Anregungen oder Kritik warten. Anschließend kommen 
nach und nach die Funktionen.

Wie gesagt, es handelt sich um ein Projekt. Also bitte keine "dumme 
Kommentare", bzw. "Fertige Routinen".

Ich warte auf Anregungen und konstruktive Kritik ...


Vielen Dank

von Timo P. (Gast)


Lesenswert?

Wie bereits erwähnt. Die Definitionen und die Initialisierung. Ich bitte 
um konstruktive Verbesserungsvorschläge, um die Prüfung des Quelltextes 
und und und :)

Definitionen:
1
//Einbinden der Bibiotheken
2
#include <avr/io.h>                          
3
//Einstellen der Oszillator - Frequenz in Hz
4
#define F_CPU 8000000UL               
5
6
//Formel zur Berechnung der Baud - Rate
7
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)      
8
9
//Einstellen der Baudrate 
10
#define UART_BAUD_RATE 9600

Initialisierung:
1
//Einstellen der Baud-Register
2
UBRRH  =  (uint8_t) (UART_UBRR_CALC(UART_BAUD_RATE, F_CPU) >> 8);    
3
UBRRL  =  (uint8_t)  UART_UBRR_CALC(UART_BAUD_RATE, F_CPU);
4
5
//UART auf 'Schreiben' und 'Lesen' einstellen
6
UCSRB   =   (1<<RXEN)  |  (1<<TXEN);        
7
8
//Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit      
9
UCSRC   =   (1<<URSEL)  |  (1<<UCSZ1)|(1<<UCSZ0);            
10
//Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) 
11
do                    
12
{
13
     UDR;
14
}
15
while (UCSRA & (1 << RXC));


von Karl H. (kbuchegg)


Lesenswert?

Timo Pat wrote:
>
> Ich warte auf Anregungen und konstruktive Kritik ...

Da gibts nicht viel Kritik.
Das ist bis jetzt mehr oder weniger 08/15 Standard-UART-Aufsatz.

> c. Ist das Datenformat, welches ich in 2. gewählt habe eine
> "Gute Entscheidung" ?

Welches Datenformat? Auf der UART gibt es kein Datenformat.
Du hast nur die Entscheidung: Übertrage ich binär oder übertrage
ich in Textform. Alles andere ist immer Anwendungsspezifisch.
Ob das jetzt 8 Bit sind oder 7 oder 9, hängt hauptsächlich
davon ab, was die Gegenstelle kann. Aber in der Regel können
alle Gegenstellen 8 Bit.


Wenn du dann soweit bist, kommen die nächsten Fragen auf dich zu:
gepufferte Übertragung, Empfang mittels Interrupt und vor
allen Dingen: Handshake!

Aber sieh erst mal zu, dass du die Kommunikation so zum Laufen
bringst. Das ist im Moment wichtiger, als sich Gedanken über
eine modulare Library zu machen. Die 30 Code Zeilen, auf die
es momentan hinauslaufen wird, sind schnell umgearbeitet.

von Timo P. (Gast)


Lesenswert?

Danke dir Karl heinz erstmal. Okay, dass mit dem Format der Übertragung 
habe ich nun verstanden. Ich übertrage also mit 8 Bit.

Ich habe mich nun eben mit meinem ATMega16 und dessen BEschaltung 
beschäftigt. Ich habe nun einen Max232 angebracht. Die Hardware steht 
nun komplett.

Du schreibst, dass ich zusehen soll, dass ich die Kommunikation 
ersteinmal in Gange bekommen soll.

Reicht für diesen ersten Test nicht einfach meine Deffinition + 
Initialisierung + Senden eines Zeichens ? Ich kann über den PC ja mit 
einem Terminal - Prgramm schauen, ob das Zeichen vom PC empfangen wird 
...


So nun nehmen wir an, die Kommunikation läuft. Der PC erhält das 
gesandte Zeichen. Du schreibst folgendes:

> Wenn du dann soweit bist, kommen die nächsten Fragen auf dich zu:
> gepufferte Übertragung, Empfang mittels Interrupt und vor
> allen Dingen: Handshake!

Sollte ich mir diese Fragen bezüglich der Initiallisierung stellen ?

1. Zur gepufferte Übertragung:

   Was bedeutet "gepufferte Übertragung" genau und wozu wird dieses 
verwendet ? Ich habe gelesen, dass die gepufferte Übertragung dazu da 
ist, die Daten in "Pakete" zu packen und dann zu senden. Aber da ich ja 
sowieso mit 8-Bit-Übertragung arbeite, ist dass denn nicht überflüssig ? 
(Sorry bin ein absoluter Beginner)

2. Zum Empfang mittels Interrupt:
   Das hatte ich vor, ja. Dass bedeutet ja nur, dass immer ein Interrupt 
ausgelöst wird, wenn ein Zeichen/String oder eine Variable ankommt. 
Wodrin liegt hier eigendlich der Vorteil gegenüber der Kommunikation 
ohne Interrupt.

3. Zum Handshake:
   Was ist das ;)

Vielen Dank, dass ihr mir helft. Meine Aufgabe ist es nämlich eine 
Routine mit den Funktionen zu schaffen. Und da muss ich Schritt für 
Schritt vorgehen und alles dokumentieren und verstehen ..



von Guest (Gast)


Lesenswert?

http://de.wikipedia.org/wiki/Handshake

;-) Besser kann mans nich erklären

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.