Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > > Hallo, > nachdem ich Anfang 2009 meine „neue“ CC2 als blutiger Anfänger zum laufen gebracht habe und u.a. > sogar schon ein eigenständiges Programm zur Nutzung der LED´s als Grenzwertanzeige des DS1631 > (Temperaturfühlers) geschrieben habe, bin ich wie so einige in diesem Forum u.a. auf das Problem > Multitasking und Zugriff auf das LCD-Display gestoßen. Nachdem die Euphorie also so langsam > umgeschlagen war habe ich das Teil erstmal gefrustet in einer Ecke verschwinden lassen . > > Nun ist aber wieder ein Sonnenstrahl darauf gefallen. Außerdem will ich das Teil wenigstens in der > Garantiezeit noch zerstören^^. > Da ich niemanden der sich mit Programmierung auskennt kenne, kostet mich dieses neue Hobby > mehr Zeit und nerven als mir lieb ist. Aber ich hab mir da was in den Kopf gesetzt und dauert es > 30 Jahre. (wird’s wohl auch :P) > > Um einen Ansatzpunkt zu haben, dachte ich an ein Menuemodul, welches Auch den Zugriff auf das > LCD verwaltet. Nach langer suche habe ich das menudemo.c2 von Bernd Schmidt (25.10.2002) > (ganz schön alt!) nach 24h zum laufen gebracht, aber nach 4 Tagen noch nicht ganz verstanden. > > Also hier endlich meine Fragen: > > 1.String dpy; wofür ? Wird nirgens verwendet oder? (ohne läuft das Programm beim verlassen des > Menüs in den Autodisplaymodus nicht mehr.) Wieso? > 2.Wofür ist initmenu deklariert? Ist nach einmaligem Menueaufruf =1 und dann? Versteh ich nicht. > 3.Was passiert beim capture flag; genau? Der Stack wird für andere Zugriffe gesperrt. Und mit einem > Wert versehen!? Nur in dem Thread oder im ganzen Modul ? Und welcher Wert von welcher variablen? > Bedienungsanleitung S77 hab ich nicht verstanden. > 4.Gerne würde ich an der Stelle irgendeine Taste drücken (stkey.getkey(255)) > "O=weiter >=enter" im Display ausgeben, da das Autodisplay nur einfriert wenn man nicht gerade > O gedrückt hat. > 5.Wenn man O drückt, springt das Display beim ersten mal wieder in den Autodisplaymodus. Auch > das würde ich gerne beheben. > 6.würde auch gerne mit C aus jeder Stelle im Thread menu ins Autodisplay gelangen. Bisher ohne > Erfolg.. > else if (key==13) {goto_depth = display_menu (0,MENU_DEPTH00_LEN ); } <?! > > Neben anderen sind das erstmal die wesentlichen Punkte. > > Es wäre furchtbar nett, wenn mir jemand mit Kommentaren im thread menu helfen würde! > > Wo ich erst drüber Nachdenken möchte wenn ich das Programm verstehe ist ob ein Array für die > Funktion (Rückgabe wert goto_depth) der Übersicht halber sinnvoll währe und möglich ist... > Ich weiß auch noch nicht ob das Menü für meine Anwendung geeignet sein wird. Wahr nur ein Versuch > sich mit der Materie wieder auseinander zu setzen. Ich möchte natürlich auch Threads aus dem Menü > starten wollen. Ist mir aber noch nicht einwandfrei gelungen. Wie auch wenn ich das Menü nicht > 100%ig verstehe ; _-( > Vielleicht hat auch jemand ein anderes (kompfortableres) Menü für die Station geschrieben das er mir > zur Verfügung stellen will. > > Da ich schon ein wenig geändert habe, hab ich alles noch einmal kopiert. > Ja, zum x ten mal in diesem Forum. Verzeiht mir! > > > /* > > menudemo.c2 > > BESCHREIBUNG > Menusteuerung fuer externes 2-Zeilen Display mit 3 Threads. > > Zur Laufzeit wird ein automatisches Display ausgegeben. > > Wird die (0) Taste gedrueckt, so wird das Autodisplay gestoppt und man kommt in > einen Menumodus. Man kann beliebig viele Untermenus (z.B. ueber Konstanten er- > zeugen. > > Durch Druecken der (0) Taste kann man ein Menu durchblaettern (einfach ver- > zeigert). > Durch Druecken der ('->) Taste erreicht man (falls definiert) das Untermenu des > Menupunktes, in dem man sich befindet. > Durch Druecken der ('->) Taste im letzten Menupunkt eines Menus kommt man wieder > in das darueberliegende Menu. > Durch Druecken der ('->) Taste im letzten Menupunkt des Menus 0 faengt der > Thread Autodisplay wieder an zu laufen ... > > //goto_depth999 = reset and start Autodisplay > > AUTOR der URSPRUNGSDATEI > Bernd Schmidt (25.10.2002) > > *******************************************************************************/ > > > byte flag; // Semaphore: Gueltig fuer alle Prozesse > > const MENU_DEPTH00_LEN = 7; // Anzahl der Menue 0 punkte -letzter =zurück oder verlassen > const MENU_DEPTH01_LEN = 3; > const MENU_DEPTH02_LEN = 3; > const MENU_DEPTH03_LEN = 3; > > const SPACE5=" "; > const Menu="Menu "; > const Punkt="Punkt "; > int pos; // Globale Variable fuer Menuposition !!! > int initmenu; // Wird 1, wenn Menu durch Benutzer aktiviert > int dpyam; // Semaphore: Autodisplay wird dargestellt ? > string s; > > function display_menu (int depth, byte resetpos) returns int // besser mit Array lösen? > { > int goto_depth; > dpyam = 0; > if (resetpos!=0) pos = 0; > lcdext.home();//Foth warum home? > if (depth==0) // Menu oben > { > pos=pos+1; if (pos > MENU_DEPTH00_LEN) pos = 1; > if (pos==1) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "1" + SPACE5; > lcdext.print(s); goto_depth = 1; } > else if (pos==2) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "2" + SPACE5; > lcdext.print(s); goto_depth = 2; } > else if (pos==3) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "3" + SPACE5; > lcdext.print(s); goto_depth = 3; } > else if (pos==4) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "4" + SPACE5; > lcdext.print(s); goto_depth = 4; } > else if (pos==5) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "5" + SPACE5; > lcdext.print(s); goto_depth = 5; } > else if (pos==6) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "6" + SPACE5; > lcdext.print(s); goto_depth = 6; } > else if (pos==7) > { s=SPACE5 + Menu + "0" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=" verlassen "; > lcdext.print(s); goto_depth = 999; } > sleep 120; > } > else if (depth==1) // Menu 0 / Punkt 1 (0 druecken)-> Menu 1 / Punkt 1 > { pos=pos+1; > if (pos > MENU_DEPTH01_LEN) {pos = 1;} > if (pos==1) > { s=SPACE5 + Menu + "1" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "1" + SPACE5; > lcdext.print(s); goto_depth = 11; } > else if (pos==2) > { s=SPACE5 + Menu + "1" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "2" + SPACE5; > lcdext.print(s); goto_depth = 12; } > else if (pos==3) > { s=SPACE5 + Menu + "1" + SPACE5; > lcdext.print(s); lcdext.line(2); > s=" zurueck "; > lcdext.print(s); goto_depth = 0; } > sleep 120; > } > else if (depth==2) {} > else if (depth==3) {} // ... > > return goto_depth; > } > > > > > > thread autodisplay //nach belieben ändern > { > lcdext.clear(); > s=" Autodisplay "; //ändern zB.: Menü? Drücke c! > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "1" + SPACE5; //"" > lcdext.print(s); > sleep 2500; > lcdext.clear(); > s=" Autodisplay "; //ändern zB.: Funktionen der F Tasten (evtl Notaus verhalten bei Störungen > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "2" + SPACE5; //"" > lcdext.print(s); > sleep 2500; > lcdext.clear(); > s=" Autodisplay "; //ändern zB.: Störungsanzeige oder Betriebszustände > lcdext.print(s); lcdext.line(2); > s=SPACE5 + Punkt + "3" + SPACE5; //"" > lcdext.print(s); > sleep 2500; > > // ... erweiterbar für weitere Laufanzeige > } > > thread menu > { > string dpy; //wofür? dpy kommt nicht vor. ohne: Autodisplay Punkt 1 anzeige Absturz > int key; > int depth; > int goto_depth; > key = stkeyb.get(); > if (key != 255) // Taste wurde gedrueckt > {plm.beep(plm.TONE_E1);sleep 10; //Tastenton test > plm.beep(plm.TONE_OFF); //Tastentontest ende > dpyam = 0; > halt autodisplay; > capture flag; /*wertzuweisung flag 1...255 wenn > flag =0, blockiert fremde zugriffe(S.77) /Notaus > jetzt noch möglich?*/ > if (key==0) // [0] : Menu blaettern > { > goto_depth = display_menu(depth, 0); > } > else if (key==14) // ändern:(Entprellzeiten? gegen fehleingabe!) ['->] : Menu Enter > { > depth = goto_depth; > > if (depth==999) > { > dpyam = 1; > sleep 200; lcdext.clear(); > pos = 0; depth = 0; > reset autodisplay; > resume autodisplay; > reset; > yield; > } > else if (initmenu==0) > { > goto_depth = display_menu(depth, 0); > initmenu = 1; > } > else goto_depth = display_menu(depth, 1); > } > release; //blockade flag wird aufgehoben > } > } > > > > thread main > > { > stports.init(); > lcdext.init(); > lcdext.clear(); > sleep(2000); > s=" Menudemo 1.0 "; //ändern in zB"Herzlich" > lcdext.print(s); > lcdext.line(2); > s="0=weiter >=enter"; //ändern in zB "Wilkommen" > lcdext.print(s); > sleep 2000; > dpyam = 1; > > loop > { > if (dpyam==1) { run autodisplay; } > run menu; > } > }