Moin.
Ich habe mir den USB zu Uart Konverter von Silicon Labs zugelegt
(Vertrieb: Conrad) Ich bekomme einfach keine vernünftige Verbindung.
Aufbau:
UART-USB-Bridge (mit CP2102), Treiber: USBXpress + entsprechende API
Atmega8 mit Quarz
Testprogramm:
Host: siehe 'Unit_USB.cpp' (Initialisierung, paar Daten übertragen)
µC: 'main.asm', 'USART.asm'
Timer0-Interrupt für Abarbeiten des Hauptprogrammes (im Moment nur LED
blinken an PINB3, damit ich sehe, dass nichts hängt)
RXC-USART-Interrupt für Empfang
Sende ich jetzt Daten vom PC, sieht es so aus, als würde jeder
Bitwechsel einen Interrupt auslösen (LED am PINB0 wird eingeschaltet).
Also: sende ich 8x 0xFF blitzt die LED 8x auf. Sende ich eine Folge von
Zahlen, in denen nur 1 Bit gesetzt ist (0x01, 0x02, .. 0x80) dann blinkt
die LED 16x, wobei die Pausen immer länger werden. Bei anderen Zeichen
entsprechend unregelmäßig. Im Register URD steht immer 0x00.
Ich häng' fest. Hilfe!
Zur Fehlersuche ist es sinnvoll, die Fehlerquellen zu reduzieren.
Verwende nicht Dein eigenes Programm auf dem PC, sondern nutze entweder
ein normales Terminalprogramm wie Hyperterminal oder ein
Schnittstellentestprogramm wie hTerm von Tobi.
Dann lass den µC weg und verbinde RxD und TxD der USB-Seriell-Bridge.
Starte das Terminalprogramm, sende ein paar Zeichen (bei Hyperterminal:
Einfach auf der Tastatur herumtippen).
Wenn diese Zeichen wieder beim PC ankommen, dann scheint die
USB-Seriell-Bridge korrekt zu funktionieren.
Jetzt schließe den µC an die USB-Seriell-Bridge an und verwende das
Terminalprogramm, um dem µC Daten zu senden.
Wenn er sich dann immer noch so seltsam verhält wie von Dir beschrieben,
liegt das Problem in Deinem Programm auf dem µC. Wenn er korrekt
funktioniert, dann wird das Problem in Deinem PC-Programm liegen.
Warum nutzt das "USBXpress + entsprechende API" und nicht einfach die
Funktionen für die Ansteuerung serieller Schnittstellen?
Danke, für den Tipp.
Zur Fehlersuche ... hätt' ich auch selber drauf kommen können -> der
Konverter funktioniert erstmal, allerdings sind die Ergebnisse noch die
gleichen.
Also müsste es am Code im µC liegen. Eigentlich kann man da doch gar
nichts falsch machen ... ISR aufrufen (lassen), Register lesen,
speichern fertig.
'USBXpress' fand ich gut, weil man sich da so einfach den (selbst
vergebenen) Namen aus einer Liste raussuchen kann um die entsprechende
Schnittstelle aufzurufen. Und es ist eben nur USB. Aber wahrscheinlich
etwas viel auf einmal.
Also: Hyperterminal sendet an mein Programm -> der gleiche Effekt.
Meine weiteren Versuche:
Die Senderoutine aus dem Tutorial aufgespielt -> da kommt nur
'~~~~~~~~~' usw. zurück.
Die Empfangsroutine aus dem Tutorial und zusätzlich 'Senden' am Ende ->
nichts kommt zurück.
Geht jetzt, glaube ich so in die Richtung Zitat: 'UART-seltsamer
Empfang' oder 'UART sendet nur wirres zeug' oder so ähnlich...
Ich habe mit gerade mal einen Sekundenblinker 'gebastelt'.
Ich habe den Eindruck, der Quarz ist zu langsam! Kann das sein?? Ich
hoffe, die Rechnung ist richtig:
1s=6144000 1024 250/ 24
6144000: Quarzfrequenz
1024: Teiler in TCCR0
250: Startwert für den Timer = 6
24: Schleifendurchläufe = 23 (bei '0' LED an, sonst aus)
Ich hab's wieder vorgekramt. Es muss doch gehen!
Versuchsaufbau:
Atmega8 sendet endlos (Beispielprogramm Tutorial)
0xFF,0xFF,0xAA,0xAA,0x55,0x55 bei 110 Baud/ 8 Bit/ 2 Stoppbit/ keine
Parität.
Wenn ich das richtig interpretiere, sind das dann 10 Zeichen pro
Sekunde.(?)
Ich habe mal ein Oszi drangehängt (Anhang). Ich finde das alles in
Ordnung. Aber Hyperterminal nicht, da kommen nur 'h's an. Konverter im
A....? (Bei Verbindung von TxD und RxD am Konverter erhält man am
Terminal allerdings ein korrektes Echo! bei 110 Baud relativ flüssig,
bei höheren Raten mit mehr Verzögerung(???))
Kann mal jemand drüberschauen?
Ohne sich das Oszi Bild anzuschauen vermute ich eher das der Uartt am µC
hinüber ist, hatte ich vor kurzem auch aus welchem Grund auch immer,
einmal nen anderen µC reingesteckt und siehe da ...
Ansonsten wundern mich die 2 Stopbits, Sendest du die auch in hterm und
hasts auch im µC so eingestellt.
Ich würd einfach mal die Standart config mit 8/1/none probieren und auch
evtl mit der Baudrate bischen hoch gehen.
Gruß
David
@David S.
µC, anderes Format, höhere Baudrate alles schon probiert. Bei '9600
8-n-1' kommen verschiedene Zeichen an, aber ohne System. Und, wie ich
finde, sehr langsam (so max. 2 Zeichen/ Sekunde). Könnte auf völlig
verschiedene Baudraten hindeuten. In Hyperterminal gibts unten so ein
Feld, da steht 'Auto detect' drin, das wechselt nach einer Weile in,
z.B., '9600 8-n-1'. Interpretiere ich so, dass HT diese Einstellungen
erkannt hat.(?)
Bringt vlt. nix, aber weil es noch nicht gefragt wurde:
Passen Betriebsspannung deines atmega und der Signalpegel des Konverters
zusammen und/oder sind Rx und Tx falsch verbunden? Evtl. Brücke X1-X2 am
Konverter vergessen, sofern TTL-Siganlpegel verwendet?
Manchmal sind es nur "Kleinigkeiten" ...
@Michael L.
Hab ich auch schon geprüft. Müsste aber egal sein, das gilt nur für TxD
am Konverter (hab ich jedenfalls so gelesen). Im Moment versuche ich nur
zu empfangen.
Von den vom µC gesendeten Zeichen kommen bei 110Baud nur genau die
Hälfte am Terminal an. Naja, von Ankommen kann nicht die Rede sein, es
werden am Terminal halb so viele Zeichen (=Datenmüll) dargestellt. Bei
höheren Raten geht (meistens) gar nichts mehr.
Deshalb noch mal zum Funktionstest (Verbinden TxD - RxD):
mit 110Baud: sieht nicht schlecht aus, die Zeichen kommen mit etwas
Verzögerung (rein rechnerisch 1/10s (?))
mit 9600Baud oder 921600Baud werden die eingegebenen Zeichen so etwa
alle 1s dargestellt. kann das sein????
Ich möchte noch mal nachhaken. Kann diese Verzögerung von rund einer
Sekunde überhaupt sein? Also: Taste drücken - warten - 1s später ist das
Zeichen auf dem Schirm. Bei 110Baud geht's doch ordentlich!