PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit UART



daniel.weber
26.04.2008, 23:24
Hallo,
habe vor kurzer Zeit angefangen Controller mit C zu programmieren. Ich arbeite gerade das Tutorial (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial) durch und bin bei UART angekommen.

Mein Testboard hat einen Mega32 mit 16mhz Quarz. Und natürlich die übliche Beschaltung für den UART. Ich weiß, dass die Schaltung funktioniert, da ich früher einen Bascom Code drauf laufen hatte, der ebenfalls eine UART Ausgabe hatte.

Mit folgendem Programm versuche ich ein Zeichen auszugeben:


#include <avr/io.h>
#include <inttypes.h>


#ifndef F_CPU
#define F_CPU 1600000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
#endif

#define BAUD 9600L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate










int main(void) {



while(1) {

UCSRB |= 1<<(TXEN); // UART TX einschalten
UCSRC |= 1<<(URSEL)|(3<<UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

DDRA = 0xff; // Test LEDs
PORTA = 0xff;

while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}
UDR = 'x';

}


return 0;
}


Leider gibt das so kein Zeichen aus, nur wenn ich Spannung anlege erhalte ich kurz Buchstabensalat im Terminal. Woran könnte das liegen, was mache ich falsch?

McJenso
27.04.2008, 09:50
Hallo,



UCSRB |= 1<<(TXEN); // UART TX einschalten
UCSRC |= 1<<(URSEL)|(3<<UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

DDRA = 0xff; // Test LEDs
PORTA = 0xff;

Das gehört nicht in die Endlosschleife. Die Einstellungen brauchen nur einmal durchlaufen werden.
Der Fehler ist aber etwas komplizierter.


UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

UCSRB |= 1<<(TXEN); // UART TX einschalten
UCSRC |= 1<<(URSEL)|(3<<UCSZ0); // Asynchron 8N1

So sollte es klappen.

Im Datenblatt steht bei der Beschreibung des Bit URSEL vom Register UCSRC:
The UBRRH Register shares the same I/O location as the UCSRC Register...


Sollte das dann noch nicht funktionieren, schau einmal, ob du eine Optimierung im Compiler eingestellt hast.

Gruß

Jens

daniel.weber
27.04.2008, 11:25
Hallo, danke ich habe das gestern Nacht noch einmal alles angepasst und nun funktioniert das, kannst du mir vielleicht eine fertige aber einfach gehaltene UART Bib empfehlen - man muss ja nicht immer das Rad neu erfinden :)

Man sollte das aber schon verstehen können.
Vielen Dank.

McJenso
27.04.2008, 12:53
Hallo,
kann ich leider nicht. Auch wenn du jetzt lachst, hier schlägt ein Bastlerherz und aus Pfadfinderehrgeiz schreibe ich 99,9% meiner Funktionen selber
:cheesy:

Ich lese aber immer wieder von Bibliotheken von Peter Fleury (?) vielleicht gibt es da was.

Gruß

Jens

daniel.weber
27.04.2008, 13:29
nein warum sollte ich da lachen, finde ich gut, wenn ich genügend mit der Materie vertraut wäre, würde ich das auch so machen.

Auf die Bibliotheken von Peter Fleury bin ich vorhin gestoßen, als ich mich etwas über I2C mittels C informiert habe, da habe ich dann auch gesehen, dass er eine UART Bibliothek geschrieben hat.

Finde es nur sehr, sehr schwierig da durch zu blicken, kann es sein, dass er auch teilweise Assembler in seinen Bibliotheken verwendet?

Naja hilft alles nichts werde mich wohl da durch kämpfen müssen, will ja endlich weg von Bascom ;) auch wenn Bascom wirklich einfach ist aber warum einfach, wenn es auch schwer geht :P

drew
29.04.2008, 12:44
Hallo,
ich finde die Idee mit der Bibliothek gar nicht so dumm. Wenn man eine Bibliothek hat, kann man sich auf das wesentliche Problem konzentrieren.
Außerdem kann man seinen Code dann leichter auf andere Plattformen portieren, wenn die Schnittstelle immer gleich ist.

Ich denke, dass
SendByte('x');
einfacher zu lesen ist als:
UDR = 'x';

Ich hab schon lange darüber nachgedacht sowas zu schreiben.
Klar, etwas Offset in der Laufzeit ist bei sowas immer dabei. Aber viel kann das doch nicht sein, oder?

Drew

daniel.weber
29.04.2008, 13:56
naja da kann man sich drüber streiten, sicher sprechen viele Dinge für das Nutzen von fertigen Bibliotheken, allerdings würde ich nicht generell auf Bibliotheken verweisen, da man dadurch nicht so viel lernt. Man sollte mindestens mal verstehen, was die Bibliothek da macht. Sicher muss man nicht immer das Rad neu erfinden ;)