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
Druckbare Version
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
Achtung! "=" ist nicht "==" !
So könnte es funktionieren:
Code:#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
}
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
Kann sein, muss aber nicht.Zitat:
grenzenlos schnell
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
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.Zitat:
Zitat von Richard
Im Übrigen bezeichne ich mein Programmiergestammel meist als C.
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.
Hallo
Eine einfache Variante deines Programms (ungetestet):
Code:#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
}
Du verwendest kein Code-Tag und zuviele "?" ;)Zitat:
Was mach ich denn falsch?
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:
GrußCode:#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
}
mic
Hi Danke für die schnelle Hilfe. Ich denke da kann ich was mit anfangen.
Gruß Frank
Hi, ich hab mal wieder ein Problem:
folgendes Programm läuft nicht so wie ich es will
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 FehlerCode:#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;
}
Gruß Frank
Hallo
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).Code:while(a<200)
{ break;
FrontLED(ON);
}
??? Ein paar Kommentare im Programm wären echt hilfreich.Zitat:
Was es bewirken soll ist denke ich ersichtlich.
Gruß
mic