Datum:
Angehängte Dateien:Hallo, ich beschäftige mich gerade mit der Kommunikation zwischen ATmega8 und dem PC. Ich verwende das Starterkit aus dem Microcontroller.net Shop sowie den obersten Code aus dem UART-Kapitel im AVR-Tutorial (http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART) Die einzige Anpassung habe ich beim Einstellen der Taktfrequenz des externen Takts vorgenommen, der bei 8Mhz liegt. Mein Problem ist, dass die Übertragung zum PC nur sporadisch funktioniert und äußerst fehleranfällig ist, wie z.B. auf dem angehängten Screenshot zu sehen ist. Die korrekte Übertragung müsste Test! in jeder Zeile liefern. Hat jemand von den Experten eine Idee, was hier das Problem sein könnte? Vielen Dank für Eure Hilfe! Stephan
Datum:
Sieht mir entweder nach einem Wackelkontakt oder einem nicht stabilen Takt aus. Die Verwendung des internen 8Mhz RC-Schwingkreises könnte zb sowas erzeugen.
Datum:
Solche Zeichenwildwüchse deuten oft auf einen Stringüberlauf hin. Aber da müsstest du schon deinen ganzen Quelltext zeigen. Ansonsten: Woher hast du den Wert für das UBRR Register? Selbst ausgerechnet? Im Datenblatt des Atmels sind sämtliche Werte für die gängigsten Quarze zu finden (+ Angabe zum prozentualen Fehler).
Datum:
Vielen Dank erst mal! Hier der gesamte Quelltext:
.include "m8def.inc" .def temp = R16 .equ F_CPU = 8000000 ; Systemtakt in Hz .equ BAUD = 9600 ; Baudrate ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif ; Stackpointer initialisieren ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ; Port D = Ausgang ldi temp, 0xFF out DDRD, temp ; Baudrate einstellen ldi temp, HIGH(UBRR_VAL) out UBRRH, temp ldi temp, LOW(UBRR_VAL) out UBRRL, temp ; Frame-Format: 8 Bit ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0) out UCSRC, temp sbi UCSRB, RXEN ; RX (Empfang) aktivieren receive_loop: sbis UCSRA, RXC ; warten bis ein Byte angekommen ist rjmp receive_loop in temp, UDR ; empfangenes Byte nach temp kopieren out PORTD, temp ; und an Port D ausgeben. rjmp receive_loop ; zurück zum Hauptprogramm |
Ich verwende nicht den internen RC-Oszillator sondern einen externen Quarz. Dieser müsste eigentlich die geforderte Genauigkeit liefern.
Datum:
Hm, das passt aber nicht zu deiner Terminalausgabe - du sendest doch gar nichts?
Datum:
Oh sorry, tut mir leid: Hab beim Kopieren im Eifer des Gefechts einen Codeteil unterschlagen. Hier nochmal der ganze Code:
.include "m8def.inc" .def temp = r16 ; Register für kleinere Arbeiten .def zeichen = r17 ; in diesem Register wird das Zeichen an die ; Ausgabefunktion übergeben .equ F_CPU = 8000000 ; Systemtakt in Hz .equ BAUD = 9600 ; Baudrate ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif ; Stackpointer initialisieren ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ; Baudrate einstellen ldi temp, HIGH(UBRR_VAL) out UBRRH, temp ldi temp, LOW(UBRR_VAL) out UBRRL, temp ; Frame-Format: 8 Bit ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0) out UCSRC, temp sbi UCSRB,TXEN ; TX aktivieren loop: ldi zeichen, 'T' rcall serout ; Unterprogramm aufrufen ldi zeichen, 'e' rcall serout ; Unterprogramm aufrufen ldi zeichen, 's' rcall serout ; ... ldi zeichen, 't' rcall serout ldi zeichen, '!' rcall serout ldi zeichen, 10 rcall serout ldi zeichen, 13 rcall serout rcall sync rjmp loop serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, zeichen ret ; zurück zum Hauptprogramm ; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich ; das Kabel getrennt wurde sync: ldi r16,0 sync_1: ldi r17,0 sync_loop: dec r17 brne sync_loop dec r16 brne sync_1 ret |
Zum Thema Wackelkontakt: Hab jetzt mal alle unschönen Lötstellen nochmal nachgelötet, gebracht hats bisher leider nichts...
Datum:
Das sieht nach Störungen aus, die nicht von der Software kommen. Ich würde an deiner Stelle die Hardware näher untersuchen, also den Aufbau des µC Boards und die Verbindung zwischen PC und µC. Bei COM14 vermute ich, dass zusätzlich ein USB-RS232 Wandler im Spiel ist. > Starterkit aus dem Microcontroller.net Shop Dieses? AVR Starterkit (inkl. USB Programmer) http://shop.embedded-projects.net/index.php?module... Dort kannst du den AVR aus der IC-Fassung entfernen und RXD-TXD an der Fassung brücken. Alle vom PC aus gesendeten Zeichen müssen dann fehlerfrei an den PC zurück kommen, wenn der Rest der Hardware OK ist (Loopback-Test).
Datum:
Auch mal an allen Kabeln und Steckern wackeln. Ich hab zb einen USB Stick, den ich beim Einstecken etwas in eine Richtung 'verkanten' muss, sonst wird der Stick nicht korrekt erkannt. Nachweislich auf 5 Rechnern ausprobiert. Es liegt am Stick und dessen mechanischem Steckeraufbau.
Datum:
@ Karl Heinz Buchegger (kbuchegg) (Moderator) >Ich hab zb einen USB Stick, den ich beim Einstecken etwas in eine >Richtung 'verkanten' muss, sonst wird der Stick nicht korrekt erkannt. >Nachweislich auf 5 Rechnern ausprobiert. Es liegt am Stick und dessen >mechanischem Steckeraufbau. Klingt nach Wackelkontakt oder kalter Lötstelle. Würde ich umgehend entsorgen.
Datum:
Vielen Dank für die weiteren Tipps! Krapao schrieb: >> Starterkit aus dem Microcontroller.net Shop > > Dieses? > > AVR Starterkit (inkl. USB Programmer) > http://shop.embedded-projects.net/index.php?module... > > Dort kannst du den AVR aus der IC-Fassung entfernen und RXD-TXD an der > Fassung brücken. Alle vom PC aus gesendeten Zeichen müssen dann > fehlerfrei an den PC zurück kommen, wenn der Rest der Hardware OK ist > (Loopback-Test). Ja genau dieses Starterkit verwende ich! Den Loopback-Test habe ich durchgeführt -> Funktioniert! Wenn ich RXD und TXD brücke, dann kommen genau die eingegebenen Zeichen zurück (ohne Störungen)! (Ach ja, ein USB-RS232 ist auch im Spiel, aber an dem dürfte es ja dann auch nicht liegen,oder?) Die richtige Folgerung wäre doch eigentlich, dass irgendwas an der Ausgabe des Controllers nicht stimmt!?! Um Verbindungsfehler auszuschließen habe ich auch die entscheidenden Pins zwischen MAX232 und µC direkt verbunden... erfolglos... Oder der externe Quarz auf dem Board ist zu ungenau? Würde mich aber wundern, wenn das noch keinem zuvor aufgefallen wäre...
Datum:
Hi >Oder der externe Quarz auf dem Board ist zu ungenau? Würde mich aber >wundern, wenn das noch keinem zuvor aufgefallen wäre... Unwahrscheinlich. Bist du Sicher, das der Quarzoszillator wirklich (per Fuse) aktiviert ist? MfG Spess
Datum:
spess53 schrieb: > Unwahrscheinlich. Bist du Sicher, das der Quarzoszillator wirklich (per > Fuse) aktiviert ist? Ich sag mal zu 99% ja. Ich setz die Fuses übers AVR-Studio. Bei der Option SUT_CKSEL habe ich "Ext. Crystal/Resonator high Freq; Start-up time: 16 CK + 64ms" eingestellt. An den andren Fuses habe ich nichts verändert. Dies führt dann zu folgender Bitkombination: HIGH: 0xD9 LOW: 0x3F Diese wiederum entspricht den Empfehlungen im Tutorial... Weiß jetzt irgendwie nicht mehr weiter...
Datum:
Mit dem Oszi mal angeschaut, was am Ende des Kabels ankommt? Stimmt das Timing für 9600 Baud? Ist da ein Wackler im Kabel? Gehts mit einem anderen Kabel?
Datum:
Also ich hab jetzt nochmal etwas rumgespielt und verschiedenste Sachen ausprobiert (auch Kabel z.T. erneuert etc.) und jetzt funktioniert es tatsächlich. Vielen Dank nochmal für eure Hilfe!
Datum:
>Also ich hab jetzt nochmal etwas rumgespielt und verschiedenste Sachen >ausprobiert (auch Kabel z.T. erneuert etc.) und jetzt funktioniert es >tatsächlich. > >Vielen Dank nochmal für eure Hilfe! Und woran lag es jetzt?
Datum:
So wie es aussieht war es tatsächlich ein Wackelkontakt an einer Lötstelle, wie bereits von ein paar Seiten vermutet wurde.
