Gast
#884874
Ich möchte Stellpult für die Modellbahn bauen, auf welchem ich das Startgeleise wähle und danach das Zielgeleise. Mit einer Wegsuche sollte dann ein Weg gefunden und die Weichen sowie die LEDs die die WEichenstellung anzeigen geschalten werden. Nun aber scheitere ich an der Wegsuchefunktion. teilweise scheint das ganze zu funktionieren, mit entsprechenden Display angaben konnte ich sehen, dass das Programm auch schon bis zu einem Fund gelaufen ist und die sortSS() ausführen konnte. Aber es gelangt nie zum Pkt. an welchem es "Weg nicht gefunden" oder "gestellt" ausgeben könnte. Das programm stürzt immer vorher ab (reset). Ein reset durch den watchdog ist ausgeschlossen, da dies auch geschieht, wenn dieser Ausgeschatet ist. Hardware: ATmega64 Code (Wegsuchefunktionen etc. - das komplette Prog ist im Anhang): //---------------------------------------------------------------------- // HAUPTPROGRAMM //---------------------------------------------------------------------- int main () // Hauptprogramm, startet bei Power ON und Reset { ... // Schleifenende Mainloop } //---------------------------------------------------------------------- // Funktionen //---------------------------------------------------------------------- void routingRT(railtrack *start, railtrack *end) //rückgabewert: #Wege { TCCR3B=0x00; //TIMER3 gestoppt (Autokorrektur) wdt_reset(); nofSS=0; // #SwichSets (mögliche Wege) (GLOBALE VAR) bool ifany=false; // bleibt false, falls kein Weg gefunden wird, wird true, wenn schon switchSet way; // weg, wird bei jedem Schritt, bei dem geschalten werden muss erweitert und beim finden des Weges in globales Array abgespeichert way.nofSP=0; // initialiesierung von way lcd_clrscr(); if(start->a!=null) { if(end->a!=null && routingSP(start->a,start->a_main,end->a,way,0)) ifany=true; if(end->b!=null && routingSP(start->a,start->a_main,end->b,way,0)) ifany=true; } wdt_reset(); if(start->b!=null) { if(end->a!=null && routingSP(start->b,start->b_main,end->a,way,0)) ifany=true; if(end->b!=null && routingSP(start->b,start->b_main,end->b,way,0)) ifany=true; } resetTbits(); // zurücksetzen von den 'tried'-bools (diese zeigen an, ob ein Wegstück bereits ausprobiert wurde) wdt_reset(); lcd_clrscr(); if(!ifany) lcd_puts("keinen Weg gefunden!"); else{ setSSSP(&arrSS[0]); //stellt Weichen & Anzeige entsprechend if(nofSS==1) { lcd_puts("gestellt"); zustand=0; //TODO Timer3->Display zurücksetzen// } else { lcd_puts("gestellt\nNEXT"); zustand=0; } } } bool routingSP(switchpoints *start,bool main, switchpoints *end,switchSet way,uint8_t i) { lcd_putc('('); //nur zum nachvollziehen des scheiterns des Programms.. hat leider nicht geholfgen :-( if(start->tried) //abbruch return false; start->tried=true; //'tried' zeigt an, ob ein Wegstück bereits versucht wurde wdt_reset(); bool ifany=false; if(!main) // komme ich von einer der beiden abzweigenden Richtung? (ich muss die Weiche (bei einer Modellbahn) nicht schalten) { if(start->main==end) //ist die an der Hauptrichtung angeschlossene Weiche bereits das Ziel? { arrSS[nofSS]=way; //Abspeichern des wegs sortSS(); nofSS++; return true; } if(routingSP(start->main,start->m_main,end,way,i)) ifany=true; }else{ // ich komme von der Hauptrichtung (ich kann abzweigen -> muss Weiche schalten) if(start->ahead==end) //...analog, hier muss ich einfach erst noch die Weiche stellen und dann abspeichern { way.arrSP[i]=start; way.arrDIR[i]=0; arrSS[nofSS]=way; sortSS(); nofSS++; return true; } if(start->branch==end) { way.arrSP[i]=start; way.arrDIR[i]=1; arrSS[nofSS]=way; sortSS(); nofSS++; return true; } way.arrSP[i]=start; //stellen der Weiche (im Array) way.arrDIR[i]=0; if(routingSP(start->ahead,start->a_main,end,way,i+1)) ifany=true; way.arrDIR[i]=1; if(routingSP(start->branch,start->b_main,end,way,i+1)) ifany=true; } return ifany; lcd_putc(')'); } Hoffe, dass jemand helfen kann - bin etwas verzweifelt. Gruss philp