Hallo, vielleicht kann mir bitte einer sagen, was ich falsch mache. Es ist wie schon so oft das Problem mit der seriellen Kommunikation. Also... 1. Ich habe die AVR Entwicklungsplatine (ATmega16) von Andreas mit Programmer 2. Ich habe nachfolgendes Programm von Bascom modifiziert. -- $crystal = 4000000 $baud = 9600 $lib "mcsbyte.lbx" Config Com1 = Dummy , Synchrone = 0 , Parity = None , _ Stopbits = 1 , Databits = 8 , Clockpol = 0 $regfile = "m16def.dat" Dim I As Byte Config Portb = Output For I = 1 To 255 Step 10 Set Portb.0 Waitms 100 Osccal = I Print "Hello world" ; I Reset Portb.0 Waitms 100 Next End Data "COM Test" -- 3. Ich habe eine serielle Verbindung (1zu1 durchverdrahtet) mit PC-COM1 (9600 Baud, 8 Datenbits, keine Parität, 1 Stopbit, keine Flusssteuerung. 4. Die LED blinkt wie gewünscht, also Programm wurde korrekt übertragen. 5. ABER: Ich bekomme keine Daten auf das Hyperterminal drauf. 6. Ob ich RTS oder DTR einstelle, es funktioniert nicht. Welchen dummen Fehler mache ich denn? Schon mal Danke... Gruss Marc
Hallo Marc, ich bin nicht sicher, aber hast du einen MAX232 zwischen Controller und PC-Schnittstelle ? Der macht nämlich die nötige Invertierung. Die Pins des Controllers direkt an COM1 anzuschließen funktioniert nicht. Wenn ich da falsch liege, möge man mich bitte verbessern. Thorsten
Hallo Thorsten, Du hast Recht, ich habe einen MAX232 dazwischen. Aber dieser sollte doch den direkten Anschluss an den PC ermöglichen, oder? Wie ist denn die serielle Verbindung aufzubauen, 1 zu 1 oder sollten TX und RX gekreuzt sein? Oder doch anders... Gruss Marc PS: Sorry für meine bescheidenen Kenntnisse ...
Mit MAX232 is alles ok, dachte nur, du hättest den nicht. RX und TX müssen gekreuzt sein. Wenn du ein Oszi hast, kannst ja mal schauen, ob aus dem Controller überhaupt was rauskommt. Wenn nicht, liegt der Fehler dann bei der Initialisierung auf Controller-Seite. Von Bascom habe ich keine Ahnung, kann dir also in dieser Richtung nicht helfen. Viel Erfolg noch!
Nein, ich verstehe es nicht. Ich habe jetzt alles soweit aufgebaut und habe das ASM-Progi aus dem Tutorial von Andreas genommen ... ...und habe einfach den Mega16 eingetragen: <--snip-->> .include "m16def.inc" .def temp = r16 .equ CLOCK = 4000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK/(BAUD*16)-1 ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; Baudrate einstellen ldi temp, LOW(UBRRVAL) out UBRRL, temp ldi temp, HIGH(UBRRVAL) out UBRRH, temp sbi UCSRB,TXEN ; TX aktivieren loop: ldi temp, 'T' rcall serout ; Unterprogramm aufrufen ldi temp, 'e' rcall serout ; Unterprogramm aufrufen ldi temp, 's' rcall serout ; ... ldi temp, 't' rcall serout ldi temp, '!' rcall serout ldi temp, 10 rcall serout ldi temp, 13 rcall serout rjmp loop serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, temp ret <--snip-->> Aber es läuft nicht. Ich bekomme am Pin 2 (RxD) an PC-Com die Signale: Rechtecksignale zwischen +/-10 V. Aber Hyperterminal zeigt nichts an. Ich habe auch meine PC-Com-Schnittstellen zueinander getestet (2xHyperterminal), die laufen sauber. Wieso verstehen die sich nicht. Für weitere Tipps wäre ich dankbar. Gruss Marc
Hmm, bist du sicher das du 4MHZ Takt hast ? Der ATmega16 wird standardmäßig mit internem 1MHZ Takt ausgeliefert. Egal, ob du einen Quarz angeschlossen hast oder nicht. Thorsten
Nun ja, da ist ein 4Mhz Quarz drauf. Aber mit dem TDS 1002 (Oszi) kann ich leider nix erkennen -- kann ich die Frequenz eigentlich noch eindeutig messen? Ich habe das Progi einfach mal 1 MHZ draufgejagt, ich merke zwar daß das Terminalprogramm schwer am arbeiten ist, aber keine Anzeige. Nicht einen Furz (...t'schuldigung). Gruss Marc PS: Im Eifer des Gefechtes habe ich wohl vergessen: Danke für Eure Unterstützung!
Also wie gesagt, wenn der interne Oszillator aktiviert ist, kannst du nichts messen. Da bringt auch nichts, extern 1MHz anzulegen. Ändere dein Programm doch mal für 1 MHz ab (ohne externe Taktbeschaltung), vieleicht gehts dann. Thorsten
Das mit dem Programm und 1 MHz habe ich ausprobiert. Keine Verbessserung. Ich habe noch eine Frage, wie groß sollten die Kondensatoren an dem Max232 sein, ich habe hier zwei unterschiedliche Aussagen: 1.) http://www.mikrocontroller.net/tutorial/uart.htm Hier ist die Angabe zwischen 10uF und 50 uF 2.) http://www.elektronik-kompendium.de/public/riederer/max232.htm Hier ist Angabe 1uF. Nun ja, und auf meinem Board sind die Kondensatoren alle 4,7uF. Könnte dies unter Umständen der Fehler sein? Wenn ja, welche Kondensatoren sollte ich denn einsetzen. Marc
>> ich bekomme am Pin 2 (RxD) an PC-Com die Signale: >> Rechtecksignale zwischen +/-10 V. Aber Hyperterminal zeigt nichts an. Wenn Du Signale bekommst und ein Oszilloskop besitzt, warum mißt Du dann die Baudrate nicht einfach aus. Mit dem Ergebnis kannst Du vermutlich eher auf die Fehlerquelle schließen. Die Kondensatoren am Max232 sollen laut Datenblatt (habe nur einen kompatiblen Chip hier) 1uF betragen und damit läuft eine Schaltung bei mir auch prima. Gruß, Frank
Ich habe jetzt einfach folgendes Programm übertragen: http://www.mikrocontroller.net/sourcecode/tutorial/uart-led.asm Damit wird eine LED über das PC-Terminal-Programm ein- und ausgeschaltet, dies funktioniert bei mir (dies überraschte mich dann doch), egal ob ich das Programm mit .equ CLOCK = 4000000 oder mit .equ CLOCK = 1000000 übertrage -- dies ist völlig egal. Somit funktioniert die serielle Schnittstelle zumindest mal in eine Richtung, so daß die Einstellung des Terminals als korrekt angenommen werden kann. Aber die Ausgabe "Test!" funktioniert nicht. Ich denke der Ozsillator hat ne Macke, ich kann die 4 MHz nicht messen. Wenn ich den Ozsillator raushole, kann ich dann an XTAL die interne Frequenz von 1 Mhz messen? Marc
>> doch), egal ob ich das Programm mit >> .equ CLOCK = 4000000 >> oder mit >> .equ CLOCK = 1000000 >> übertrage -- dies ist völlig egal. Sorry, das war Quatsch! Ich hatte das falsche Programm kompiliert, es funktioniert nur mit 1 Mhz. Also, das Quarz ist defekt. Marc
Ausschnitt aus http://www.mikrocontroller.net/tutorial/io-basics.htm <--snip--> Beim ATmega8 ist standardmäßig der interne 1 MHz-Oszillator aktiviert; weil dieser für viele Anwendungen (z.B. UART) aber nicht genau genug ist, soll der Mikrocontroller seinen Takt aus dem angeschlossenen 4 MHz-Quarzoszillator beziehen. Dazu müssen ein paar Einstellungen an den Fusebits des Controllers vorgenommen werden. Am besten und sichersten geht das mit dem Programm yaap. Wenn man das Programm gestartet hat und der ATmega8 richtig erkannt wurde, wählt man aus den Menüs den Punkt "Lock Bits & Fuses" und klickt zunächst auf "Read Fuses". Das Ergebnis sollte so aussehen: Screenshot. Nun ändert man die Kreuze so dass das folgende Bild entsteht: Screenshot und klickt auf "Write Fuses". Vorsicht, wenn die Einstellungen nicht stimmen kann es sein dass die ISP-Programmierung deaktiviert wird und man den AVR somit nicht mehr programmieren kann! Die FuseBits bleiben übrigens nach dem Löschen des Controllers aktiv, müssen also nur ein einziges Mal eingestellt werden. <--snip--> Also, wenn das Quarz defekt ist, läuft der Prozessor über die ungenauen 1 MHZ, sprich Uart funktioniert nicht sauber. Des weiteren müssen die "Fuses" angepaßt werden. Weiß jemand mit welchem Programm ich dies machen kann, da yaap keinen ATMega16 unterstüzt? Gruss Marc
Hallo, yaap unterstützt den Mega16, du mußt dir nur eine aktuelle Version der Datei yaap.ini (glaube die hieß so, bin aber nicht mehr sicher) zulegen. Such mal hier im Forum, war schonmal da. Aber ich dachte du benutzt den Mega8 ? Ich glaube aber trotzdem, du hast da was nicht verstanden. Mit den Fuses stellst du u. a. ein, welchen Oszillator du verwenden möchtest. Hast du den internen Oszillator eingestellt, so läuft der Mega auch mit diesem. Unabhängig davon ob der Quarz defekt ist oder nicht. Hast du jedoch mittels Fuses einen externen Oszillator (also Quarz) eingestellt, so muß der Mega auch unbedingt einen bekommen. Und ist dieser dann defekt, läuft der Mega halt nicht. Er schaltet nicht etwa automatisch auf internen Oszillator um. Also lies dir am besten im Datenblatt durch, wie die Fuses in deinem Fall gesetzt sein müssen und programmier diese dann. Somit ist diese Fehlerquelle ausgeschlossen. Aber Vorsicht: falsch programmierte Fuses können evtl. dazu führen, daß der Controller nicht mehr über ISP programmierbar ist. Übrigens noch am Rande: der interne Oszillator ist eigentlich genau genug, um kleinere Baudraten (9600) zu realisieren. Hab selbst ein Gerät mit nem Mega16 bei internem 8 MHz-Oszillator laufen und selbst 38400 Baud sind bisher möglich gewesen. Aber vielleicht streut dieser Oszillator ja je nach Chip. Würde mich selbst interessieren, vielleicht steht ja im Datenblatt was drin. Thorsten
Danke an alle. Es läuft !!! Juhuuu... Also, es ist nichts kaputt. Sondern es war die eigene Unwissenheit (manche nennen dies auch Blödheit). Die "Fuses" waren standardmäßig auf interen Takt gestellt (Auslieferungsstand). Somit lief die serielle Verbindung nicht stabil, nachdem ich die CKSEL ausgetragen habe lief es. Außerdem konnte ich Frequenz von 4MHz am Quarz mit dem Oszi messen. Gruss von einem grinsenden Marc
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.