Ich versuch das mal mit einem Codeschnipsel für Codevision AVR.
Wie das dann bei AVR GCC auszusehen hat musst Du selber testen.
Code:
//Paremeter definitionen
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
//USART Puffer einrichten = Maximale Zeichenanzahl
// USART Transmitter buffer
#define TX_BUFFER_SIZE 64
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
//Sende Interrupt Routine
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
//Neudefinition des putchar Befehles
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
...
//Initialisierung des USART
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 38400
UCSRA=0x00;
UCSRB=0x48;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
...
//Ausgabe des Strings uc_textbuffer mittels eines Schleifenbefehls
//Die Zeichen werden im Puffer abgelegt und durch die Interruptroutine
//selbstständig versendet
for(uc_i=0;uc_i<strlen(uc_textbuffer);uc_i++)
{
putchar(uc_textbuffer[uc_i]);
}
putchar('\r');
putchar('\n');
Bis auf die Stringausgabe wurde das Programm durch den Compiler erzeugt.
Der USART Sendepuffer geht natürlich auf Kosten des RAM Speichers, da der Bereich ja ständig freigehalten werden muß.
Man sollte ihn also nur so groß wählen wie man ihn zur Ausgabe der gewünschten Zeichen wirklich braucht.
Lesezeichen