Hallo, habe mir das STK500 zugelegt und arbeite gerade das Tutorial durch. Leider hab ich jetzt ein Problem mit der UART und hoffe, dass mir hier jemand weiterhelfen kann. Mein Ziel ist ganz einfach, wie im Tutorial beschrieben, den String "TEST!" über die UART rauszuschicken (mit AVR Studio 4, Assembler). Mit dem AT90S8515 klappt das auch prima. Nur mit dem ATmega16 will es einfach nicht funktionieren. Ich glaube mein Problem ist das Register UBRRH. Obwohl URSEL auf 1 steht wird trotzdem in UBRRH und UCSRC immer gleichzeitig derselbe Wert eingetragen. Was mach ich bloß falsch?? Die Taktfrequenz hab ich auf 1MHz eingestellt. Ist das so richtig?? Danke
hab gerade nochmal die Taktfrequenz vom STK500-Programmer ausgelesen. Ist bei 1,23MHz. Habs damit probiert, aber funktioniert auch nicht.
Dein erster Mega an der UART? Du mußt bei den Mega's den Tacktgeber als erstes Konfigurieren. Tust du dies nicht, so läuft er standartmäßig mit dem internen 1MHz Qszilator. Konfiguriert wird der Tackt mit den Fuses Bits (siehe Datenblatt). Andererseits müßte es eigendlich funktioniert haben, da du ja von einem 1MHz Tackt ausgingst und dem entsprechend dann die Baudrate eingestellt hast. Also ich habe mich mit dem Problem auch ewig rum geschlagen, als ich zum ersten mal nen Mega mit der UART verbunden habe. Bei mir lag es letztlich an der Quarzkonfiguration, also den Fuses bits.
Habe das Problem ebenfalls: der von avr-gcc generierte Code schreibt unabhängig von URSEL sowohl UCSRC als auch UBRRH. Evtl. ein Bug im Compiler?! Glücklicherweise hat in meinem Fall eine Umordnung der Befehle genügt, so dass die Baudrate korrekt eingestellt wird. Hier ein Codeschnipsel, bei dem das Problem auftritt: /* Set baud rate */ baudRegister=(uint16_t) ((uint32_t)F_CPU/(uint32_t)((uint32_t)baud*(uint32_t)16) - 1); UBRRH = (unsigned char) (baudRegister>>8); UBRRL = (unsigned char) baudRegister; /* Set frame format: 8 data, no parity & 1 stop bit */ UCSRC = (1<<URSEL) | (0<<UMSEL) | (1<<UCSZ0) | (1<<UCSZ1); /* Enable receiver and transmitter */ UCSRB = (1<<RXEN) | (1<<TXEN); Mit dem UCSRC=.... wird auch UBRRH fälschlicherweise überschrieben. avr-gcc Version 3.4.6 AVR-Studio Version 4.13 SP1 bzw. build 557
Es kann nicht am Compiler liegen, da der Schreibzugriff µC-intern ausschließlich über das URSEL-Bit geregelt wird! Die Register liegen an der selben Adresse im Speicher und nur URSEL entscheidet, welches der beiden Register geschrieben wird. Es ist also in der Realität schlicht unmöglich, beide Register gleichzeitig zu beschreiben (auch der Compiler müsste zu dem Zwecke zwei Zugriffe draus machen). Ein Bit kann nunmal nicht gleichzeitig gesetzt und nicht gesetzt sein. Du hast das vermutlich im Simulator ausprobiert, und ja: Der Simulator hat an der Stelle einen Bug, der seit langem bekannt und auch in der Hilfe zum Simulator unter "Known Issues" aufgeführt ist. Abgesehen davon ist es schwachsinnig, für so etwas einen fast 4 Jahre alten Thread wieder rauszukramen.
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.