Hallo Jungs.
Ich beschäftige mich seit gestern zwangsweise mit dem UART meines
Xplained-A1 Boards. Meine Idee war die Temperatur mit dem NTC auf dem
Board zu messen. Da mir ein Display nicht zur Verfügung steht wollte ich
die Temperatur auf dem PC anzeigen lassen.
Nun habe ich etwas gegoogelt und auch hier und da Infos oder auch Code
zum initialisieren des UART gefunden. Leider funktionier es nicht und
ich habe einige grundlegende Fragen.
- Kann ich überhaupt Daten über die USB-Schnittstelle des Boards
auslesen? Wenn nicht dann klären sich die anderen Fragen. ^^
- Um es langsam anzugehen habe ich zu allererst einen Code genutzt den
ich hier im Forum gefunden habe und wollte mit dessen Hilfe zunächst
einfach ein 1Byte ausgeben lassen.
Beitrag "UART-USB Gateway auf dem AVR Xplained A1"
In die main-Funktion habe ich dann lediglich noch
char test;
while(1)
{
test = 0xFF;
uart_put(test);
}
eingefügt.
Auch wenn ich das Programm ohne Probleme kompilieren kann, ist es nach
dem flashen aufs Board nicht möglich Daten zu empfangen.
Habe ich es mir zu einfach gemacht, und muss noch mehr im Code ändern?
- Da der Code aus dem Forum nicht funktionierte wollte ich als nächstes
ein fertiges Demoprojet aus ASF verwenden. Im ASF gibt es ein UART-
Codebeispiel, in dem ziemlich am Anfang geschrieben steht:
* - Xplain evaluation kit
* USARTD0 on PORTD is used by default
* Change to USARTC0 to use the USB Virtual COM PORT of the Xplain
* - XMEGA A1 Xplained evaluation kit
* USARTC0 on PORTC is used. It is located on the J4 header
Das verwirrt mich etwas. Ich verstehe hier, dass UARTC0 das USB-Port auf
dem Board nutzt. Zugleich ist UARTC0 am Pinheader J4 zu finden? Ist das
richtig? Das würde ja bedeuten, dass die entsprechenden uC-Pins doppelt
belegt sind, oder?
Unterm Strich funktionierte dieses "fertige" Beispiel auch nicht. Es
soll "Hello AVR World" ausgeben. Ich habe es angehangen.
- Stimmt der Rest? Das Auslesen habe ich mit den Programmen TeraTerm und
RS232 Data Logger probiert. Die Konfiguration (immer): 57kBaud, 8bit, no
parity, stop bits 1, no flowctrl. Zum programmieren muss ich bei FLIP
den COM9 wählen. Nach dem flashen muss das Board resetet werden, um in
den Programmmodus zu kommen (zumindest war es bei anderen
vorangegangenen Programmen so). Danach ist COM9 jedoch nicht mehr
erreichbar. Auf den übrig gebliebenen COMs zeigt sich auch nichts.
Ich bin mir der Fehlersuche ziemlich unsicher. Leider habe ich im Moment
keinen JTAG-Adapter zum Debuggen, sonst hätte man wenigstens mal gucken
können ob es am Code oder an den anderen Sachen liegt.
Vielleicht hat das schon mal jemand gemacht und kann mir sagen wie es
geht und welcher Datenlogger empfehlenswert ist.
Viele Grüße
David
David L. schrieb:> Ich verstehe hier, dass UARTC0 das USB-Port auf> dem Board nutzt. Zugleich ist UARTC0 am Pinheader J4 zu finden? Ist das> richtig? Das würde ja bedeuten, dass die entsprechenden uC-Pins doppelt> belegt sind, oder?
So isses. UARTC0 geht sowohl zum Boardcontroller als auch auf J4. Atmel
Dokument AVR1924 enthält den Schaltplan zum A1-Xplained Board, hol dir
das mal, wenn du es noch nicht hast.
AVR1927 enthält ein paar rudimentäre Hinweise zum Betrieb der UART über
USB.
Stelle sicher, das du das USART so initialisierst:
#define USART_SERIAL_EXAMPLE &USARTC0
#define USART_SERIAL_EXAMPLE_BAUDRATE 57600
#define USART_SERIAL_CHAR_LENGTH USART_CHSIZE_8BIT_gc
#define USART_SERIAL_PARITY USART_PMODE_DISABLED_gc
#define USART_SERIAL_STOP_BIT false
Ich kann mich im Moment nicht genau erinnern, ob man nun SW0 beim
Power-Up drücken muss, oder nicht - du solltest aber im Gerätemanager
bei Windows dann unter COM Ports das Atmel Dings entdecken. Stelle auch
da 57600, N, 8, 1 ein.
David L. schrieb:> while(1)> {> test = 0xFF;> uart_put(test);> }
Lass dir da mal lieber ein druckbares Zeichen wie das grosse 'A' (0x41)
ausgeben, nicht jedes Terminal druckt dir 0xFF aus.
Die Initialisierungen stimmen überein und entsprechen auch denen im
genannten Beispiel aus dem Forum. Auch im HW-Manager ist das Port
dementsprechend inititalisiert.
Um ein Programm zu flashen muss ich beim Anstecken an das USB-Port die
SW0 drücken. Wurde das Programm mit FLIP über COM9 geflasht, musste ich
bisher immer reseten um in den Run-Modus zu kommen. Ich gehe also davon
aus, dass das hier auch wieder so ist. Problem ist nur, dass ich nach
dem Reset mit meinen Log-Programmen keine Verbindung zum Board über COM9
herstellen kann. Vorm Reset, kann ich eine Verbindung herstellen - es
werden aber keine Daten vom Board geschickt.
Hier nochmal mein kompletter Code zur Kontrolle:
Ich hab schon länger nichts mehr mit ASF gemacht, aber es könnte helfen,
das bei dir auch zu tun. Das setzt voraus, das du auch ASF im Projekt
Ordner (Unterordner /src/asf) hast, was bei AVR Studio 6 eigentlich von
alleine passieren sollte, sobald du das Board als Projektgrundlage
angegeben hast.
David L. schrieb:> Was für ein LOg-Programm nutzt du?
Was ist ein LOg-Programm? Falls du das Terminal auf der PC Seite meinst,
gehts sowohl mit 'Hyperterminal' unter XP als auch 'HTerm' unter W7.
>#define USART_SERIAL_EXAMPLE_BAUDRATE 57600
Da hab ich aber 9600 als Baudrate zwischen Xmega und At90UBS1287 im
Kopf.
Eventuell läuft dir dann der USB-Buffer im AT über, weil du die Daten
nicht schnell genug zum Xmega weiterschaufeln kannst, solltest du vom PC
massiv Daten senden.
Gruß J
ich möchte doch aber vom xmega zum pc senden.
Also. Auf Kampis Elektroecke gab es nochh ein etwas anderes
Code-Beispiel von "Hallo Welt", was ich im Moment auf dem Board drauf
habe. Er nutzt auch eine andere Möglichkeit der initialisierung, indem
er die Register direkt anspricht.
Mit HTerm kann ich auch sekündlich etwas empfangen. Nun stellt es mir
aber statt "Hallo Welt" irgendwelche Zeichen dar. ^^ In HTerm ist ASCII
aktiviert und auch der HEXCode entspricht nicht den gewollten
ASCII-Zeichen.
Eigentlich würde ich jetzt behaupten dass es am Code liegt, und
irgendeine Typendeklaration oder Wandlung falsch ist. Aber ich sehe an
sich nichts was falsch ist. Auch wenn ich einen ASCII Code direkt in
eine Char schreibe und diese über die Ausgabefunktion in der TimerISR
ausgeben lasse kommen nur wilde Zeichen. Ganz schöner FickFack.
Hoffentlich geht es mit einem LCD und SPI einfacher. ^^
Hier der Code:
>Nun stellt es mir>aber statt "Hallo Welt" irgendwelche Zeichen dar. ^^
Dann steht die Verbindung schon mal physisch, jetzt brauchst du nur die
passenden Einstellungen auf beiden Seiten und es funktioniert.-
Dann probiert man ein paar Einstellungen(also die Baudraten) am PC
durch, bis man was "richtiges" empfängt. An Hand der Diskrepanz der
Einstellung zu dem Ergebnis kann man dann auf das Problem schließen.
Meistens fuse/falsche Clock-Einstellungen.
Gruß Jonas
Es ist sehr sehr kurios. Manchmal gehts, manchmal nicht und das bei
gleichen Einstellungen. Im Moment geht wieder mal gar nichts ^^ Ich
probier mal ein bissl weiter rum.