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 :) )
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?
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?
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]
Tja, die Implementierung der Formel aus dem Datenblatt ist halt immer noch verkehrt. So wie du sie hingeschrieben hast, steht sie dort nicht drin.
Siehe "C Code Example" Seite 175 . UBRRn = fOSC/ (16 * BAUD) - 1 (Seite 171) Ansonsten sehe ich nicht was genau du mit falsch meinst?
Naja, und die noch richtig implementiert: USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1) UBRR = (unsigned char) UART_BAUD_SELECT;
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.