Hallo, versuch mal
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)
Also mit einem "L" nach "16"
Ich muß das nochmal überprüfen, dann bessere ich das ggf. aus
Sollte das so sein, dann bitt' ich um Vergebung
Hi,
Hab das myAVR Board.
Mit C Schaffe ich es aber einfach nicht mit dem UART umzugehen.
Mit Bascom geht das ohne Probleme.
Folgenen Code benutze ich (aus der Roboternetz wiki)
im Terminal bekomm ich aber das hier: (obere 2 mit Bascom unteres mit C)Code:#include <inttypes.h> #include <stdio.h> #include <avr/io.h> #define F_CPU 3686400 #define USART_BAUD_RATE 9600 #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16)-1) char cText[] = "Hello, world !\r\n"; //----------------------------------------------------- void _writeChar(char c) { while (!(UCSRA & (1<<UDRE))) {} UDR = c; } //----------------------------------------------------- void _writeString(unsigned char *string) { while ( *string) _writeChar(*string++); } //----------------------------------------------------- void main() { UCSRB |= (1<<TXEN); UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); UBRRL = (unsigned char) USART_BAUD_SELECT; _writeString(cText); }
Bild hier
mit Bascom hab ich es auch so wie in der Wiki gemacht.
Was mach ich denn jetzt falsch???
Hallo, versuch mal
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)
Also mit einem "L" nach "16"
Ich muß das nochmal überprüfen, dann bessere ich das ggf. aus
Sollte das so sein, dann bitt' ich um Vergebung
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
ich glaubs nicht... Das war die Lösung!!! Danke!!!
Vieleicht sollte man das mal in der Wiki berichtigen.
Nachdem du ja jetzt das Versuchs-Meerschweinchen warst, hab' ich es gleich ausgebessert. Tut mir leid !
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
eine Frage noch:
Wie kann ich eine uint8 variabel in ein String umwandeln das ich sie mit de r writeString funktion senden kann?
Du meinst beim Einlesen ?
Du kannst die Zeichen in einem Array sammeln
Versuch's mal !Code:uint8 bChar[64]; // 64 wär der längste string unit8 bIdx; // Index bIdx = 0; do { while ( !(UCSRA & (1<<RXC)) ) {} bChar[bIdx] = UDR; while (!(UCSRA & (1<<UDRE))) {} UDR = bChar[bIdx] ; // Echo if (bChar[bIdx] == 0x0D) // bei <ENTER> aufhören break; bIdx++; } while (1); bIdx++; bChar[bIdx] = 0x0A; // wir hängen noch ein LF an bIdx++; bChar[bIdx] = 0x00; // und ein \0 als ende-Kennzeichen _writeString((unsigned char*)&bChar[0] ); // alles abschicken }
Ich hoff', es ist kein Hund drinnen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
das kann ich sicher auch gebraucht
aber ich habe was anderes gemeint.
wenn ich vom Microcontroller irgend eine Variabel mit einem Wert an den PC senden will, muss der Wert doch erst in ein String umgewandelt werden, oder?
Wie geht das?
hast einmal unit8 geschrieben anstatt uint8
Du mußt nur umwandeln, wenn am PC nur ein Terminal zu Hause ist, das eben nix anderes als strings und ein paar Steuerzeichen versteht.
In der GCC-Library gibt's eine menge funktionen, mit denen man irgendwas in strings verwandeln kann. Ich weiß die jetzt auch nicht auswendig, da muß ich immer selber nachschauen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
ok ich schaus mir mal an.
Danke nochmal für deine Hilfe
sprintf() ist das was du suchst in einer normalen C-Lib. In den extra libs für die µC gibts aber eigentlich auch noch die itoa() analog zur atoi().
Andun
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Lesezeichen