Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: switch Abfrage Kategorie: Programmierung C (von Josef - 1.11.2015 12:27)
Als Antwort auf Re: switch Abfrage von Josef - 1.11.2015 12:13
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, eigenes Board
Habe noch einen Test gemacht,
es sieht so aus als ob der Prozessor sich aufhängt, jedoch keine Zeitüberschreitung bringt, wenn
zu viele Befehlszeilen in der switch Abfrage vorhanden sind.
> Hallo UlliS,
>
> habe mich betreffend des vorher beschriebenen Programmierfehlers getäuscht.
> Programmcode dürfte passen. Es traten dann mehere nicht mehr definierbare Fehler auf.
> Habe nochmals zurückgestellt und versucht den Fehler einzugrenzen. Das Programm hängt sich
> bei der switch Abfrage switch (m_page) auf, obwohl kein case
> (m_page=0, 0 wird nicht abgefragt) zutreffend ist.
>
> Anbei sende ich die ZIP Datei mit dem Unterprg, das vom Initialisierungprg aufgerufen wird.
> Wenn ich zwei case Abfrage in ein U-Prg auslagere funkt das Ganze.
>
> Das ist die C-Controlausgabe zu dem beigefügten U-Prg.
>                                                                                                                  
>
> Interpreter gestartet - 4kb RAM                                                                                        
> sw0 m_page 0 page 1    
>
> Sehe ich bei der switch Abfrage irgenetwas nicht?
>
> > Hallo UlliS,
> >
> > danke für deine Unterstützung,
> >
> > habe den Fehler mit systematischen Ausgaben gefunden (Initialisierung des Displays war ein Bug).
> > Es hat zwar alles auf switch Funktion (durch Auslagerung in U-Prg) gezeigt, Bug behoben und es
> > funkt.
> > Kann bestätigen, switch Funktion hat keine Begrenzung.
> >
> > > ich sende dir für den Test noch das komplette Prg
> > >
> > > > Anbei sende ich dir die screenshots.
> > > > Beim screenshot 1 mit aktivierten U Prg funktioniert das Prog. Jetzt wird die Endlosschleife
> > > > nicht mehr unterbrochen, wenn das Prg so wie im screenshot 2 compiliert wird. Jedoch habe ich
> > > > am Display keine Anzeige mehr.
> > > >
> > > >
> > > > > Also eigentlich gibt's keine Beschränkung bei Switch.
> > > > > Wenn Du mal das Prog. soweit abspeckst und als Demo hier als Dateianhang anfügen würdest ging es
> > > > > schneller mit Debuggen :-)
> > > > >
> > > > > Evtl. auch einen Screenshot deiner Fehlermeldung.
> > > > >
> > > > >
> > > > > > > > Hallo zusammen,
> > > > > > > >
> > > > > > > > habe eine sehr lange switch Abfrage. Caseabfragen sinds ca. 30.
> > > > > > > > Gibt es hier eine Begrenzung der Befehlszeilen?
> > > > > > > > Das Problem tritt auf, wenn ich in einer caseabfrage mehr
> > > > > > > > als 16 Befehlszeilen habe. Beim compilieren wird keine Fehlermeldung angezeigt.
> > > > > > > > Der Start wird trotz Endlosschleife jedoch nach 250ms unterbrochen.
> > > > > > > > Habe die Befehlszeilen in ein U-Prg ausgelagert, dann funktionierts.
> > > > > > > >
> > > > > > >
> > > > > > > Kannst du das Bespiel hier mal als Zip anhängen zum testen?
> > > > > > >
> > > > > > Danke für die rasche Antwort.
> > > > > >
> > > > > > Ich hänge mal das U-Prg an in dem es passiert ist. In Zeile 200 und 204 habe ich die Befehlszeilen
> > > > > > und ein weiteres U-Prg auslagern müssen.(Zeile habe ich fett gekennzeichnet)
> > > > > > In diesem U-Prg werden von einem Touchdisplay die vorher definierten Tasten beim Seitenwechsel
> > > > > > gelöscht.
> > > > > >
> > > > > > // -- Bei der Definition neuer Touchpages sind die vorigen Seiten zu löschen ---
> > > > > > void page_change(void)
> > > > > > {
> > > > > >   eDIP_cmd16(0,'R','L',0,51,480,255,d16,d16);       // Bereich löschen
> > > > > >   eDIP_cmd16(0,'R','L',150,254,350,272,d16,d16);    // Bereich löschen
> > > > > >   switch (m_page)             // Vorige Touchbereiche löschen
> > > > > >   {
> > > > > >     case pageError:
> > > > > >     eDIP_cmd4_8('A','L',Error_return,1);
> > > > > >     eDIP_cmd4_8('A','L',Error_reset,1);
> > > > > >     break;
> > > > > >     case page1:
> > > > > >     eDIP_cmd4_8('A','L',menu_down,1);
> > > > > >     eDIP_cmd4_8('A','L',pageWG_MWdown,1);     // Vesteckte Taste für WG Daten
> > > > > >     eDIP_cmd4_8('A','L',page_E_KFZ_down,1);   // Vesteckte Taste für KFZ-Ladedaten
> > > > > >     if (page!=pageE_KFZ)            // sonst wird in KFZ Seite das Menü angezeigt
> > > > > >     {
> > > > > >       if (menu==page3_menu) TOUCHMENU3_DELETE();
> > > > > >       if (menu==page2_menu) TOUCHMENU2_DELETE();
> > > > > >       if (menu==page1_menu) TOUCHMENU1_DELETE();
> > > > > >       Menu_page1();               //Menüanzeige initialisieren
> > > > > >       menu=page1_menu;
> > > > > >       m_menu=menu;
> > > > > >       eDIP_cmd4_8('A','P',pagePVdown,1);      //Schalter PV-Seite stellen
> > > > > >     }
> > > > > >     else eDIP_cmd16(0,'R','L',0,0,480,255,d16,d16);       // gesamten Bereich löschen
> > > > > >     break;
> > > > > >     case pageE_KFZ:
> > > > > >     eDIP_cmd4_8('A','L',E_KFZvoll_down,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',E_KFZ_4h_down,1);
> > > > > >     eDIP_cmd4_8('A','L',E_KFZ_7h_down,1);
> > > > > >     eDIP_cmd4_8('A','L',E_KFZ_Eco_down,1);
> > > > > >     eDIP_cmd4_8('A','L',E_KFZ_Ecoplus_down,1);
> > > > > >     eDIP_cmd4_8('A','L',E_KFZ_AUS_down,1);
> > > > > >     eDIP_cmd4_8('A','L',menu_ret_down,1);
> > > > > >     break;
> > > > > >     case pageWG:
> > > > > >     eDIP_cmd4_8('A','L',BeschOBENdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',BeschUNTENdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FensterZUdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FensterOFFENdown,1);
> > > > > >     eDIP_cmd4_8('A','L',KlappeZUdown,1);
> > > > > >     eDIP_cmd4_8('A','L',KlappeOFFENdown,1);
> > > > > >     eDIP_cmd4_8('A','L',SpeicherAUSdown,1);
> > > > > >     eDIP_cmd4_8('A','L',SpeicherEINdown,1);
> > > > > >     eDIP_cmd4_8('A','L',WGBautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',WGFautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',WGKautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',WGSautodown,1);
> > > > > >     break;
> > > > > >     case pageAlarm:
> > > > > >     eDIP_cmd4_8('A','L',Al_Start_plus,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_Ende_plus,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_Start_minus,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_Ende_minus,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_ein_down,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_ein_down,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_Panik_down,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_Urlaub_down,1);
> > > > > >     eDIP_cmd4_8('A','L',Al_StiegeLicht_down,1);
> > > > > >     break;
> > > > > >     case pageRollDach:
> > > > > >     eDIP_cmd4_8('A','L',RSobendown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RSuntendown,1);
> > > > > >     eDIP_cmd4_8('A','L',RSautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RBobendown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RBuntendown,1);
> > > > > >     eDIP_cmd4_8('A','L',RBautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKobendown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RKuntendown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKautodown,1);
> > > > > >     break;
> > > > > >     case pagePV:
> > > > > >     eDIP_cmd4_8('A','L',WR_LufterON,1);
> > > > > >     eDIP_cmd4_8('A','L',WR_LufterOFF,1);
> > > > > > //    eDIP_cmd4_8('A','L',Speich_pumpON,1);
> > > > > > //    eDIP_cmd4_8('A','L',Speich_pumpOFF,1);
> > > > > > //    eDIP_cmd4_8('A','L',Speich_pumpautodown,1);
> > > > > >     break;
> > > > > >     case pageBewBLicht:
> > > > > >     eDIP_cmd4_8('A','L',BewassrgONdown,1);
> > > > > >     eDIP_cmd4_8('A','L',BewassrgOFFdown,1);
> > > > > >     eDIP_cmd4_8('A','L',Bewassrg_Start1,1);
> > > > > >     eDIP_cmd4_8('A','L',Bewassrg_Lauf1,1);
> > > > > >     eDIP_cmd4_8('A','L',Bewassrg_Start2,1);
> > > > > >     eDIP_cmd4_8('A','L',Bewassrg_Lauf2,1);
> > > > > >     eDIP_cmd4_8('A','L',BLichtONdown,1);
> > > > > >     eDIP_cmd4_8('A','L',BLichtOFFdown,1);
> > > > > >     eDIP_cmd4_8('A','L',BLicht_Start,1);
> > > > > >     eDIP_cmd4_8('A','L',BLicht_Lauf,1);
> > > > > >     break;
> > > > > >     case pageZSaugTeichp:
> > > > > >     eDIP_cmd4_8('A','L',H2O_EnthartgON,1);
> > > > > >     eDIP_cmd4_8('A','L',H2O_EnthartgOFF,1);
> > > > > >     eDIP_cmd4_8('A','L',ZSaugerON,1);
> > > > > >     eDIP_cmd4_8('A','L',ZSaugerOFF,1);
> > > > > >     eDIP_cmd4_8('A','L',ZSauger_Nachl,1);
> > > > > >     eDIP_cmd4_8('A','L',TeichpONdown,1);
> > > > > >     eDIP_cmd4_8('A','L',TeichpOFFdown,1);
> > > > > >     eDIP_cmd4_8('A','L',TeichpTIME1,1);
> > > > > >     eDIP_cmd4_8('A','L',TeichpTIME2,1);
> > > > > >     eDIP_cmd4_8('A','L',TeichpAUTO,1);
> > > > > >     break;
> > > > > >     case pageRollKUCHE:                   // Touchs von Rolladen Küche löschen
> > > > > >     eDIP_cmd4_8('A','L',RKNeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RKNausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKNautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKOeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RKOausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKOautodown,1);
> > > > > >     case pageRollWZ:                   // Touchs von Rolladen Wohnzimmer löschen
> > > > > >     eDIP_cmd4_8('A','L',RWZTeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RWZTausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZTautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZSeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RWZSausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZSautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZWeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RWZWausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZWautodown,1);
> > > > > >     break;
> > > > > >     case pageRollOG:                      // Touchs von Rolladen OG löschen
> > > > > >     eDIP_cmd4_8('A','L',RGOeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RGOausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RGOautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RGTeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RGTausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RGTautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RSTeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RSTausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RSTautodown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKWeinfdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RKWausfdown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKWautodown,1);
> > > > > >     break;
> > > > > >     case pageFS20:                   // Touchs von Rolladen Küche löschen
> > > > > >     FS20_CLEAR();               // U-Prg notwendig, da zu viel Befehlzeilen für switch
> > > > > >     RS232=WR_RS;                        // RS232 auf WR zurückstellen (Mux und Baudrate)
> > > > > >     break;
> > > > > >     case pageHEIZUNG_STAT:                   // Touchs löschen
> > > > > >  HEIZUNG_STAT_CLEAR();       // U-Prg notwendig, da zu viel Befehlzeilen für switch      
> > > > > >     break;
> > > > > >     case pageHEIZUNG_EINSTLLG:                   // Touchs löschen
> > > > > >     eDIP_cmd4_8('A','L',Hzgwahl_down,1);
> > > > > >     eDIP_cmd4_8('A','L',HK_Tempdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FBH_Tempdown,1);
> > > > > >     break;
> > > > > >     case pageHEIZUNG_ZEIT:                   // Touchs von Rolladen Küche löschen
> > > > > >     eDIP_cmd4_8('A','L',GasZeitdown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',PufferZeitdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FBH_Zeitdown,1);
> > > > > >     break;
> > > > > >     case pageHEIZUNG_ENERGIE:
> > > > > >     eDIP_cmd4_8('A','L',StartEnergie,1);
> > > > > >     eDIP_cmd4_8('A','L',StopEnergie,1);
> > > > > >     break;
> > > > > >   }
> > > > > >   if (menu!=m_menu)
> > > > > >   {
> > > > > >     switch (m_menu)             // Vorige Touchbereiche löschen
> > > > > >     {
> > > > > >     case page3_menu:
> > > > > >       TOUCHMENU3_DELETE();
> > > > > >       Menu_page1();               //Menüanzeige initialisieren
> > > > > >       page=pagePV;
> > > > > >       eDIP_cmd4_8('A','P',pagePVdown,1);      //Schalter PV-Seite stellen
> > > > > >     break;
> > > > > >     case page2_menu:
> > > > > >       TOUCHMENU2_DELETE();
> > > > > >       Menu_page3();               //Menüanzeige initialisieren
> > > > > >       page=pageHEIZUNG_TMP;
> > > > > >       eDIP_cmd4_8('A','P',pageHEIZUNG_TMPdown,1);      //Schalter PV-Seite stellen
> > > > > >     break;
> > > > > >     case page1_menu:
> > > > > >       TOUCHMENU1_DELETE();
> > > > > >       Menu_page2();               //Menüanzeige initialisieren
> > > > > >       page=pageRollDach;
> > > > > >       eDIP_cmd4_8('A','P',pageRollDach_down,1);      //Schalter
> > > > > >     break;
> > > > > >     }
> > > > > >     m_menu=menu;
> > > > > >   }
> > > > > >   switch (page)                                         // Seitenauswahl
> > > > > >   {
> > > > > >     case pageError:
> > > > > >     ERROR_INIT();
> > > > > >     ERROR_ANZ();
> > > > > >     break;
> > > > > >     case page1:
> > > > > >     PAGE1_INIT();                           // Seite 1 aktivieren
> > > > > >     PAGE1_ANZ();
> > > > > >     break;
> > > > > >     case pageE_KFZ:
> > > > > >     PAGE_E_KFZ_INIT();
> > > > > >     PAGE_E_KFZ_ANZ();
> > > > > >     break;
> > > > > >     case pageWG_MW:
> > > > > >     WG_MW_INIT();
> > > > > >     WG_MW_ANZ();
> > > > > >     break;
> > > > > >     case pageBewBLicht:
> > > > > >     BLICHT_INIT();
> > > > > >     BLICHT_ANZ();
> > > > > >     break;
> > > > > >     case pageWG:
> > > > > >     WG_INIT();
> > > > > >     WG_ANZ();
> > > > > >     break;
> > > > > >     case pagePV:
> > > > > >     PV_INIT();
> > > > > >     PV_ANLAGE();
> > > > > >     PV_ANZ();
> > > > > >     break;
> > > > > >     case pageAlarm:
> > > > > >     ALARM_INIT();
> > > > > >     ALARM_ANZ();
> > > > > >     break;
> > > > > >     case pageZSaugTeichp:
> > > > > >     ZSAUG_TEICHP_H2OENTHARTG_INIT();
> > > > > >     ZSAUG_TEICHP_H2OENTHARTG_ANZ();
> > > > > >     break;
> > > > > >     case pageRollDach:
> > > > > >     ROLL_DACH_INIT();
> > > > > >     ROLL_DACH_ANZ();
> > > > > >     break;
> > > > > >     case pageRollKUCHE:
> > > > > >     ROLL_KUCHE_INIT();
> > > > > >     ROLL_KUCHE_ANZ();
> > > > > >     break;
> > > > > >     case pageRollWZ:
> > > > > >     ROLL_WZ_INIT();
> > > > > >     ROLL_WZ_ANZ();
> > > > > >     break;
> > > > > >     case pageRollOG:
> > > > > >     ROLL_OG_INIT();
> > > > > >     ROLL_OG_ANZ();
> > > > > >     break;
> > > > > >     case pageFS20:
> > > > > >     RS232=FS20page_RS;             // RS232 auf FS20 stellen (Mux und Baudrate)
> > > > > >     FS20_INIT();
> > > > > >     FS20_ANZ();
> > > > > >     break;
> > > > > >     case pageHEIZUNG_STAT:
> > > > > >     HEIZUNG_STAT_INIT();
> > > > > >     HEIZUNG_STAT_ANZ();
> > > > > >     break;
> > > > > >     case pageHEIZUNG_EINSTLLG:
> > > > > >     HEIZUNG_EINSTLLG_INIT();
> > > > > >     HEIZUNG_EINSTLLG_ANZ();
> > > > > >     break;
> > > > > >     case pageHEIZUNG_ZEIT:
> > > > > >     HEIZUNG_ZEIT_INIT();
> > > > > >     HEIZUNG_ZEIT_ANZ();
> > > > > >     break;
> > > > > >     case pageHEIZUNG_TMP:
> > > > > >     HEIZUNG_TMP_INIT();
> > > > > >     HEIZUNG_TMP_ANZ();
> > > > > >     break;
> > > > > >     case pageHEIZUNG_ENERGIE:
> > > > > >     HEIZUNG_ENERGIE_INIT();
> > > > > >     HEIZUNG_ENERGIE_ANZ();
> > > > > >     break;
> > > > > >
> > > > > >   }
> > > > > >   if (month) DATUM();
> > > > > >   m_page=page;
> > > > > > }
> > > > > > void FS20_CLEAR(void)
> > > > > > {
> > > > > >     eDIP_cmd4_8('A','L',RKNtimedown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',RKOtimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZTtimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZStimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RWZWtimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RGOtimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RGTtimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RSTtimedown,1);
> > > > > >     eDIP_cmd4_8('A','L',RKWtimedown,1);
> > > > > > }
> > > > > > void HEIZUNG_STAT_CLEAR(void)
> > > > > > {
> > > > > >     eDIP_cmd4_8('A','L',HEIZGautodown,1);   // vorige Touchbereiche löschen
> > > > > >     eDIP_cmd4_8('A','L',HEIZGhanddown,1);
> > > > > >     eDIP_cmd4_8('A','L',GasEINdown,1);
> > > > > >     eDIP_cmd4_8('A','L',PufferEINdown,1);
> > > > > >     eDIP_cmd4_8('A','L',HK_EINdown,1);
> > > > > >     eDIP_cmd4_8('A','L',HK_AUSdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FBH_EINdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FBH_AUSdown,1);
> > > > > >     eDIP_cmd4_8('A','L',OfenEINdown,1);
> > > > > >     eDIP_cmd4_8('A','L',OfenAUSdown,1);
> > > > > >     eDIP_cmd4_8('A','L',HKMischerAUFdown,1);
> > > > > >     eDIP_cmd4_8('A','L',HKMischerZUdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FBHMischerAUFdown,1);
> > > > > >     eDIP_cmd4_8('A','L',FBHMischerZUdown,1);
> > > > > > }


    Antwort schreiben


Antworten:

Re: switch Abfrage (von UlliS - 2.11.2015 8:59)
    Re: switch Abfrage (von Josef - 2.11.2015 21:06)
        Re: switch Abfrage (von Josef - 4.11.2015 20:52)