Hallo
Gleich vorweg: Ich kann's auch nicht erklären. Weil ich aber nun schon Zeit investiert habe, möchte ich meine Erkenntnisse wenigstens auch mitteilen.
Mein erster Verdacht: Ein Dual-USART mit dem die Peter Fleury-Lib nicht zurecht kommt. Da ich aber nur ein Mega64er-Datenblatt auf der Platte hatte, wollte ich zuerst einen Blick in das 644er-Datenblatt werfen. Zweiter Verdacht: Zugriff auf die falschen Register. Aber die Definitionen in uart.c scheint unverdächtig, weil eben vorhanden und auf den ersten Blick auch richtig:
(Aus uart.c)Code:#elif defined(__AVR_ATmega644__) /* ATmega with one USART */ #define ATMEGA_USART0 #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA #define UART0_STATUS UCSR0A #define UART0_CONTROL UCSR0B #define UART0_DATA UDR0 #define UART0_UDRIE UDRIE0 #elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__) /* ATmega with two USART */ #define ATMEGA_USART0 #define ATMEGA_USART1 #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA #define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA #define UART0_STATUS UCSR0A #define UART0_CONTROL UCSR0B #define UART0_DATA UDR0 #define UART0_UDRIE UDRIE0 #define UART1_STATUS UCSR1A #define UART1_CONTROL UCSR1B #define UART1_DATA UDR1 #define UART1_UDRIE UDRIE1
Was mir noch auffällt: Meine Datei uart.c stammt vom 29.11.2009 und ist die neuste Datei im Archiv. Die 644er-Definitionen sind die Letzten in der Datei und möglicherweise in deiner "schon immer verwendeten" Version nicht vorhanden/fehlerhaft.
Welcher 664er ist es denn?
http://www.atmel.com/dyn/products/de...ource=left_nav
Gruß
mic
P.S.:
Die Sende-ISR könnte auch ein Kandidat sein.
Noch ein Edit:
"Die bytes 0-255 kommen sauber an (bei 57600baud), das 'a' auch, das "test" nicht." ist doch klar. Das Senden geschieht asyncron über einen Ringpuffer und der Sende-ISR. Beim "T" von "Test" ist Schluß mit lustig:
Ich bin mir nicht sicher, würde aber eher ein ; nach while machen. Bauchgefühlsmäßig.Code:uart_puts_p("test"); while (1) {} }
Lesezeichen