Hallo verehrte Forumsmitglieder, Schema Messkette: Mikrofonn--> AT90USB1287--> USB-UART-Brücke--> PC--> VCP--> Tera Term. ich habe ein Problem mit der Messkette. Des Mikrocontrollers C-Code habe ich mit Atmel Flip (Atmel Flip 3.4.7) geflasht. Dazu habe ich mir ein ein Tutorial im Internet angesehen. Das müsste auch richtig geklappt haben. Die Einstellung für den UART im C-Code stimmen mit den Einstellungen im Terminalprogramm Tera Term überein. Baudrate 9600, Wortlänge=8 Bit, Stop- und Paritybit entsprechen Standardeinstellungen. Den Virtuellen-Com-Port habe ich installiert, d.h. die USB-UART-Brücke wird vom PC anerkannt. Der C-Code ist definitiv korrekt. Ich weiß echt nicht worin jetzt noch das Problem besteht. Könnte es sein, dass ich beim flashen einen Fehler gemacht habe, oder ich einen Fehler beim Terminalprogramm gemacht habe. Könnt ihr mir bitte noch Hinweise geben, was falsch sein könnte, denn ich habe keine Ideen mehr, wo ich den Fehler noch suchen soll. Wäre euch sehr dankbar, wenn wir mein Problem zusammen beheben. Julian
Julian K. schrieb: > Ich weiß echt nicht worin jetzt noch das Problem besteht Ja, was ist Dein Problem? Was soll passieren?
Julian K. schrieb: > d.h. die USB-UART-Brücke > wird vom PC anerkannt. Der C-Code ist definitiv korrekt. Ob da jeder Befehl duchgeht? Kannst Du eine Gegenprobe machen oder mal nachsehen was Dein Termial so liefert?
Ihr habt Recht: ich habe die Lage nicht vollständig beschrieben. Ich habe ein Mikrofon. Ich möchte, dass das Spannungssignal am Terminalprogramm ausgelesen wird, wenn ich z.B. in das Mikrofon hineinspreche. Mein Terminalprogramm liefer eben nichts. Genau das ist das Problem. oszi40 schrieb: > Kannst Du eine Gegenprobe machen oder mal > nachsehen was Dein Termial so liefert? Was meinst du mit Gegenprobe machen?
Die Gegenprobe, d.h. die Brücke zwischen TX und RX an der USB-UART-Brücke, erfolgreich durchgeführt. Tippe ich einen beliebigen Buchstaben auf der Tastatur ein, wird mir dieser am Terminal ausgegeben.
Was sagt mir das? Das bedeutet doch nur, dass die USB-UART-Brücke und das Terminalprogramm funktionieren. Wenigstens das.
Dann geh doch mal systematisch ran. Erstmal kann man beim Start vom MC-Programm ein paar Byte ausspucken. printf ("Hallo hier das Mikro V1.0"); Dann weiss man schonmal, ob UART-Einstellungen und Sendeverbindungen korrekt sind. Das einfache Echo (kurzschliessen) kann man erweitern mit einem Winzprogramm mit getchar/putchar, also das ankommende Byte wieder verschicken. Geht das, klappt die Verbindung in beiden Richtungen. Und dann musst du dich eben um die Messwerterfassung/Verarbeitung/Sendung kümmern.
H.Joachim Seifert schrieb: > Erstmal kann man beim Start vom MC-Programm ein paar Byte ausspucken. Danke, dass hört sich echt gut an. Das probier ich doch gleich mal aus. H.Joachim Seifert schrieb: > Das einfache Echo (kurzschliessen) kann man erweitern mit einem > Winzprogramm mit getchar/putchar, also das ankommende Byte wieder > verschicken. Das verstehe ich nicht ganz. Könntest du das vlt. ein bisschen genauer erklären.
Julian K. schrieb: > H.Joachim Seifert schrieb: >> Erstmal kann man beim Start vom MC-Programm ein paar Byte ausspucken. > > Danke, dass hört sich echt gut an. Das probier ich doch gleich mal aus. > > H.Joachim Seifert schrieb: >> Das einfache Echo (kurzschliessen) kann man erweitern mit einem >> Winzprogramm mit getchar/putchar, also das ankommende Byte wieder >> verschicken. > > Das verstehe ich nicht ganz. Könntest du das vlt. ein bisschen genauer > erklären. Vorher hast Du es vor dem uC überbrückt. Jetzt schickst Du im uC gleich wieder zurück, was Du empfängst.
Tatsächlich, mein Terminalprogramm zeigt zwar noch nichts an. Dafür flimmert das Lämpchen beim RC wie verrückt. Auch wenn das noch nicht die endgültige Lösung ist, schon Mal danke für die Hilfe bis hierher.
Hallo verehrte Forummitglieder, ich bin dem Rat nachgegangen eine String in den C-Code direkt über die UART des AT90USB1287 und über die USB-UART-Brücke an Tera Term zu verschicken. Das Lämpchen der RX der USB-UART-Brücke flimmert unentwegt. Doch trotzdem wird mir der String bei Tera Term nicht angezeigt. Könnt ihr bitte mal bitte den Code überprüfen?! #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #define F_CPU 1000000 #define BAUD 9600 #include <util/setbaud.h> void USART_Konfig(void) { UBRR1H |= (UBRRH_VALUE) ; UBRR1L |= (UBRRL_VALUE) ; UCSR1C = (1<< UCSZ11) | (1<< UCSZ10); UCSR1B = (1<<TXEN1); } void usart_putc ( unsigned char c) { while (UCSR1A != (UDRE1)) {} UDR1=c; while (UCSR1A != (UDRE1)) {} UDR1='\r'; while (UCSR1A != (UDRE1)) {} UDR1='\n'; } void usart_puts (char *s) { while (*s !='\0') {usart_putc (*s); s++;} } int main(void) { DDRD |= (1<<PD3); char s[6]="ABC"; USART_Konfig(); usart_puts (s); return 0; } Falls der Code stimmt, dann verstehe ich wirklich nicht, warum Tera Term den Strin "ABC" nicht anzeigt. Baudrate, Stopbit, Paritybit und Wortlänge stimmen mit dem Code überein. Was mache ich falsch? Könnte es sein, dass ich bei Tera Term versäumt habe irgendetwas wichtig einzustellen, weil es mir unbekannt ist? Ich weiß jeden Rat zu schätzen. FG Julian
Was verwendest du als taktquelle für den AVR? F_cpu sagt 1Mhz ist das Wirklich so? Fuses stimmen? Der interne RC oszi ist ungeeignet jedoch sollte dann wenigstens mist ankommen.
@ Dennis R.: Oh, das könnte das Prboblem sein. http://shop.in-circuit.de/data/datasheet/610000163A_AT90USB1287-Evalboard.pdf Gemäß dem Datenblatt verfügt das uControllerboard einen Oszillator mir 16 MHz. Da checke ich gleich mal die Fuses. Danke!
Julian K. schrieb: > Tera Term Versuch mal HTerm. Es gab hier schon so einige Threads, wo die Leute fehler gesucht haben, und am schluss lag es nur am Terminalprogramm (unter anderem auch Tera Term). Ich würd erstmal Tera Term gegen HTerm tauschen!
Naja, dem Compiler gesagte und tatsächliche Frequenz sollte schon übereinstimmen :-) Es gibt da meist auch noch eine DIV/8-fuse, auch zu beachten. Aber warum machst du das nicht direkt über USB? Das ist der Gründe, warum man MCs mit USB überhaupt einsetzt. Gibt ne Menge fertige Software dafür.
Julian K. schrieb: > > void usart_putc ( unsigned char c) > { > while (UCSR1A != (UDRE1)) {} > UDR1=c; > > while (UCSR1A != (UDRE1)) {} > UDR1='\r'; > > while (UCSR1A != (UDRE1)) {} > UDR1='\n'; > } Hier stimmt was nicht. 1. muss das heißen: while( ! (UCSR1A & ( 1<<UDRE1 ) ) ) 2. Weshalb \r\n nach jedem einzelnen Zeichen? Das ist kein "Bug", aber unnötig.
Okay, ich habe mal im Datenblatt nachgesehen. Ich muss also zuerst CLKSEL [0:3] auf 0 einstellen, damit der MC mit dem externen Oszillator schwingt. Danach sollte ich noch CLKPCE = (0<<CLKPS3)|(1<<CLKPS2)|(0<<CLKPS1)|(1<<CLKPS0) --> Prescaler = 16 ,damit die sich die Taktfrequenz des CPU von 16 MHz auf 1 MHz einstellt. Das müsste doch alles gewesen sein? Nicht wahr? Muss ich außerdem noch die CLKDIV auf 1 stellen oder entfällt das, weil das MC-Board einen externen Schwinger verwendet? Kann ich die Fuses CLKSEL [0:3] irgendwie in meinem C-Code setzten oder muss ich dafür ein Programm wie Ponyprog2000 verwenden? @ Kai: Sollte nach dem Setzen der Fuses das Datenausleden mit TeraTerm immer noch nicht funktioniere, dann wechsel ich auf jeden Fall das Terminalprogramm. Da @ H.Joachim Seifert: H.Joachim Seifert schrieb: > Aber warum machst du das nicht direkt über USB? Das ist der Gründe, > warum man MCs mit USB überhaupt einsetzt. Gibt ne Menge fertige Software > dafür. Ich dachte, weil ich dafür einen JTAG Programmer und eine selbstgeschrieben Firmware bräuchte. Ich habe da einfach einen fernen Bekannten vertraut, da ich am Anfang von dem Projekt kaum Ahnung hatte. Ich habe zwar etwas dazugelernt, aber ich habe noch mehr als genug Schwachstellen, zum Teil fehlen mir einfach nur die Grundlagen, was MC-Programmierung und das Verständnis für MC angeht. Da kann man sich einfach nur freuen, dass es hier ein solche kompetente Community gibt, die einem weiterhilft. Kaum vorstellbar, dass es eine andere Webseite gibt, wo soviel Know-How auf einem Punkt konzentriert ist. Also herzlichen Dank bis hierher.
Du musst F_cpu auf 16mhz einstellen und die fuse auf takt extern per quarz , les dich da ein erst, sonst ist er verfused und du kommst nicht mehr drann. Desweiteren nutz am besten eine uart routine die fertig ist , eliminiert mögliche fehlerquellen. Diese haben eigentlich alle Prototyp funktionen die die einstellung der register für die baudrate automatisch vornehmen, schau mal im AVR-GCC tutorial nach. Da das ein fertig modul ist tippe ich fast darauf das die fuses richtig stehen, Versuch erstmal F_CPU auf 1600000 zu setzen und die register für die baudrate anzupassen, kopier dir den teil aus dem bem beispiel : http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
:
Bearbeitet durch User
was ist das für eine usb-uart brücke? ftdi? sind die handshakeleitungen cts und rts mit pulldowns beschaltet?
Mal eine Blöde Frage, hast du vllt. RX und TX vertauscht? Ich weiß grad nicht, wie sich die LEDs bei so einem USB-Serial Wandler verhalten, wenn die Daten in die falsche Richtung "fließen". Aber unter Umständen leuchten die dann ja auch.
Hallo Leute, sry, dass ich erst jetzt antworte. Hatte wegen der Familie und Arbeit in der letzten Woche kein Zeit mich mit meiner Messkette zu beschäftigen. @ Dennis R.: Dennis R. schrieb: > Du musst F_cpu auf 16mhz einstellen und die fuse auf takt extern per > quarz , les dich da ein erst, sonst ist er verfused und du kommst nicht > mehr drann. Das habe ich versucht, d.h. F_CPU auf 16 MHz eingestellt. Das hat leider nicht geklappt. Außerdem habe ich meinen Code mit jeweils F_CPU= 16 MHz, 8 MHz, 4 MHz und 1 MHz geschrieben. Jedes Mal mit einem Mini_USB - USB- Kabel und Atmelflip auf den AT90USB1287 geflasht. Allerdings hat es bei keinen dieser Einstellung funktioniert. Zudem habe ich eine bemerkenswerte Tatsache entdeckt: Jedes Mal, wenn ich den uC flashe, dann blinkt der RX der USB-UART-Brücke ununterbrochen. Das aber nur dann, wenn das Mini_USB-USB-Kabel zwischen dem uC und dem PC angeschlossen ist. Ziehe ich das Kabel ab, dann hört das Lämpchen auf zu flimmern. Wie deutet ihr dieses Verhalten? So wie ich das einschätze, bedeutet das soviel wie, dass die Kommunikation so läuft: Mini_USB_Kabel--> uC--> USB-UART-Brücke (ohne Kommunikation zum PC mit Hilfe von TeraTerm) anstatt geflashter uC --> USB-UART-Brücke --> PC (Tera Term) kommuniziert. Dennis R. schrieb: > Desweiteren nutz am besten eine uart routine die fertig ist , eliminiert > mögliche fehlerquellen. > > Diese haben eigentlich alle Prototyp funktionen die die einstellung der > register für die baudrate automatisch vornehmen, schau mal im AVR-GCC > tutorial nach Diese Funtion habe ich doch schon übernommen wie oben im Code zu sehen ist. Ich hoffe ich habe deine beiden Aussagen richtig verstanden. Easylife schrieb: > was ist das für eine usb-uart brücke? Hier der Link: http://shop.in-circuit.de/pages/27/Schnittstellenmodule Achim schrieb: > Hast du vllt. RX und TX vertauscht? Ausgeschlossen. Ich arbeite mich gerade in die Thematik Fuse-Setzung ein (Will ja nichts verfusen). Ich wollte zuerst mittels PonyProg 2.7 durch Learning-by-doing machen. Allerdings kann Pony Prog den AT90USB1287 nicht ansteuern. Jedenfalls habe ich den AT90USB1287 nicht im Verzeichnis von Pony Prog gefunden. Deshalb versuche ich es jetzt mit AVRDude. Julian
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.