PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmieren lernen



frank1210
27.12.2009, 10:41
so, wie´s aussieht hab ich ja meinen Proz. zerschossen. Wie auch immer das möglich ist. Bis der neue vom großen C da ist hab ich ja Zeit für Theorie. Die Programme die ich bis jetzt verwendet habe, hab ich alle irgendwo runtergeladen--vieleicht etwas daran geändert--und halt auf diesem wege versucht das ganze zu verstehen. Das mit der"while Schleife" verstehe ich noch nicht ganz.Wie geht z.B:
Anweisung1!
Bedingung1!
Wenn bedingung war dann Anweisung 2-kurze Pause
dann wieder Anweisung 1 bis sich wieder Bedingung 1 ergibt.
Kann mir das jemand anhand einenes ganz einfachen kommentierten Programms erklären.
Das wäre super.
Danke Frank

KingTobi
27.12.2009, 10:52
Wieso ist der kaputt gegangen, was funktioniert denn nicht mehr?
Normalerweise kriegt man die nicht kaputt, bzw. bekommt sie immer wieder zum laufen.

Sim Robot
27.12.2009, 10:54
Hi frank1210,




Kann mir das jemand anhand einenes ganz einfachen kommentierten Programms erklären.
Danke Frank

um dir das an einem Beispiel erklären zu können muss man wissen welche programmiersprache du/sie benutzen. auch die lib währe nicht schlecht( aber nicht so wichtig für die grundlagen).

Außerdem was möchtest du programmieren??
wenn es zumbeispiel in fertiger Roboterbausatz ist dann ist dort meistens eine anleitung mit den Grundlagen bei.
z.b. soetwas Link: http://arexx.com/arexx.php?cmd=goto&cparam=p_asuro_downloads
Datei:[PDF] ASURO ANLEITUNG (Deutsche Version)
(Seite 56-71)

sim Robot

frank1210
27.12.2009, 11:01
Wieso ist der kaputt gegangen, was funktioniert denn nicht mehr?
Normalerweise kriegt man die nicht kaputt, bzw. bekommt sie immer wieder zum laufen.

sieht bei mir halt so aus:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=51776

frank1210
27.12.2009, 11:03
Hi SIM ROBOT.
Ich hab nen ASURO, mit der Standart LIB.
Aber mit der Originalanleitung krieg ich das nicht hin.
Danke

radbruch
27.12.2009, 11:11
Hallo

Es gibt unzählige C-Tutorials im Netz:
http://openbook.galileocomputing.de/c_von_a_bis_z
http://www.rn-wissen.de/index.php/Avr-gcc
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://www.c-programme.de

Wenn die Bedingung in der while()-Anweisung erfüllt (=true) ist, wird der while()-Block ausgeführt bis die Bedingung nicht mehr erfüllt ist. Wenn die Bedingung nicht erfüllt ist, wird der Block übersprungen:


char c; // Hilfsvariable definieren
c=0; // und mit 0 vorbelegen
while(c<10) // prüfen ob die Variable noch kleiner 10 ist
{
i++; // sie ist kleiner, also müssen wir erhöhen
}


Gruß

mic

Sim Robot
27.12.2009, 12:04
hi frank1210


hast du den die anderen "Befehle" verstanden?

For schleifen
if schleifen
motor speed
und so weiter

wenn ja

eine while schleife ist ähnlich wie die anderen schleifen.
Unterschiede:
zur if schleife sie wird nach dem durschlauf erneut auf ihre wahrheit abgefragt. ist sie immer noch wahr so wird sie erneut durschlaufen. ist sie nicht mehr wahr wird das Programm hinter der schleife weitergeführt.

ein haufig genutztes beispiel ist:


While(1){

StatusLED("RED");

}
hierbei wird die schleife endloslange durchlaufen, weil 1 immer wahr ist.

oberallgeier
27.12.2009, 12:21
... meinen Proz. zerschossen ... Bis der neue vom großen C da ist ...Du hast Dir also den "originalen" Controller mit dem Bootloader bestellt (Artikel-Nr.: 191359 - LN) ? Denn sonst kannst Du nicht so ohne weiteres den asuro programmieren.

frank1210
27.12.2009, 14:06
Ohne jemanden Nerven zu wollen, würde dieses Pro funktionieren???
Es soll Status LED rot, wenn mann linken Taster drückt -für kurze zeit grün, dann wieder rot. Kann ja leider nicht testen.
Danke

#include "asuro.h"

int main(void)
{
Init();
int p;
StatusLED(RED);
while(PollSwitch()>=8);
{StatusLED(GREEN);
for(p=1;p<300;p++)
{Sleep(72);}
}
while(1);
return 0;
}

Sim Robot
27.12.2009, 14:55
#include "asuro.h"

int main(void)
{
Init();
int p;
int taste=PollSwitch();
StatusLED(RED);
while(taste=8) // kein semicolon
{StatusLED(GREEN);
for(p=1;p<300;p++)
{Sleep(72);}
}
while(1);
return 0;
} ich habe den code leicht geändert

statusLED würde jetzt so lange rot zeigen bis du/sie die taste drücken. dieser status bleibt für die Zeit Sleep(72)x300 (entspricht einer zeit von 0.3s) erhalten. bleibt die taste gedrückt so bleibt die StatusLED green.

Übrigens du/sie können das Programm ja schon mal compelieren dann fallen solche Fehler wie mit dem Semicolon schonmal auf.

Sim Robot

frank1210
27.12.2009, 15:12
Hey, Danke für die schnelle Antwort.
Und wenn man die Taste los lässt wird´s wieder rot?
Und ich denke hier im Forum kann man beim DU bleiben.
Gruß Frank

P.S. werde im Laufe der Zeit bestimmt noch 1000 Fragen zum Programmieren haben

radbruch
27.12.2009, 15:24
Achtung! "=" ist nicht "==" !

So könnte es funktionieren:

#include "asuro.h"

int main(void)
{
int p, taste; // Variablen für Pausenschleife und Tastenwerte

Init(); // muss immer aufgerufen werden!
while(1) // endlos bis Akkus leer
{
taste=PollSwitch(); // Tasten zweimal einlesen und Werte vergleichen
if((taste==PollSwitch()) && (taste>7)) // Taste auf der linken Seite gedrückt?
{
StatusLED(GREEN); // ja, dann grün leuchten
while(PollSwitch() > 0); // warten bis Taste wieder losgelassen wird
for(p=0;p<1000;p++) Sleep(72); // noch eine Sekunde grün bleiben
}
else StatusLED(RED); // keine linke Taste gedrückt, es wird rot angezeigt
}
return 0; // wird nie erreicht
}

Richard
27.12.2009, 17:41
Eimal allgemein gesehen.

Es giebt hier sehr viele junge aber auch ältere welche sich
ziemlich Mutig ans Programmieren machen ohne auch nur
annähernd zu wissen was sie dabei tun.

Am Anfang mag das sogar kleine Erfolge bescheren, aber die
lassen schneller nach als es einem Lieb ist.

Ich möchte deshalb allen den Rat geben sich etwas Zeit zu nehmen
und die Datenblätter der Bauteile/µc's anzuschauen und versuchen
diese auch zu iterprtieren. Verstehen kann ich die auch nicht, habe nie
Englisch gelernt. Aber die Fachausdrücke habe ich mir hatt angeeignet.
Die Arbeitsweise einer "von Neumann Maschine" angelesen.

Wer es wiklich begreifen will, sollte auf alle Fälle mal ein Jahr
oder gelegendlich in ASSEMBLER proggen, die einzigste Sprache
wo man einen Prosessor verstehen lehrnt und auch weiß was man
da letztendlich "anrichtet". :-)

Außerdem ist Assembler eher sau einfach, es gibt nur wenige Befehle
und die kann man sehr schnell auswendig lernen. Nachteil, für jeden
µc muß man neu lehrnen, läßtig, Zeitaufwändig, grenzenlos schnell.

Fazit:

Wer als Qereinsteiger mit einer Hochsprache anfängt wird schnell seine
Grenzen erreichen und einen µc nie wirklich verstehen lenrnen.
Mühseelig aber besser ist von vorne Anfangen, zumindest bis einige
Grundlagen geklärt sind.

Gruß Richard

021aet04
27.12.2009, 22:55
grenzenlos schnell

Kann sein, muss aber nicht.
Ein weiterer nachteil von ASM ist, dass bei den Programmen sehr viel geschrieben werden muss (im Gegensatz zu z.B. C) und dadurch unübersichtlich werden kann. Teilweise gehen Programme schneller in C als in ASM. Ich programmiere in C. Habe es aber auch in der Schule zum Teil gelernt. Ein weiterer Vorteil von C ist, dass man z.B. Linux-, Windows-,... und µC Programme in C schreiben kann. Man kann C Programme leichter auf ein anderes Betriebssystem bzw µC portieren als z.B. Basic oder ASM.

MfG Hannes

oberallgeier
28.12.2009, 10:27
... Wer es wiklich begreifen will, sollte auf alle Fälle mal ein Jahr oder gelegendlich in ASSEMBLER proggen, die einzigste Sprache wo man einen Prosessor verstehen lehrnt und auch weiß was man da letztendlich "anrichtet" ...Kann ich nur völlig bestätigen. Und da ATMEL nicht für jeden Controller einen neuen Istruction Set erstellt und auch andere Hersteller in dieser Hinsicht nicht gerne innovativ sind, sehe ich meine Kenntnisse in ASM schon als gute Anschaffung. Selbst meine prähistorischen Kenntnisse in Z80-Assembler hatten mir bei Atmel geholfen.

Im Übrigen bezeichne ich mein Programmiergestammel meist als C.

frank1210
05.01.2010, 11:26
So, endlich läuft er (fährt natürlich) wieder. Selbsttest bestanden, und promt will ich jetzt wieder programmieren.
folgenden Text eingegeben:

#include "asuro.h"
int main(void)
{
Init();
int p;
int taste=PollSwitch();
StatusLED(RED);
while(taste>2)
{StatusLED(GREEN);
for(p=1;p<300;p++)
{Sleep(72);}
}
while(1);
return 0;
}
Geh´t nicht. Brennt nur die rote LED.
Was mach ich denn falsch?????????

Bei dem mit if else hab ich´s verstanden, und es funzt auch:

include "asuro.h"

int main(void) {
unsigned char t;
Init();
int p;
while (1) {

t=PollSwitch();

if (t > 1)
{
StatusLED(RED);
for(p=1;p<300;p++)
{Sleep(72);}

}

else
{
StatusLED(YELLOW);
}

}
return 0;
}
Ich will doch nur die WHILE Schleife verstehen. Und mit dieser Funktion genau so die LED´s steuern--um´s zu begreifen.

radbruch
05.01.2010, 12:21
Hallo

Eine einfache Variante deines Programms (ungetestet):

#include "asuro.h"
int main(void)
{
int p;

Init(); // muss immer aufgerufen werden!
while(1) // Endlosschleife
{
StatusLED(RED);
while(PollSwitch()>2) // Tasten immer wieder neu einlesen und auswerten
{
StatusLED(GREEN);
for(p=1;p<300;p++) Sleep(72);
StatusLED(YELLOW);
for(p=1;p<300;p++) Sleep(72);
}
}
return 0; // wird nie erreicht
}

Was mach ich denn falsch?Du verwendest kein Code-Tag und zuviele "?" ;)

Deine Programmversion wurde nur einmal ausgeführt und blieb dann in der Endlos-While()-Schleife vor dem return stecken. Außerdem wurde bei while(taste>2) der Wert für taste nicht mehr neu eingelesen. Wenn die Schleife einmal betreten wurde, konnte sie nie mehr abgebrochen werden:


#include "asuro.h"
int main(void)
{
int p;
int taste;

Init(); // muss immer aufgerufen werden!
while(1) // Endlosschleife
{
StatusLED(RED);
taste=PollSwitch(); // Tasten einlesen
while(taste>2) // in dieser Schleife wird taste nicht mehr aktuallisiert!
{
StatusLED(GREEN);
for(p=1;p<300;p++) Sleep(72);
// taste=PollSwitch(); // nur wenn die Tasten erneut eingelesen werden
} // kann die Schleife wieder verlassen werden!
}
return 0; // wird nie erreicht
}

Gruß

mic

frank1210
05.01.2010, 12:45
Hi Danke für die schnelle Hilfe. Ich denke da kann ich was mit anfangen.
Gruß Frank

frank1210
09.01.2010, 13:18
Hi, ich hab mal wieder ein Problem:
folgendes Programm läuft nicht so wie ich es will

#include "asuro.h"

int main(void)
{
int p;
int a=400;

Init();


while(1)
{ MotorDir(FWD,FWD);
BackLED(OFF,OFF);
MotorSpeed(175,175);
BackLED(OFF,OFF);

while(PollSwitch()>==8)
{ BackLED(ON,OFF);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
for(p=1;p<200;p++)Sleep(255);
MotorDir(RWD,RWD);
MotorSpeed(120,170);
for(p=1;p<a;p++)Sleep(255);
MotorSpeed(0,0);
for(p=1;p<300;p++)Sleep(72);
a=a+20;
}
while((PollSwitch()<8)&&(PollSwitch()>1))
{ BackLED(OFF,ON);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
for(p=1;p<200;p++)Sleep(255);
MotorDir(RWD,RWD);
MotorSpeed(170,120);
for(p=1;p<a;p++)Sleep(255);
MotorSpeed(0,0);
for(p=1;p<300;p++)Sleep(72);
a=a-50;
}
while(a<200)
{ break;
FrontLED(ON);
}


}
return 0;
}
Was es bewirken soll ist denke ich ersichtlich. Aber ich kann so oft ich will die rechten Taster drücken--break und FrontLED treten nicht ein 8-[. Wo liegt mein Fehler
Gruß Frank

radbruch
09.01.2010, 13:57
Hallo


while(a<200)
{ break;
FrontLED(ON);
}


Das break ist hier ein C-Befehl und bewirkt, dass die aktuelle while-Schleife sofort verlassen wird. Dadurch wird der FrontLED(ON)-Befehl nie ausgeführt. Vermutlich meinst du MotorDir(BREAK,BREAK).


Was es bewirken soll ist denke ich ersichtlich.??? Ein paar Kommentare im Programm wären echt hilfreich.

Gruß

mic

hai1991
09.01.2010, 18:52
hallo

was mir noch aufgefallen ist:

while(PollSwitch()>==8)
bei diesem vergleichsoperator bin ich mir nicht sicher, was du als ergebnis erhältst.
entweder meinst du == als abfrabe, ob beide werte gleich groß sind
oder >= ob der 1. wert größer oder gleich dem 2. ist

und noch ein kleiner hinweis, vl ist es auch deine absicht, aber wenn du schreibst

while(a<200)
{
//hier irgend welche befehle, in deinem fall FrontLED(ON);
}

und in der schleife der wert a nicht verändert wird, dann bleibt das programm hier stecken. d.h. die anderen programmteile werden nicht mehr ausgeführt.

frank1210
09.01.2010, 20:12
So, hier noch mal das Programm mit Kommentaren.

#include "asuro.h"

int main(void)
{
int p;
int a=400; // gibt Zählwert an

Init();


while(1) // Asuro soll einfach losfahren
{ MotorDir(FWD,FWD);
BackLED(OFF,OFF);
MotorSpeed(175,175);
BackLED(OFF,OFF); // beide BackLED aus

while(PollSwitch()>=8) //wenn eine linke Taste gedrückt wird
{ BackLED(ON,OFF);// linke LED an
MotorDir(BREAK,BREAK); // Stop
MotorSpeed(0,0);
for(p=1;p<200;p++)Sleep(255); // kurze rechte Rückwärtskurve
MotorDir(RWD,RWD);
MotorSpeed(120,170);
for(p=1;p<a;p++)Sleep(255); // Pause
MotorSpeed(0,0);
for(p=1;p<300;p++)Sleep(72);
a=a+20; // wenn jetzt nichts passiert einfach geradeaus weiter fahren
}
while((PollSwitch()<8)&&(PollSwitch()>1)) // hier die Tasten 2und 3 von rechts gesehen
{ BackLED(OFF,ON);// rechte LED an
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
for(p=1;p<200;p++)Sleep(255);// kurze linke Rückwärtskurve
MotorDir(RWD,RWD);
MotorSpeed(170,120);
for(p=1;p<a;p++)Sleep(255);
MotorSpeed(0,0);
for(p=1;p<300;p++)Sleep(72);
a=a-50; // hier soll vom Zählwert abgezogen werden, damit die Rückwärtskurven immer unterschiedlich ausfallen
}
// wenn jetzt nichts passiert einfach geradeaus weiter fahren

while(a<200) // wenn der Zählwert die 200 unterschreitet soll er stehenbleiben, und die FrontLED leuchten
{ break;
FrontLED(ON);
}


}
return 0;
}
Irgendwas ist falsch, das mit den Zählwert klappt wohl nicht, und wenn rein theoretisch der zählwert unter 200 liegt ändert sich garnicht´s.
Gruß Frank

hai1991
09.01.2010, 20:42
warum die FrontLED nicht leuchtet wenn a<200 hat radbruch schon beschrieben:



while(a<200)
{ break;
FrontLED(ON);
}


Das break ist hier ein C-Befehl und bewirkt, dass die aktuelle while-Schleife sofort verlassen wird. Dadurch wird der FrontLED(ON)-Befehl nie ausgeführt. Vermutlich meinst du MotorDir(BREAK,BREAK).


dass er stehen bleibt müsste es so aussehen:

while(a<200)
{
MotorDir(BREAK,BREAK); //Motoren ausschalten
FrontLED(ON); //Frontled an
}

frank1210
09.01.2010, 20:55
Hab´s jetzt noch mal mit nur LED´s versucht, und es klappt auf einmal. Hab ja sonst nix berändert. Kann die Motorspannung was damit zu tun haben?
#include "asuro.h"

int main(void)
{
int p;
int a=400;

Init();


while(1)
{ StatusLED(GREEN);
BackLED(OFF,OFF);

while(PollSwitch()>=8)
{ BackLED(ON,OFF);
StatusLED(RED);
for(p=1;p<200;p++)Sleep(255);
StatusLED(YELLOW);
for(p=1;p<a;p++)Sleep(255);
StatusLED(OFF);
for(p=1;p<300;p++)Sleep(72);
a=a+20;
}
while((PollSwitch()<8)&&(PollSwitch()>1))
{ BackLED(OFF,ON);
StatusLED(YELLOW);
for(p=1;p<200;p++)Sleep(255);
StatusLED(RED);
for(p=1;p<a;p++)Sleep(255);
StatusLED(OFF);
for(p=1;p<300;p++)Sleep(72);
a=a-50;
}
while(a<200)
{
FrontLED(ON);
BackLED(ON,ON);
}


}
return 0;
}

hai1991
09.01.2010, 21:12
hallo frank

wie schon zweimal beschrieben ist der break-befehl in der while-schleife schuld.


Hab ja sonst nix berändert.doch, du hast diesen befehl gelöscht. dadurch wird die while-schleife nicht abgebrochen!


es gibt aber das problem, dass durch die laufenden motoren die tasterauswertung nicht korrekt ist.
als abhilfe kann man dann die PollSwitch mehrfach aufrufen und auf gleichheit überprüfen.
als beispiel:

int t1;
t1=PollSwitch();
if(PollSwitch==t1 && t1>=8)
{
//dieser teil wird nur aufgerufen,
//wenn PollSwitch zweimal hintereinander
//den selben wert geliefert hat und
//dieser größer oder gleich 8 war
}

radbruch
09.01.2010, 21:17
Noch ein Versuch, man soll ja nie aufgeben:

while(a<200)
{
break;
FrontLED(ON);
BackLED(ON,ON);
}

Funktioniert das auch?

frank1210
10.01.2010, 10:31
Hi radbruch, das mit break funktioniert nicht, und an hai1991 mit den mehrfachabfragen werde ich ausprobieren.
Danke

radbruch
10.01.2010, 11:45
Hi radbruch, das mit break funktioniert nicht....
Naja, es war ein Versuch. Ich befürchte, hier kann ich nicht mehr weiterhelfen.

Gruß

mic

Valen
10.01.2010, 13:18
...
while( (PollSwitch() <8 ) && ( PollSwitch()>1 ))
{ BackLED(OFF,ON);
StatusLED(YELLOW);
...Genau mit welcher taster probierst du das zu testen? Und was ist die rechter taster in deiner meinung? Und was meint 'funkioniert nicht'? Was erwartest du? Deine kommentierungen sind auch wieder weg.

In einer altere bericht erzählst du von die ganz rechter taster. Die obene code ist von deine letzte bericht mit kompletem program drin. Die while-schleife tret nur ein wan die 2e (K5, wert=4) oder 3e (K4, wert=2) taster (von hinten gesehen, von rechts zu links) eingeprellt sind. Durch den >1 reagiert er nicht auf dem ganz rechter taster alleine (K6, von hinter gesehen, neben den an/aus schalter), weil K6=1. Mit ">=" stimmt die logik und wird er reagieren auf alle taster an dem an/aus schalter seite.

frank1210
10.01.2010, 13:42
Nun ja, ich denke mal alle Fehler sind beseitigt. Das mit dem ganz recheten Taster (K6) der den Wer 1 liefert habe ich absichtlich weggelassen, da bei laufenden Motoren immer wieder Störungen auftraten. ich meinte die linken Taster mit K1 bis K3 und die rechten mit K4-K6. Ich versuchs mal mit der mehrfachen Tasterabfrage.
Gruß Frank