Hallo!
Ich möchte mit einem ATMega324P testweise einfach nur kontinuierlich ein
Zeichen an meinen PC senden. Es ist zusätzlich ein externer Quarz mit
14,7456MHz verbaut, ebenso ein MAX3232 um den Pegel für die Übertragung
zu verstärken.
Nach etlichen Versuchen hab ich es leider nicht hinbekommen.
Einstellungen sollten soweit korrekt sein. Möglicherweise kann mir hier
ja jemand helfen und mir den/die Fehler nennen. Die blinkende LED am
Programmende soll nur dazu dienen, um zu sehen, ob das Programm richtig
drauf ist. :) Bin leider ein ziemlicher Anfänger, was die Programmierung
der Atmels angeht.. Hier ist mein Code:
>Die blinkende LED am>Programmende soll nur dazu dienen, um zu sehen, ob das Programm richtig>drauf ist. :)
Aus dem Funktionsaufruf blink() am Programmanfang kehrt das Programm
aber nie mehr zurück ;-)
Der Rest danach wird nie ausgeführt.
Oliver
Hast Du denn schon geprüft, ob die Harware OK ist (Echotest bei
verbundenem RxD/TxD am µC-Sockel)?
Was genau bedeutet "geht nicht"? Hast Du mit dem Oszi am TxD-Pin
geprüft, dass sich da nichts tut?
Kein Grund, überhaupt nicht zu funktionieren, aber eine Bemerkung:
1
UDR0=zeichen;
2
loop_until_bit_is_set(UCSR0A,UDRE0);
Diese Zeilen sollten vertauscht werden. Das Programm kann was Anderes
tun, während ein Zeichen gesendet wird, statt dumpf zu warten, bis es
akzeptiert ist. Und von der Logik her ist es auch besser so: erst wenn
UDREx gesetzt ist, darf nach UDR geschrieben werden (was in Deinem Fall
aber auch so gewährleistet ist).
Noch Sachen zum checken:
Der externe Quarz ist auch in den Fuses gesetzt? -> wär gut
Ist CKDIV8 gesetzt (teilt im Controller den Takt durch 8)? -> wär
schlecht
Ist der Baudratenfehler kleiner 1%?
Hi,
danke schonmal für die vielen Antworten.
Einen Oszi hab ich hier zuhaus leider nicht. Ich werds morgen mal im
Labor messen, wenns geht.
Baudratenfehler ist kleiner als 1%, wo finde ich das, ob der externe
Quarz gesetzt ist?
Zu dem "funktionierenden" Beispiel: habs versucht, da fehlen Bezüge..
warum auch immer, der scheint die main.h und uarto.h nicht zu finden
(obwohl die da sind). Kommt ne Fehlermeldung a la main.c:22: undefined
reference to `init_uart0'... und noch einige mehr dieser Art. Die sind
ja eigentlich in der headerdatei deklariert..
Sebastian schrieb:
> Zu dem "funktionierenden" Beispiel: habs versucht, da fehlen Bezüge..> warum auch immer, der scheint die main.h und uarto.h nicht zu finden> (obwohl die da sind). Kommt ne Fehlermeldung a la main.c:22: undefined> reference to `init_uart0'... und noch einige mehr dieser Art.
Wie lautet die erste Warn-/Fehlermeldung exakt?
Welche Toolchain/OS benutzt Du?
Unter Unix kann die Großschreibung ein Problem sein.
Nenne mal alle Files in klein um.
Peter
Hi,
danke schonmal für den Tip mit den Fuses. Da ist bei mir folgendes
Eingestellt (nach Auslesen angezeigt):
BODLEVEL: Brown-Out detection disabled
OCDEN: disabled
JTAGEN: disabled
SPIEN: enabled
WDTON: disabled
EESAVE: enabled
BOOTSZ: Bootflash size=2048 words start address=$3800
BOOTRST: disabled
CKDIV8: disabled
CKOUT: disabled
SUT_CKSEL: ext. Crystal Osc. 8.0- MHz startup time: 16K CK +65ms
sollte der CKSEL nicht einfach nur auf ext. clock stehen? z.b. ext.
clock start-up time 6CK + 0ms?
> sollte der CKSEL nicht einfach nur auf ext. clock stehen? z.b. ext.> clock start-up time 6CK + 0ms?
Esterner Clock ist nicht geeignet, wenn Du einen Quarz angeschlossen
hast. Und mit der höheren Startup Time gibst Du dem Anschwingen mehr
Zeit, bis der Oszillator stabil sein muss. Weniger würde wohl auch
gehen, aber ich sehe nicht, dass Du das brauchst.
Hallo,
so, ich war grad mal im Labor und hab alles durchgemessen. Fehler
gefunden. Der MAX3232 hat keinen Saft bekommen.. das war das ganze
Problem. Nun läufts (vorerst) so, wie es soll.
Nochmals vielen Dank an alle!!
Gruß,
Sebastian