Hallo,
die ISR sieht nun aktuell so aus:
Code:
ISR(USART_RXC_vect)
{
unsigned char buffer;
// Daten aus dem Puffer lesen ...
buffer = UDR;
}
UDR wird schon gelesen, sonst rennt der Interrupt ja immer wieder an.
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;
}
Lesezeichen