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
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)); |
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.
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 ..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.