Initialisier den UART1 des Atmega128 halt gleich wie im Datenblatt beschrieben (In der Hoffnung dass nichts aus der Lib dem in die Quere kommt)
Hallo
Hat schon jemand mal beim NIBO2 den UART1 als RS232 benutzt? Da gibt es zwar Funktionen wie z.B UART1_set_baudrate(uint16_t baud), UART1_enable() usw in der NIBOLIB V2.7 - wie um alles in der Welt projektiere ich die Anzahl der Datenbits (8 Bit, no parity, 1 Stoppbit)????
Ich versuche seit Tagen verzweifelt,den UART1 (hängt ja am PORTD) zum laufen zu bringen (38400 Baud, 8 Datenbit,no parity, 1 Stoppbit), aber das verd** Ding macht keinen Mucks. An den Pins 8 und 10 des Steckers X6 habe ich RXD und TXD angeschlossen, die 5V und GND habe ich auch korrekt angeschlossen -ich will mit einem XBEE Modul Daten an den PC senden. Die XBEE-Kommunikation mit einem ATmega8 fkt problemlos, da habe ich Daten zwischen PC und ATmega8 ausgetauscht -> an den Xbee Modulen kann es also nicht liegen.
NB - habe natürlich auch schon RXD und TXD von PORTD getauscht, war aber trotzdem erfolglos.
Ich bekomme nicht einmal Sendesignale (beim Xbee ist eine Anzeige DIN, die blinkt, wenn vom Prozessor Daten geschickt werden); ich habe auch mal das file "AvoidRC.c" der NIBOLIB 2.8 getestet (dieses file ist außerdem fehlerbehaftet - da sollte nicht vorkommen!!) aber das ging natürlich auch nicht.
Generell ist die Doku der Lib "etwas dürftig", um es mal gelinde zu sagen.
mfg
Hero_123
Initialisier den UART1 des Atmega128 halt gleich wie im Datenblatt beschrieben (In der Hoffnung dass nichts aus der Lib dem in die Quere kommt)
Ja, wird mir wohl nichts anderes übrig bleiben...
So schwierig ist das gar nicht. Man ist nur auf den ersten Blick von dem Datenblatt ganz erschlagen. Aber wenn man sich erst mal damit beschäftigt hat wird es alles ganz logisch. Bei Problemen kannst du ja immer noch hier nachfragen.
Hi
habe es jetzt so wie vorgeschlagen gemacht - den USART1 gemäß ATmega128 Beschreibung initialisiert, lese Kommandos vom PC mittels Interrupt ein und gib sie zyklisch (timergesteuert - selbst definiert (!) - alle 500ms) wieder per HTerm auf dem PC aus - es funktioniert also (38400 Baud, 8 Datenbit, no parity, 1 Stoppbit).
Schade ist nur, daß man die NiboLib nicht verwenden kann (oder ich bin einfach zu unfähig) - ein user, der nicht so fit ist in der englischen Sprache, kann da schon seine Probleme haben, wenn er SELBST den USART deklarieren soll...
naja, ist sowieso besser, wenn man sich seine eigenen Fkt schreibt; der Lerneffekt ist da wesentlich grösser...
Hero_123
Hier ein Beispiel für die UART1 Routinen aus der NIBOlib:
NIBOLIB - Woher weiß ich, daß es immer 8N1 ist? Das steht nicht in der Doku (Habs jedenfalls nicht gefunden, weder in den *.c-files noch in den header-files).
Was ist, wenn ich eine andere Parametrierung will (z.B. O2)? Ich kann zwar die Baudrate einstellen, mehr aber nicht.
NIBOLIB V2.8 - versuch mal, das "AvoidRC.c" zu compilen...(-> #define STATE_TURNLEFT 3AvoidRC.o)...
mfg
Hero_123
Die USART des ATmega128 ist nach dem Reset per Default auf 8N1 eingestellt. Eine andere Einstellung mach bei Verwendung der Bibliothek wenig Sinn, da von den Routinen keine Parity Fehler geprüft werden und das Datenformat fix auf 8 Bit ausgerichtet ist. Die einzige sinnvolle Einstellmöglichkeit (bei Verwendung der Bibliothek) sind 2 Stop-Bits. Das ist möglich wenn man das USBSn Bit im UCSRnC Register setzt.
Hi workwind
Es wäre hilfreich, wenn diese Info in der Doku der lib stünde; viellecht kann man das in die nächsten NIBOLIB ja einfließen lassen
Jedenfalls Danke für den Hinweis
mfg
Hero_123
Nach längerer Zeit habe ich mich mal wieder dem NIBO2 zugewandt.
Ich versuche Daten per UART1 an meinen PC zu senden.
Funktioniert jedoch nicht.
Nibo2 Test UART1:
AVR Studio 4.18
WinAVR - 20100110
NiboLib 2.8
PC-Terminal -> MAX 232 -> X6/10 (RXD1) sendet im Loop 1 Zeichen (mit 10 msec Verzögerung)
X6/8 (TXD1) kommt jedoch nichts an
gemessen mit Oszi.
Kompilierung ok
Code:
....
int main()
{
// Initialisierung
sei();
bot_init();
spi_init();
// floor_init();
display_init();
// leds_init();
// pwm_init();
gfx_init();
// Initialize serial interface (RS232)
#ifdef USE_UART
UART1_set_baudrate(9600);
UART1_enable();
#endif
// Operation loop
while (1)
{
if (!uart1_rxempty() && !uart1_txfull())
{
// wenn Empfangspuffer nicht leer und Sendepuffer nicht voll
char c = UART1_getchar(); // Zeichen holen
UART1_putchar(c); // und zurückschicken
}
}
return 0;
}
Lesezeichen