Forum: Mikrocontroller und Digitale Elektronik USART mit ATMega16


von Marc Vollmer (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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

von Marc Vollmer (Gast)


Lesenswert?

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 ...

von Stefan Peter (Gast)


Lesenswert?

Meiner Meinung nach müssen die gekreuzt sein!

von Thorsten (Gast)


Lesenswert?

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!

von Marc Vollmer (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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

von Marc Vollmer (Gast)


Lesenswert?

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!

von Thorsten (Gast)


Lesenswert?

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

von Marc Vollmer (Gast)


Lesenswert?

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

von Frank Linde (Gast)


Lesenswert?

>> 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

von Marc Vollmer (Gast)


Lesenswert?

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

von Marc Vollmer (Gast)


Lesenswert?

>> 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

von Marc Vollmer (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Marc Vollmer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.