Hi!

Da unser Robo z.Zt. zwangs-inaktiv ist, habe ich mir ein wenig Eure tollen und sehr gut
dokumentierten *.h's und *.c's angeschaut; ich kann dabei noch sehr viel in Sachen C,
Asm und AVR lernen!!!

Dabei ist mir das eine oder andere aufgefallen. (Bitte nicht als Kritik verstehen, denn
das soll und will ein Newby wie ich (leider noch bin! gar nicht!

Bei der IR-Übertragung ist mir aufgefallen, dass der Sender und auch der Empfänger zwar
immer wieder eingeschaltet wird, jedoch NIE aus! (in print.c und uart.c)

Anpassungsvorschlag: UCSRB = 0x00; // Sender und Empfaenger ausschalten

Beim Senden vom Asuro aus gibt es ähnliche Programme:
void SerWrite (unsigned char *data, unsigned char length)
void UartPutc (unsigned char zeichen) mit void SerPrint (unsigned char *data)

Man könnte mit den "Sahnehäubchen" aus beiden ein Programm basteln:
z.Bsp.
aus*********

void UartPutc (unsigned char zeichen)
{
UCSRB = 0x08; // enable transmitter
UCSRA |= 0x40; // clear transmitter flag
while (!(UCSRA & 0x20)) // wait for empty transmit buffer
;
UDR = zeichen;
while (!(UCSRA & 0x40)) // Wait for transmit complete flag (TXC)
;
}

mit+++++++++

void SerPrint (unsigned char *data)
{
unsigned char i = 0;

while (data [i] != 0x00)
UartPutc (data [i++]);
}

und-------------

void SerWrite (unsigned char *data, unsigned char length)
{
unsigned char i = 0;

UCSRB = 0x08; // Sender einschalten
while (length > 0) // so lange noch Daten da sind
{
if (UCSRA & 0x20)
{ // warten, bis der Sendebuffer leer ist
UDR = data[i++];
length --;
}
}
while (!(UCSRA & 0x40)) // abwarten, bis das letzte Zeichen
; // uebertragen wurde.

for (i = 0; i < 0xFE; i++) // warten auf irgendwas; keiner weiss
for (length = 0; length < 0xFE; length++); // wofuer =>> na, dann weglassen!)
}

Prog_neu------------

void SerWrite_SerPrint_NEU (unsigned char *data, unsigned char length)
{
unsigned char i = 0;

UCSRB = 0x08; // Sender einschalten
// enable transmitter
UCSRA |= 0x40; // 'clear' transmitter flag
// TXC-flag setzen
// (TXC = transmit complete flag)

while (length && data[i]) // so lange noch Daten da sind *)
{
if (UCSRA & 0x20) // wait for empty transmit buffer
{ // warten, bis der Sendebuffer leer ist
UDR = data[i++];
length --;
}
}
while (!(UCSRA & 0x40)) // abwarten, bis das letzte Zeichen
; // uebertragen wurde.
// Wait for transmit complete flag (TXC)

UCSRB = 0x00; // Sender ausschalten
// disable transmitter
}

------------
*) 2 Fliegen mit einer Klappe schlagen!)

SerWrite_SerPrint_NEU () funktioniert (besser: SOLLTE!
- mit Null-terminierten String data[] und/oder
- mit einer Längenangabe (auch ohne 'End-Null'):
Im ersten Fall muss man (leider als Schönheitsfehler!) als Länge einfach "0xff"
oder eine Zahl angeben, die größer/gleich der tatsächlichen Länge ist,
im zweiten die korrekte Länge des Strings!

Zum Prg.-Namen machen wir einen Wettbewerb!
Prog. leider noch nicht getestet!

********************

Beim Prog. IR-Empfangen versuche ich demnächst 'mal, die Fehlererkennung mit einzubauen.

Bis bald und
cu Helmut