Hallo zusammen,

bin seit einer Woche stolzer Besitzer eines RP6 mit Erweiterungsplatine.
Mit Elektronik hab ich schon etwas Erfahrung aus dem Modellbaubereich und vom PC-Basteln.

Probleme bereitet mir momentan eher die Programmierung, da ich (außer Quellcodes auf nem CPD 6128 mit Basic 1.1 von 1985 eintippen) noch keine Erfahrungen habe.

Jetzt mal endlich zu meinem Problem:

Basis ist das Move2-Programm für die Erweiterungsplatine.
Ich habe an dessen I/O´s 4 LED´s angeschlossen, die ich während des gesamten Programmablaufs innerhalb eines bestimmten Taktes blinken lassen will. Weiterhin habe ich einen Servo an Interupt 2 angelötet, den ich später einmal ansteuern will. Auf dem Servo sitzt ein Suchscheinwerfer, der über einen BC517 auf I/O 3 läuft. Dieser Scheinwerfer schaltet sich ab eine bestimmten Wert ein, der vorab über die LDR´s der Basis ermittelt werden.

Rein technisch funktioniert die Sache wunderbar. Auch der Programmablauf selbst funktioniert einwandfrei, aber zu langsam.

Der Ablauf der LED´s und die Abfrage der LDR´s nehmen soviel Zeit in Anspruch, dass für die Hauptprogrammfunktionen keine Zeit mehr bleibt. Dementsprechend erkennt der RP6 ein Hinterniss, fährt dann ein ganzes Stück weiter (gegen das Hinternis) und fängt dann mit dem Ausweichmanöver an).

Da der Atmel ja nicht wirklich Multitaskingfähig ist, muss ich das irgendwie anders lösen. Ich nehme an, dass es zuviel Zeit benötigt, die Ports für die LED´s einzeln zu schalten, mir fällt aber keine bessere Möglichkeit ein, ohne in die Library des Controll-Boards einzugreifen. Das wollte ich erst dann, wenn ich mich mit dem Spaß ein bischen besser auskenne. Hat jemand einen Rat, wie man das eleganter lösen kann?

Hier mal der Code (nur die Änderungen an der Move2, sonst wirds zu viel)

Bitte nicht lachen, wenn das völlig Banane ist, ich hab wirklich null Ahnung von C und kämpf mich grad durch ein Buch, was für die Atmel´s wohl nicht wirklich taugt...

Gruß

Markus

Code:
void eigenefunktion(void) /*schaltet die LEDs/*
{


PORTC |= IO_PC7;  
mSleep(80);
PORTC &= ~IO_PC7;
mSleep(80);
PORTC |= IO_PC7;  
mSleep(80);
PORTC &= ~IO_PC7;
mSleep(100);

PORTC |= IO_PC5;  
mSleep(80);
PORTC &= ~IO_PC5;
mSleep(80);
PORTC |= IO_PC5;  
mSleep(80);
PORTC &= ~IO_PC5;
mSleep(100);

PORTC |= IO_PC6;  
mSleep(80);
PORTC &= ~IO_PC6;
mSleep(80);
PORTC |= IO_PC6;  
mSleep(80);
PORTC &= ~IO_PC6;
mSleep(100);

PORTC |= IO_PC4;  
mSleep(80);
PORTC &= ~IO_PC4;
mSleep(80);
PORTC |= IO_PC4;  
mSleep(80);
PORTC &= ~IO_PC4;
mSleep(100);



}

void task_LDRinfo(void) /*liest die LDRs aus und schaltet Port3 mit Scheinwerfer/*

{

		writeString_P("LDR_L: ");
		writeIntegerLength(adcLSL, DEC, 4);
		writeString_P(" ; LDR_R: ");
		writeIntegerLength(adcLSR, DEC, 4);
		writeString_P(" ||");
		if(adcLSL <400) 
		PORTC |= IO_PC3;
		if(adcLSL >450)
		PORTC &= ~IO_PC3;

}

/*****************************************************************************/
// Main function - The program starts here:

int main(void)
{
	initRP6Control();  
	initLCD();
	
DDRC |= IO_PC7;
DDRC |= IO_PC6;
DDRC |= IO_PC5;
DDRC |= IO_PC4;
DDRC |= IO_PC3;
PORTC &= ~IO_PC3;