Danke für dein Beitrag!
Allerdings habe ich dass was du meintest nicht ganz verstanden...
meinst du ich tue den Kontroller irgend wo resetten?
Dass würde natürlich alles erklären. Allerdings habe ich die Stelle nicht gefunden und arbeite mich grad in Interrupts ein...
Wenn ein Reset stattfindet muss es nach dem ich das Zeichen gesendet habe geschehen, sonnst würde ich ja nichts bekommen wenn ich im uart_init reset machen würde....
Wie du siehst bin ich etwas verwirrt
kannst du mir bitte dies bzgl. den Ort und den Grund für mein Fehler äußern...
Uart_init:
Code:
void uart_init()
{
uint8_t sreg = SREG;
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
cli(); /* Interrupts kurz deaktivieren */
UCSRB |= (1<<TXCIE) | (1<<TXEN); /* TXCompleteInterrupt u. TX einschalten */
UCSRC |= (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0); /* Asynchron 8N1 */
/* 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 und Transmit Complete-Flags */
UCSRA = (1 << RXC) | (1 << TXC);
/* Global Interrupt-Flag wieder herstellen */
SREG = sreg;
/* FIFOs für Ein- und Ausgabe initialisieren */
fifo_init (&in_fifo, in_buffer, BUF_SIZE_IN);
fifo_init (&out_fifo, out_buffer, BUF_SIZE_OUT);
}
und
Code:
/*********************** INTERRUPTS ****************************************/
// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort
SIGNAL (SIG_UART_RECV)
{
_inline_fifo_put (&in_fifo, UDR);
}
// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben
// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert
// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ.
SIGNAL (SIG_UART_DATA)
{
if (out_fifo.count > 0)
UDR = _inline_fifo_get (&out_fifo);
else
UCSRB &= ~(1 << UDRIE);
}
Lesezeichen