Hallöchen, ich habe da ein Problem. Ich hab mal wieder die AVRs ausgegraben und wollt ein paar alte projekte weitermachen. Nun habe ich ein problem, das ich früher nie hatte... der UART will nicht. Ich hab mal meinen Code hier. es geht um einen ATmega32. Wenn ich mir im Osci das Ausgabesignal am TX anschaue, dann sehe ich das der 50ms Delay prima funktioniert und auch passt - sind 50ms. Dagegen sind die einzelnen Bits 7ms lang! Was erheblich zu viel ist. (bei korrekten 19200baud sollte ich die auf meinem alten röhren teil garnicht richtig auflösen können) [c] int main (void) { // uart_init(19200,8,2); uint16_t baudVal = 25; //(F_CPU / (baud * 16UL) - 1); UBRRH = (unsigned char)(baudVal >> 8); UBRRL = (unsigned char) baudVal; UCSRB = (1<<RXEN) | (1<<TXEN); UCSRC = (1<<USBS) | (3<<UCSZ0); while(1) { // uart_putc(0b10101010); while(!(UCSRA & (1<<UDRE))); // Warte, bis Transmitter bereit. UDR = 0b10101010; _delay_ms(50); } } [c/] Hat jemand ne Idee? meine Fuse sind 0xD4 und 0xE4 (laut AtmelStudio) also sollte 8MHz sein Könnte es am AtmelStudio liegen? - früher hab ich mim AVRdude gearbeitet und da tat alles... Ich danke für eure Mühen!
Matze schrieb: > Könnte es am AtmelStudio liegen? > früher hab ich mim AVRdude gearbeitet Das ist eine Nebelkerze. Matze schrieb: > 19200baud 8MHz http://www.gjlay.de/helferlein/avr-uart-rechner.html
Datenblatt, Zugriff auf UCSRC: When doing a write access of this I/O location, the high bit of the value written, the USART Register Select (URSEL) bit, controls which one of the two registers that will be written. If URSEL is zero during a write operation, the UBRRH value will be updated. If URSEL is one, the UCSRC setting will be updated.
> (bei korrekten 19200baud sollte ich die auf meinem alten > röhren teil garnicht richtig auflösen können) Kann das sein, 52 us? Merkwürdiges Oszilloskop. Im Programm sehe ich keinen Fehler; wurde das wirklich für den ATmega32 übersetzt?
Georg G. schrieb: > Datenblatt, Zugriff auf UCSRC: > When doing a write access of this I/O location, the high bit of the > value written, the USART Register > Select (URSEL) bit, controls which one of the two registers that will be > written. If URSEL is > zero during a write operation, the UBRRH value will be updated. If URSEL > is one, the UCSRC > setting will be updated. Da bin ich auch für!
Oh in der Tat da fehlt das URSEL. Seltsam.... der code ist ~5Jahre alt und hat nie probleme gemacht... keine ahnung wo das hin ist. Vielen Dank für den Hinweiß!
> ... und hat nie probleme gemacht... Auf einem ATmega32? Kann eigentlich nicht sein! Es passt übrigens: UBRRL wird auf 25 gesetzt, UBRRH (fälschlicherweise per UCSRC) auf 0x0E, ergibt bei 8.00 MHz 138.5 Bd und folglich mit 7.22 ms recht gut > die einzelnen Bits 7ms lang
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.