PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche dringend hilfe!TV remote mit linienverfolgung einprogrammieren



Bitanem14
19.05.2011, 08:34
hallo,
ich weiß das ist ein altes Thema aber irgendwie wude dies nie richtig abgearbeitet.
Habe folgendes Problem wie kann ich zum beispiel ein Modus in den RC5 Händler einfügen das er einmal per Fernbedienung ansteuerbar ist und einmal die linie verfolgt?
Hat jemand schon sowas realiesiert bin ziemlich neu in der Materie?
Wäre super nett wenn einer wenigstens nur den ansatz püosten könnte.

fabqu
19.05.2011, 17:21
Hi Bitanem,
ich kann eigentlich nur folgendes sagen:
Ich denke mal, Du arbeitest mit dem Beispiel für TV-Remote? Dann hast Du eine relativ lange Switch-Case-Struktur. Wichtig für Dein Problem ist, dass Du ja in jeden Case quasi ein komplettes Programm reinlegen könntest.
Denkbar wäre etwas wie:

case (TasteFürLinienVerfolgung)
{
while (AbbruchbedingungFürDeinLinienverfolgungsProgramm - "Das heißt, die While-Schleife geht so lange, bis z.B. die 'Stop'-Taste gedrückt wurde")
{
"Hier kommt das gesamte Programm für Deine Linienverfolgung rein. Also Deine beiden ADCs auslesen, und je nach dem links, rechts, geradeaus"
"Wichtig ist, dass dein Controller aber dann bis zur Abbruchbedingung in dieser Schleife hängt. Alles, was der Bot sonst noch tun soll (Abstände messen, etc) muss also auch hier rein!"
"z.B. taskRP6System usw."
}
}

Ich hoffe ich konnte Dir helfen, weiter als bis hier hin bin ich nie gekommen.
Aber hier gibts ne menge anderer schlauer Köpfe ;)

Lg!

RolfD
19.05.2011, 17:25
Was für Hilfe erwartest du denn jetzt? Das dir jemand das Programm schreibt? Ich fürchte das kannst Du vergessen. Wir haben alles selbst genug zu tun. Aber Du kanst dich dran setzen und wirst sicherlich hier Hilfe bekommen.

fabqus Ansatz oben folgt nur der Linie wärend ein "Linienfolgetastenbefehl" per IR gesendet wird... Besser wäre evtl. das als Ein/Ausschalter vor zu sehen und in Keyauswertung im "idle" Teil der Key Auswertung unter zu bringen - natürlich mit einer Abfrage auf diesen oben geschilderten Ein/Aus Knopf. Überhaupt lässt sich da einiges verändern oder anders Ansetzen - daher empfehle ich dir erst mal ein klassisches Ablaufdiagram zu erstellen.

Damit ergibt sich fast von selbst, was wie umgebaut werden muss. Fang an das IR-Programm auf zumalen... und überleg dir wie ein linienfolger da unter zu bringen wäre.
LG

fabqu
19.05.2011, 18:01
Mensch Rolf, mal ein wenig freundlicher!?
Bitamen ist erstens neu hier und zweitens neu in der Materie, wie er schon geschrieben hat...

Danke Dir!

Vielleicht könntest Du für uns Neulinge das "idling" erklären? Ist ja erst mal nur das Stillegen, oder?

RolfD
19.05.2011, 18:57
Erstens bin ich nicht unfreundlich und zweitens das Idling ist quasi die Stelle im Programm wo die Abfragen auf Tasten erfolgt sind... aber bevor eine neue Runde Keys einlesen/auswerten gestartet wird.

Idle heisst nicht stilllegen sondern ruhen, also da wo man z.B. auch weitere Dinge im Ablauf hinzufügen würde nachdem die zu erledigende Arbeit gemacht ist. Aber dazu muss man sich eben den Ablauf des Programms als System ausarbeiten, daher mein Hinweis, ein Ablaufdiagram zu erstellen.

Und nebenbei... dieses Forum .. viele die hier aktiv schreiben.. mich eingeschlossen ... sind sicher immer gern bereit zu helfen. Dazu gehört aber auch, das man sich als Hilfesuchender klar macht was man eigentlich will.... Probleme nachvollziehbar beschreibt ... usw.
Für eine einfache Beschreibung ist das genannte Problem - nämlich 2 Programme sinnvoll zu vereinigen - zu komplex für ein Forenbeitrag.

Wenn ich unfreundlich rüber kommen sollte, bitte ich um Verzeihung. Ich sehe allerdings kein Grund dafür.

Bitanem14
19.05.2011, 22:52
Hi RolfD,
habe von keinem hier verlangt das er mir das Programm schreibt zum ersten.
habe fabqu das programm mal geschickt habe soeben wieder was probiert und bin dank Fabqu ein stückchen weitergekommen,
danke nochmal fabqu.
Muss mal jetzt ein bisschen pausieren da ich nächste woche eine Prüfung schreibe.
Werde in den nächsten tagen mal das tv remote soweit ich komme umschreiben wenn ich durchs lernen noch zeit haben werde,mal schauen werde das programm dann mal posten wird
sicherlich ein paar tage dauern.
Werde euch beiden berichten,danke nochmals

RolfD
20.05.2011, 04:48
Wäre super nett wenn einer wenigstens nur den ansatz püosten könnte.

Naja daraus las ich "wenigstens den ansatz - gerne auch das fertige Programm".
Aber ist ja auch so ok.. ihr scheint das unter euch aus zu machen.
Hab ich nix gegen... und wenn das Ergebnis wie gewünscht funktioniert: Bravo.

Bitanem14
20.05.2011, 05:57
Rolfd für jede nützliche hilfe/tipps auch von dir sehr dankbar nicht falsch verstehen,keiner ist als Programmierer auf die Welt gekommen.
Im netz gibt es viele sachen und auch die Examples sind nicht schlecht aber für Anfänger doch eine Nummer zu groß finde ich bis mann sich da durchgekaut hat
dauert es ziemlich lange.
Danke nochmal für alle wie gesagt werde das Programm irgendwann mal posten.

Bitanem14
20.05.2011, 05:59
Rolfd für jede nützliche hilfe/tipps auch von dir sehr dankbar nicht falsch verstehen,keiner ist als Programmierer auf die Welt gekommen.
Im netz gibt es viele sachen und auch die Examples sind nicht schlecht aber für Anfänger doch eine Nummer zu groß finde ich bis mann sich da durchgekaut hat
dauert es ziemlich lange.
Danke nochmal für alle wie gesagt werde das Programm irgendwann mal posten.

Bevor ich es vergesse slyd hat auch so paar nützliche tipps gegeben danke nochmals

Bitanem14
27.05.2011, 06:23
Hi Jungs ich bin es wieder,
wie versprochen habe jetzt nun ein programm geschrieben,
alles funzt,jetzt habe ich das nächste problem das er ins modus2linienverfolgung reinspringt und anfängt zu stottern bis mir der RP6Loader einen fehler raus bringt.
Der fehler heißt Motor current check motioncontrol was kann das sein.
Vermute irgendwas wird zeitgleich aufgerufen aber was?
Hoffe irgenjemand kann mir da helfen


#include "RP6RobotBaseLib.h"

#define RC_PROMO8


#ifdef RC_PROMO8


#define RC5_KEY_vorwaertsm 2
#define RC5_KEY_rueckwaertsm 8
#define RC5_KEY_linksm 4
#define RC5_KEY_rechtsm 6
#define RC5_KEY_Ledanm 32
#define RC5_KEY_Ledausm 33
#define RC5_KEY_modus1fernbedienung 7
#define RC5_KEY_modus2linieverfolgen 9


#endif


uint8_t vorwaertsm;
uint8_t rueckwaertsm;
uint8_t rechtsm;
uint8_t linksm;
uint8_t Ledanm;
uint8_t Ledausm;
uint8_t Resetm;
uint8_t mleftptmp;
uint8_t mrightptmp;
uint8_t power_links;
uint8_t power_rechts;
uint8_t mleft_ptmp;
uint8_t mright_ptmp;

uint8_t modus1fernbedienung;
uint8_t modus2linieverfolgen;



void ruecksetzen(void)
{
if(getStopwatch2() > 200)
{
vorwaertsm=0;
rueckwaertsm=0;
linksm=0;
rechtsm=0;

setStopwatch2(0);
}

}


void receiveRC5Data(RC5data_t rc5data)


{writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');




switch(rc5data.key_code)

{
case RC5_KEY_vorwaertsm:
writeString_P("vorwaertsm: ");
writeIntegerLength(vorwaertsm, DEC, 4);
writeChar('\n');
writeChar('\n');
vorwaertsm=1; //vorwärts fahren
if(vorwaertsm==1&&modus1fernbedienung==1)
{
move(200,FWD,DIST_MM(150),0);
}
break;
case RC5_KEY_rueckwaertsm:
writeString_P("rueckwaertsm: ");
writeIntegerLength(rueckwaertsm, DEC, 4);
writeChar('\n');
writeChar('\n');
rueckwaertsm=1; //rückwärts fahren
if(rueckwaertsm==1&&modus1fernbedienung==1)
{
move(200,BWD,DIST_MM(150),0);
}
break;
case RC5_KEY_rechtsm:
writeString_P("rechtsm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
rechtsm=1; //rechts fahren
if(rechtsm==1&&modus1fernbedienung==1)
{
rotate(50, RIGHT, 55, 0);
}
break;
case RC5_KEY_linksm:
writeString_P("linksm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
linksm=1; //links fahren
if(linksm==1&&modus1fernbedienung==1)
{
rotate(50, LEFT, 55, 0);
}
break;
case RC5_KEY_Ledanm:
writeString_P("Ledanm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
Ledanm=1; // Ledan:
if(Ledanm==1&&modus2linieverfolgen==1)
{
DDRA|=(E_INT1);
PORTA|=E_INT1;
}
break;
case RC5_KEY_Ledausm:
writeString_P("Ledausm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
Ledausm=1;
if(Ledausm==1&&modus2linieverfolgen==1)
{ // Ledaus:
DDRA|=(E_INT1);
PORTA &= ~E_INT1;
}
break;
case RC5_KEY_modus1fernbedienung:
writeString_P("modus1fernbedienung: ");
writeIntegerLength(modus1fernbedienung,DEC, 4);
writeChar('\n');
writeChar('\n'); //Fernbedienung
modus1fernbedienung=1;
modus2linieverfolgen=0;
break;

case RC5_KEY_modus2linieverfolgen:
writeString_P("modus2linieverfolgen: ");
writeIntegerLength(modus2linieverfolgen,DEC, 4);
writeChar('\n');
writeChar('\n'); //Linieverfolgen
modus2linieverfolgen=1;
modus1fernbedienung=0;
break;


}

}





void setMotorPWM(void)

{

if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;

OCR1BL = power_links;
OCR1AL = power_rechts;

if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;

}




void lichtsensoren (void)

{
writeInteger(readADC(ADC_LS_L), 10);
writeString_P(" - ");
writeInteger(readADC(ADC_LS_R), 10);
writeString_P("\n\r");
if (readADC(ADC_LS_L) > readADC(ADC_LS_R))
{
setLEDs(4);
setMotorPower(100,50);
}
else
{
setLEDs(32);
setMotorPower(50,100);
}
mSleep(100);
}











int main(void)
{
initRobotBase();

setLEDs(0b111111);
writeChar('\n');
writeString_P("RP6 controlled by RC5 TV Remote\n");
writeString_P("___________________________\n");
mSleep(500);
setLEDs(0b000000);
powerON();


startStopwatch2();// Stopuhr 2 wird gestartet

// Set the RC5 Receive Handler:
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);


// Main loop
while(true)
{
if(modus2linieverfolgen==1)
{
setMotorPWM();
lichtsensoren();

}

task_RP6System();

// Motion Control tasks etc.
} // "
//Reset();

return 0;
}

SlyD
27.05.2011, 14:06
Bitte im Forum [ code ] tags verwenden.


Da Du direkt die PWM Werte mit deiner eigenen setMotorPWM Funktion änderst (ohne die normale Geschwindigkeitsregelung) darfst Du task_RP6System(); nicht verwenden da darin die MotionControl funktion aufgerufen wird.
Das funktioniert dann natürlich nicht weil zwei verschiedene Funktionen die PWM Werte ändern...

Oh moment ich sehe gerade du verwendest auch zustäzlich noch setMotorPower - die macht das gleiche wie Deine setMotorPWM Funktion hat aber den Vorteil das die PWM Werte sanft geändert werden und nicht abrupt.
Da steht übrigens in der Doku auch dabei das man die nicht verwenden darf wenn die Geschwindigkeitsregelung benutzt wird.

setMotorPWM, setMotorPower und task_MotionControl werden also gleichzeitig verwendet - vertragen sich aber überhaupt nicht untereinander.

In der MotionControl Funktion sind diverse Fehlerabfragen drin und die schalten dann aus gutem Grund vorsichtshalber die Motoren aus.


Gibt es einen bestimmten Grund warum Du nicht die normalen Funktionen zur Geschwindigkeitsregelung aus der RP6Lib verwendest?
Falls nein, dann solltest Du das mal lieber ändern (also die setMotorPWM / Power Aufrufe durch moveAtSpeed(links, rechts) ersetzen - dann MUSS die task_RP6System natürlich da bleiben wo sie ist).


MfG,
SlyD

Bitanem14
27.05.2011, 15:58
Hi slyd danke für die schnelle antwort,
wie meinst du das mit [code] tags?
Der fehler ist mir jetzt aufgefallen nachdem du es sagst ,stimmt in der Doku steht das setMotorPWM und task_Motioncontrol sich nicht vertragen.
Ich habe aus dem grund die setMotorPower verwendet da ich nicht ganz verstanden habe wie die geschwindigkeitsregelierung in der RP6LiB funktionieren.
Werde mich mal heute wieder dran wagen mal sehen was der tag so bringt danke dir slyd denke das ich es jetzt hinkriege wenn nicht,
muss ich dich oder andere noch nerven.:-)
Ich denke habe jetzt schon viel geschafft da ich zur zeit auch noch viele Prüfungen habe wird der Robby ein bisschen vernachlässigt.
Danke dir erst mal werde demnächst wieder berichten vielleicht klappt es heute abend.

SlyD
27.05.2011, 16:21
Kein Problem.


> wie meinst du das mit
tags?

Na um Code

[code]
while(true)
readTheManual();
so darzustellen das die Formatierung erhalten bleibt sonst ist das total unübersichtlich.



das setMotorPWM und task_Motioncontrol sich nicht vertragen.
Ich habe aus dem grund die setMotorPower verwendet
uh nö da haste immer noch was falsch verstanden setMotorPWM ist keine Funktion aus der RP6Lib und kommt dementsprechend auch nicht in der Doku vor. Die hast Du da selbst in Deinen Code eingefügt (wahrscheinlich von radbruch hier aus dem Forum kopiert die hat er aber aus ganz anderen Gründen geschrieben).
setMotorPower macht wie gesagt was ganz ähnliches, nur besser ;)

Du musst aber moveAtSpeed verwenden.

MfG,
SlyD

Bitanem14
27.05.2011, 16:38
ja stimmt ich habe es von radbruch um zu testen als erstes mal und die funktion übersichtlicher ist finde ich.
okey war aber dann doch nicht schlecht es von radbruch zu benutzen.
Mir fehlen halb noch so paar übungen in sachen c werde mich aber dranhalten wenn mann es versteht macht es sogar spaß wenn
der erfolg dann da ist:-) .
Danke dir erstmal bin wieder dran die sachen umzuändern.
werde es mal posten demnächst danke dir vorerst.

Bitanem14
28.05.2011, 20:29
Hier ist der gesamte code scheint noch ein fehler drin zu sein.
#include "RP6RobotBaseLib.h"

#define RC_PROMO8


#ifdef RC_PROMO8


#define RC5_KEY_vorwaertsm 2
#define RC5_KEY_rueckwaertsm 8
#define RC5_KEY_linksm 4
#define RC5_KEY_rechtsm 6
#define RC5_KEY_Ledanm 32
#define RC5_KEY_Ledausm 33
#define RC5_KEY_modus1fernbedienung 7
#define RC5_KEY_modus2linieverfolgen 9


#endif


uint8_t vorwaertsm;
uint8_t rueckwaertsm;
uint8_t rechtsm;
uint8_t linksm;
uint8_t Ledanm;
uint8_t Ledausm;
uint8_t Resetm;
uint8_t mleftptmp;
uint8_t mrightptmp;
uint8_t power_links;
uint8_t power_rechts;
uint8_t mleft_ptmp;
uint8_t mright_ptmp;

uint8_t modus1fernbedienung;
uint8_t modus2linieverfolgen;



void ruecksetzen(void)
{
if(getStopwatch2() > 200)
{
vorwaertsm=0;
rueckwaertsm=0;
linksm=0;
rechtsm=0;

setStopwatch2(0);
}

}


void receiveRC5Data(RC5data_t rc5data)


{writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');




switch(rc5data.key_code)

{
case RC5_KEY_vorwaertsm:
writeString_P("vorwaertsm: ");
writeIntegerLength(vorwaertsm, DEC, 4);
writeChar('\n');
writeChar('\n');
vorwaertsm=1; //vorwärts fahren
if(vorwaertsm==1&&modus1fernbedienung==1)
{
move(200,FWD,DIST_MM(150),0);
}
break;
case RC5_KEY_rueckwaertsm:
writeString_P("rueckwaertsm: ");
writeIntegerLength(rueckwaertsm, DEC, 4);
writeChar('\n');
writeChar('\n');
rueckwaertsm=1; //rückwärts fahren
if(rueckwaertsm==1&&modus1fernbedienung==1)
{
move(200,BWD,DIST_MM(150),0);
}
break;
case RC5_KEY_rechtsm:
writeString_P("rechtsm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
rechtsm=1; //rechts fahren
if(rechtsm==1&&modus1fernbedienung==1)
{
rotate(50, RIGHT, 55, 0);
}
break;
case RC5_KEY_linksm:
writeString_P("linksm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
linksm=1; //links fahren
if(linksm==1&&modus1fernbedienung==1)
{
rotate(50, LEFT, 55, 0);
}
break;
case RC5_KEY_Ledanm:
writeString_P("Ledanm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
Ledanm=1; // Ledan:
if(Ledanm==1&&modus2linieverfolgen==1)
{
DDRA|=(E_INT1);
PORTA|=E_INT1;
}
break;
case RC5_KEY_Ledausm:
writeString_P("Ledausm: ");
writeIntegerLength(linksm, DEC, 4);
writeChar('\n');
writeChar('\n');
Ledausm=1;
if(Ledausm==1&&modus2linieverfolgen==1)
{ // Ledaus:
DDRA|=(E_INT1);
PORTA &= ~E_INT1;
}
break;
case RC5_KEY_modus1fernbedienung:
writeString_P("modus1fernbedienung: ");
writeIntegerLength(modus1fernbedienung,DEC, 4);
writeChar('\n');
writeChar('\n'); //Fernbedienung
modus1fernbedienung=1;
modus2linieverfolgen=0;
break;

case RC5_KEY_modus2linieverfolgen:
writeString_P("modus2linieverfolgen: ");
writeIntegerLength(modus2linieverfolgen,DEC, 4);
writeChar('\n');
writeChar('\n'); //Linieverfolgen
modus2linieverfolgen=1;
modus1fernbedienung=0;
break;


}

}








void lichtsensoren (void)

{
writeInteger(readADC(ADC_LS_L), 10);
writeString_P(" - ");
writeInteger(readADC(ADC_LS_R), 10);
writeString_P("\n\r");
if (readADC(ADC_LS_L) > readADC(ADC_LS_R))
{
setLEDs(4);
moveAtSpeed(100,50);
}
else
{
setLEDs(32);
moveAtSpeed(50,100);
}
mSleep(0);
}











int main(void)
{
initRobotBase();

setLEDs(0b111111);
writeChar('\n');
writeString_P("RP6 controlled by RC5 TV Remote\n");
writeString_P("___________________________\n");
mSleep(500);
setLEDs(0b000000);
powerON();


startStopwatch2();// Stopuhr 2 wird gestartet

// Set the RC5 Receive Handler:
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);


// Main loop
while(true)
{
if(modus2linieverfolgen==1)
{

lichtsensoren();

}

task_RP6System();

// Motion Control tasks etc.
} // "
//Reset();

return 0;
}

Bitanem14
30.05.2011, 06:00
Keiner eine Idee es kommt immer nach einer hewissen zeit motor current weis nicht was noch sich stören soll auser moveAtSpeed ist ja nichts mehr drin?
Werde die nächsten tagen mich mal dran verweilen.

SlyD
30.05.2011, 13:21
So hab mir das jetzt mal angeschaut - das Problem ist hier das Du readADC verwendest.
Das funkt in das task System rein, da das dort schon anders für alle ADC Kanäle erledigt wird.
Du musst readADC gar nicht verwenden Du kannst stattdessen direkt Variablen abfragen in die die ADC Werte sowieso schon periodisch eingelesen werden.
Der Overcurrent Fehler kommt da genau deswegen weil die Fehlerüberwachung da dann falsche ADC Werte bekommt.

Hier ein Minimalbeispiel:



#include "RP6RobotBaseLib.h"

void lichtsensoren (void)
{
if(getStopwatch2() > 100)
{
writeInteger(adcLSL, DEC);
writeString_P(" - ");
writeInteger(adcLSR, DEC);
writeString_P("\n");

if (adcLSL > adcLSR)
{
setLEDs(4);
moveAtSpeed(100,50);
}
else
{
setLEDs(32);
moveAtSpeed(50,100);
}
setStopwatch2(0);
}
}

int main(void)
{
initRobotBase();

setLEDs(0b111111);

writeString_P("Test\n");
mSleep(500);
setLEDs(0b000000);
powerON();

startStopwatch2();

while(true)
{
lichtsensoren();
task_RP6System();
}
return 0;
}

Das ist übrigens auch ein guter Tipp für alles andere - immer ein sehr kleines Programm schreiben in dem genau die Sache getestet wird die im größeren Programm nicht funktioniert.

MfG,
SlyD

PS:
Wenn Du das jetzt noch mit kontinuierlichem Übergang und Anzeige hinbekommen willst, schau Dir das RP6Base_LightDetection Beispiel an.

Bitanem14
31.05.2011, 08:57
Danke dir slyd werde es heute abend gleich mal testen,deine Anweisung ist mir jetzt verständlich mein problem ist das ich
ins kalte wasser gefallen bin sprichwörtlich.
Du bist ziemlich fit in der Sache wenn ich dein Roboter da sehe da fällt mir kein wort mehr ein.:-)
task_RP6System ruft halt diverse funktionen auf.
Danke nochmals Slyd

Fabian E.
01.06.2011, 19:28
Ich sags mal so.... SlyD hat den RP6 entwickelt ;)
Wenn sich hier einer damit auskennt, dann er :)

Bitanem14
02.06.2011, 15:51
Hast du recht wäre auch so fit wie er aber dem Bäcker wie ich kann mann das halb sehr schwer erklären.
Hat jemand eine Ahnung wie groß die LDR'S beim RP6 sind?
bei mir ist der eine naya er hängt so am seidenen faden.
Noch was linienverfolgung funkt leider wie gesagt hat sich ein beinchen vom ausrichten verabschiedet muss mal morgen zum Conrad.
Danke nochmal SlyD