Hallo,
die ISR sieht nun aktuell so aus:
UDR wird schon gelesen, sonst rennt der Interrupt ja immer wieder an.Code:ISR(USART_RXC_vect) { unsigned char buffer; // Daten aus dem Puffer lesen ... buffer = UDR; }
Aber es funktioniert immer noch nicht wirklich. Nur wenn ich die Interrupts ausschalte, kommt der ganze String an, sonst immer nur "Ha".
/Edit.
Jetzt geht es nicht mal mehr, wenn ich die Interrupts ausschalte. Aktueller Code:
Code:#include <uart.h> //#include <avr/interrupt.h> #include <avr/io.h> void set_pll_frequency(unsigned short multiplier) { unsigned short divider = 1024; unsigned char mux = 10; while (divider * multiplier > 2000) { divider >>= 1; mux--; } //divider * multiplier -> Zerlegen in die zwei PCF8574 Bytes für PLL und über I2C wegschicken //mux -> mux ports setzen } int main(void) { uart_init(); //sei(); uart_send_string("Hallo!" "\r\n"); while (1) { } return 0; }Code:#include <avr/io.h> #include <avr/interrupt.h> #define BAUD 19200UL #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1) /************************************************************************* Initialisierung vom UART Interface *************************************************************************/ void uart_init(void) { // Baudrate einstellen (Normaler Modus) UBRRH = (unsigned char) (UBRR_BAUD>>8); UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff); // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) do { // UDR auslesen (Wert wird nicht verwendet) UDR; } while (UCSRA & (1<<RXC)); // Rücksetzen von Receive Complete Flag UCSRA = (1<<RXC); } /************************************************************************* Zeichen senden *************************************************************************/ void uart_send_char(const unsigned char data) { // ... warten bis der Sendepuffer leer ist ... while (!( UCSRA & (1<<UDRE))) ; UDR = data; } /************************************************************************* String senden *************************************************************************/ void uart_send_string(const char *data) { while (*data) { uart_send_char(*data); data++; } } /************************************************************************* UART Empfangs Interrupt ISR *************************************************************************/ ISR(USART_RXC_vect) { unsigned char buffer; // Daten aus dem Puffer lesen ... buffer = UDR; }







Zitieren

Lesezeichen