Hallo,
kann mir jemand helfen und sagen weshalb ich so nicht zum gewünschten
erfolg komme.
Der obere teil des Codes wird von CodeVision selbst erzeugt. Sollte
einen Speicher die Daten von der Seriellen Schnittstelle in einen Buffer
schreiben den ich bei Überlauf auslese und auf ein LCD geben will.
#define RXB8 1
#define TXB8 0
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// UART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on UART Receiver buffer overflow
bit rx_buffer_overflow;
// UART Receiver interrupt service routine
#pragma savereg-
interrupt [UART_RXC] void uart_rx_isr(void)
{
char status,data;
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=RX_BUFFER_SIZE;
rx_buffer_overflow=1;
};
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+
#ifndef DEBUG_TERMINAL_IO
// Get a character from the UART Receiver buffer
#define ALTERNATE_GETCHAR
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
while (1)
{
char seriell[11];
char i=11;
if (rx_buffer_overflow==1)
{
seriell[8] = getchar();
i=25;
}
lcd_puts(lcd_buffer);
sprintf(lcd_buffer,"alles IO ?%2d%8s",i,seriell);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(1000);
};
Ist etwas viel Code aber da ich keine ahnung habe wo der fehler liegt,
habe ich sicherheitshalber mehr als nötig genommen.
Vielen Dank für eure Hilfe
Rolf
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.