Forum: Compiler & IDEs atmega 48 usart Problem / Fuses avrdude


von manni (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mir vor kurzem einige mega48 zugelegt.  Zum programmieren
verwende ich avrdude. Das setzen von ports klappt auch einwandtfrei,
nur mit dem usart hab ich Probleme. Ich verwende testweise einen 4 mhz
oszillator ( ja keinen baudraten quarz)  der auf dem selben board, mit
nem mega8 auch funktioniert. Der mega 48 sendet mir jedoch ( obgleich
er idr garnichts sendet), wenn er etwas sendet, nur ein kleines c mit
einer Art Unterstrich und das auch nur in sehr unregelmäßigen
Zeitabständen. Ich nehme an das es am Taktsignal liegt, obgleich auch
andere Ozillatoren(16Mhz, 20Mhz) kein besseres Ergebnis geliefert
haben. Da ich bei avrdude etwas davor scheue, die fuses falsch zu
setzen, hab ich bei yaap den mega48 ebenfalls hinzugefügt( obwohl das
programmieren hier stets scheitert), um die Fuses zu setzen. Dies
klappt auch wunderbar; nur betätige ich den setzen Button mehrmals, so
zeigt yaap  zeitweise die Standardkonfiguration an.

Ich bin für jeden Rat dankbar

Vielen Dank
     Manfred Cherd

PS:
Um auszuschließen, dass es an yaap und damit am oszillator liegt, würde
ich gerne wissen wie man mit avr-dude die fuses setzen kann (die
dokumentation  ist für mich  wohl etwas zu kurz geraten :) )

von manni (Gast)


Lesenswert?

Ich hab inzwischen sichergestellt, dass der externe oszillator läuft.
Somit bleibt nurnoch ein  Softwareproblem. Da der m48 ja zwei uarts hat
hab ich für den ersten stets im Beispielcode, das n durch 0 ersetzt. Ich
nehme an, dass ich da  irgendetwas übersehn habe.

Hat denn keiner Erfahrungen mit dem 48er?( oder dem  m88/m168).
Einen kleinen Codeschnippsel zum testen vielleicht?

von Alex (Gast)


Lesenswert?

Was hast denn den Mist her:
#define MYUBRR FOSC/16/BAUD-1

Das n durch ne Null zu ersetzen ist eine Heldentat, gab es da nie
Fehlermeldungen vom Compiler?

von manni (Gast)


Lesenswert?

Das stammt direkt aus dem Datenblatt und da der mega48 zwei usart's hat
und laut der Registersummary z.b. UCSRnA -> UCSR0A  existiert hielt ich
es für logisch.

Btw inzwischen klappt es mit 1200 baud, jedoch nur wenn ich statt 16MHz
8MHz angebe und im Terminalprogramm 300 baud auswähle.
Der Verhältnise 1/2 und 1/4  wegen denke ich das es vielleicht mit der
CKDIV8 Fuse zusammenhängt, aber egal ob gesetzt oder nicht kommt stets
das selbe bei raus.

Das sind meine jetzigen Einstellungen:
CKDIV8  0
CKOUT    1
SUT1    0
SUT0    0
CKSEL3  1
CKSEL2  1
CKSEL1  1
CKSEL0      1
[lfuse = 0xbf]

von Alex (Gast)


Lesenswert?

Tja, die Implementierung der Formel aus dem Datenblatt ist halt immer
noch verkehrt. So wie du sie hingeschrieben hast, steht sie dort nicht
drin.

von manni (Gast)


Lesenswert?

Siehe "C Code Example"  Seite 175 .
UBRRn = fOSC/ (16 * BAUD) - 1 (Seite 171)


Ansonsten sehe  ich nicht was genau du mit falsch meinst?

von Alex (Gast)


Lesenswert?

Naja, und die noch richtig implementiert:

USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)

UBRR = (unsigned char) UART_BAUD_SELECT;

von manni (Gast)


Lesenswert?

Danke,
aber leider keinerlei Veränderungen.

von manni (Gast)


Lesenswert?

So nu funktionierts doch.
Allerdings nur, wenn ich direkt den integer wert aus der
Beispieltabelle für ubrr  einsetze. Mit der Formel scheint es irgendwo
noch zu haken

von Mike (Gast)


Lesenswert?

Dann lass dir das Ergebnis der Formel doch einfach mal ausgeben ...

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.