So, habe arg rumprobiert.
Heraus gekommen ist ein Teilerfolg.
Die 1.Eingabe bis '#' wird korrekt ausgegeben.
Code:
// includes
//-----------------------------------------------------
//-----------------------------------------------------
#include <avr/io.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
// Variable
//-----------------------------------------------------
//-----------------------------------------------------
char data[20]; // für alle Fälle ausreichend groß
char c;
int a=0, s=0, i;
// Prototypen
//-----------------------------------------------------
//-----------------------------------------------------
void usart_init(void);
void string_senden(char *string);
void zeichen_senden(char zeichen);
void USART_interrupt (char temp);
void str_uebergabe (char data[], int a);
// Main
//-----------------------------------------------------
//-----------------------------------------------------
int main(void)
{
usart_init();
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
DDRA |= (1<<2);
while (1)
{
sei();
if (c=='1')
{
c=0;
zeichen_senden(c);
lcd_putc(c);
PORTA |= (1<<2);
}
if(c=='2')
{
c=0;
zeichen_senden(c);
lcd_putc(c);
PORTA &=~ (1<<2);
}
cli();
}
}
//-----------------------------------------------------
//-----------------------------------------------------
ISR(USART_RXC_vect)
{
char temp;
temp = UDR; // speichere UDR-Wert in temp
USART_interrupt(temp);
}
//-----------------------------------------------------
void USART_interrupt (char temp)
{
data[a]+=temp; // hänge neues byte an data an
a++; // erhöhe Index a (Stelle) um 1
if (temp=='#')
{
str_uebergabe(data,a);
}
}
//-----------------------------------------------------
void str_uebergabe (char data[], int a)
{
while(s!=a)
{
zeichen_senden(data[s]);
lcd_putc(data[s]);
s++;
}
for(i=0; i<a; i++)
{
data[i] = '\0';
}
s=0;
a=0;
}
//-----------------------------------------------------
void usart_init(void)
{
UBRRH = 0;
UBRRL = 7;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
//-----------------------------------------------------
//-----------------------------------------------------
void string_senden(char *string)
{
while (*string)
{
while (!(UCSRA & (1<<UDRE)))
{}
UDR = *string++;
}
}
//-----------------------------------------------------
void zeichen_senden(char zeichen)
{
while (!(UCSRA & (1<<UDRE)));
UDR = zeichen;
}
//-----------------------------------------------------
//-----------------------------------------------------
(Wenn man den Code kopiert, wird dieser korrekt und nicht verschoben dargestellt).
Müsste die Zeichenkette "data" nicht wieder überschrieben werden, wenn der Index "a" genullt wird?
Mit dieser Schleife wird die Zeichenkette geleert.
Code:
for(i=0; i<a; i++)
{
data[i] = '\0';
}
Warum wird die Zeichenkette nicht überschrieben und gibt es bessere Lösungen (auch für das Leeren von Zeichenketten)?
Das LCD ist nun wesentlich schneller, wenn man die R/W Leitung benutzt und nicht nur kurz wartet
.
Lesezeichen