unterprogrammproblem!
-
ok anscheinend hats keiner kapiert...
Ich programmiere einen Microcontroller! Ich gebe dort ein Sinussignal aus und dabei ist es notwendig eine endlosschleife zu machen da ansonsten das signal nur eine schwingung durchläuft!
Die programmierung des sinussignales wird mit c++ gemacht und ist in einem unterprogramm, ansteuern tu ich das ganze dann mit <a href="http://www.ntsearch.com/search.php?q=visual basic&v=52&src=zon">visual basic</a> via rs232!wenn ich jetzt Zeichen "A" über VB an den µC schicke soll das programm gestartet werden! das hab ich bereits! wenn ich jetzt aber "B" schicke soll es wieder geschlossen werden!
hier das Unterprogramm für den Sinus! ihr werdet damit nicht viel anfangen können da es Microcontroller spezifische Syntax enthält aber vielleicht kann dann jemand was damit anfangen!
void sinus(void) interrupt 0x10 { /*Interruptprogramm */ unsigned int register index; /* variable index definieren */ while(1) { /* Endlosschleife */ for (index=0;index<PERIODE;) { /* von 0 bis 256... */ PW0 = b[index++]; for(i=1;i<=Wartezeit;i++); } } }
--------------
Achja: CME386
Das hab ich bereits versucht. einfach nach while mitif(Rs232buffer=B)
{
break;
}aber mit break halte ich ja das prog nur an! sobald ich dann ein anderes Zeichen als B schicke läuft das programm sofort wieder weiter!
ich bräuchte nen befehl um aus dem Unterprogramm komplett rauszukommen, sodass ich wieder in mein main() komme!
-
Ich nehme nicht an, dass der Prozessor Multithreading unterstützt, oder?
Somit würde ich dazu raten nach jedem 'Sinus durchlauf' einmal in die Empfangsschleife des Prozessors zu wechseln (Also die Schleife, in der er die "A"s und "B"s verarbeitet)
Sollte kein "B" angekommen sein, starte neuen Sinus-Durchgang...
Voraussetzung ist, dass du non-blocking lesen kannst, ob ein "B" angekommen ist. Wenn das nicht geht, habe ich leider auch keine Idee.
-
point schrieb:
ich bräuchte nen befehl um aus dem Unterprogramm komplett rauszukommen, sodass ich wieder in mein main() komme!
einfach return!
Eventuelle lokale Variablen in einer struct speichern, die per call by reference an die Funktion beim nächsten Aufruf wieder übergeben wird. Hier kannst du auch die Funktion dann direkt an beliebigen Stellen unterbrechen:struct LocalData { int pos; int i; bool finished; }; void init(LocalData& local) { local.pos=1; local.i=0; local.finished=false; } void funktion(LocalData& local) { local.finished=false; switch(local.pos) { case 1: ++local.pos; for(local.i=0; local.i<10; ++local.i) { cout<<"in Funktion\n"; return; case 2: continue; } } local.finished=true; } int main() { LocalData data; init(data); while(!data.finished) { cout<<"in Main\n"; funktion(data); } }
-
soweit mich nicht alles täuscht unterstüten mehr oder weniger alle microprozessoren interrupts, einfach nen interrupt aufs keyboard setzen und fertig
-
Korbinian schrieb:
soweit mich nicht alles täuscht unterstüten mehr oder weniger alle microprozessoren interrupts, einfach nen interrupt aufs keyboard setzen und fertig
... ansteuern tu ich das ganze dann mit visual basic via rs232!
Die Daten werden über RS232 gesendet. Ich kenn mich mit Hardwarenahen dingen icht aus, wüsste aber nicht wie da ein Keyboard Inerrupt helfen soll !?
-
jo klar, das kommt davon, wenn man die posts nur oberflächlich liest: ich hab übersehen, dass der mc vom pc aus gesteuert wird. dachte es wäre ein eigenständiger mc
*tipvonvorherzuruecknehm*
-
Ich habs bereits geschafft innerhalb der While schleife jedesmal abfragen ob ein "B" kommt! Dann hab ich einfach ein break gemacht! prinzipiell funktionierts ja das programm bleibt stehn! nur sobald ich dann ein anderes Zeichen schicke gehts wieder weiter...
und außerdem ist das keine elegante lösung! Gibt es keinen Befehl wie man ein Unterprogramm wieder schließt? also so wie man eins öffnet mit zb Unterprogramm();
gibts da nichts wie man das wieder schließen kann?
-
Wie man eine Funktion verlässt?
return Value;
Wie man eine Schleife verlässt?
Run=true; while(Run==true){ char Value; cin >> Value; switch(Value){ case 'Q': Run=false; break; case 'G': break; } }
Ich hoffe das hast du gemeint.
cu max
-
Es sei denn, es ist eine void funktion, dann einfach
return;
-
Du scheinst von Programmierung keine Ahnung zu haben, auf keinen Fall Erfahrung.
Solche Unterprogramme werden in C++ Funktionen und in Visual Basic Prozeduren genannt.
Um dieses ,,Unterprogramm'' zu beenden, musst du einfach, wie Shade of Mine schon sagte, einfach hinschreiben:return; [/code] Dann wird die Funktion beendet und das Teil landet wieder in der Funktion, die diese aufgerufen hat, i.d.F. main. Von dort aus geht es dann an der Stelle weiter, wo die Funktion aufgerufen wurde. [cpp] #include <iostream> using std::cout; using std::endl; void foo() { cout << "2"; return; } int main() { cout << "1" << endl; foo(); cout << "3" << endl; return 0; }
I.d.F. ist das return aber nicht nötig, da bei Ende der Funktion diese automatisch beendet wird.
MfG MAV
-
CarstenJ schrieb:
Es sei denn, es ist eine void funktion, dann einfach
return;
Void Funktionen sind kein Standard.
-
Void MAIN Funktionen sind kein Standard, alles andere natürlich ohne weiteres legal.
-
*duck* deshalb meckert der Compiler, sorry.
-
also wenn ich dann in der While schleife einfach das Zeichen B mit if abfrage und dann return; mache bin ich wieder im hauptprogramm?
also so in der art:
if(Rs232buffer==B)
{
return;
}Ich werds probieren sobald ich am pc bin wo ich meine ganze software drauf hab!
Aber schonmal danke im voraus