Hi folgendes Problem, weiß es scheint es hier öfter zu geben, bin aber nicht schlauer geworden aus den Beiträgen. Im Hyperterminal erhalte ich andere Zeichen als ich Schicke. ändere ich die Bautrate, ändert sich das Zeichen. Verwendet wird ein Atmega16 mit externem 8 MHz Quarz. Mein Quellcode ------------------------------------------------------------------------ #include <avr/io.h> #ifndef F_CPU /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann F_CPU im Makefile definiert werden, eine nochmalige Definition hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch #ifndef/#endif Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio verwendet wird und dort eine andere, nicht zur Hardware passende Taktrate eingestellt ist: Dann wird die folgende Definition nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) von AVRStudio - daher Ausgabe einer Warnung falls F_CPU noch nicht definiert: */ #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000" #define F_CPU 8000000 // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung #endif #define BAUD 9600UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif void initializeUSART() { UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8 Datenbits, kein Parity, 1 Stoppbit UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; }; void putcUSART(char zeichen) { while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ {} UDR = zeichen; /* schreibt das Zeichen x auf die Schnittstelle */ }; int main() { initializeUSART(); putcUSART('x'); return 0; } ----------------------------------------------------------------------- was für Einstellungen sind noch zu tätigen? wie vor allem wie, zb. Fusebits, da blick ich nicht richtig durch. Hab ich sonst was übersehen? Bin auch über Links dankbar die mich weiterbringen. Danke im Voraus. Gruß Julian
Geht es denn wenn du in UBBR fest "51" reinschreibst? EDIT ahh, du hast bestimmt die Fuses noch nicht auf externen Quarz gestellt, oder? Zeig mal nen Screenshot von deinen Fuses.
ergänze mal deine F_CPU definition mit UL für unsigned Long #define F_CPU 8000000UL vllt wirds dann besser
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.