PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim Programmieren einer simplen Verzögerung in C



bondia
29.12.2007, 09:34
Hallo, ich habe ein Programm für Asuro geschrieben, dass ihn vorwärts
fahren läßt, wenn keiner der Taster gedrückt ist und rückwärts, solange
einer betätigt wird. Funktioniert auch.
Wenn ich jetzt aber zusätzlich eine Verzögerung programmiere, damit
1 oder 2 sec. über den Tastendruck hinaus rückwärts gefahren werden soll,
wird kein Tastendruck mehr angenommen und die Räder drehen nur noch rückwärts. Es reicht schon der Befehl "Sleep(255);" oder
"for(z=0;z<65000;z++){}" und das Programm spielt verrückt.
Eigentlich doch nur eine simple Verzögerung?

radbruch
29.12.2007, 11:12
Hallo bondia

Willkommen im RN-Forum.

Bei solchen Problemen bitte immer das Programm (in Code-Tags) mitposten.

Sleep(36) entspricht etwa einer tausendstel Sekunde! Und auf 65000 zählt der ATMega8 auch im ms-Bereich. Wenn die Schleife überhaupt mit ins Programm kommt und nicht vom Compiler wegoptimiert wird, weil er erkennt, dass innerhalb der Schleife nichts zu tun ist.. Eine merkliche Verzögerung must du anders umsetzen. Das kann also eigentlich nicht die Ursache für deine Effekte sein.


Gruß

mic

bondia
29.12.2007, 19:01
Also hier das kleine Programm:


#include "asuro.h"
int main(void)
{
unsigned int z;
Init();

while(1)
{
if (PollSwitch()>0)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for(z=0;z<900;z++){Sleep(254);}
}
else
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
}
return 0;
}

Wenn ich bei MotorSpeed (0,0) eingebe funktioniert das Programm.
Das sehe ich an den StatusLED's. Aber sobald der Motor läuft spinnt das
Programm. Und wenn ich die Verzögerung(for...) entferne läuft es wieder.
Auch bei laufenden Motoren.
Wie kann man eine Verzögerung noch einfacher realisieren?

radbruch
29.12.2007, 21:37
Hallo bondia

So funktioniert's mit meinen asuro prima:

#include "asuro.h"
int main(void)
{
unsigned int z;
unsigned char taste1, taste2;
Init();
taste2=PollSwitch();
while(1)
{
taste1=PollSwitch();
if (taste1 && (taste1==taste2))
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(0,120);
for(z=0;z<250;z++)
{
Sleep(255);
}
}
else
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
taste2=taste1;
}
return 0;
}
http://img.youtube.com/vi/wfS5IBSm7Jc/3.jpg (http://www.youtube.com/watch?v=wfS5IBSm7Jc)
http://www.youtube.com/watch?v=wfS5IBSm7Jc

Vielleicht läuft dein asuro nicht mit Motorspeed 120. (Mein asuro hat eine 1:6 Endübersetzung und der linke Motor dreht nicht rückwärts)

Gruß

mic

damaltor
29.12.2007, 22:19
bondia, bitte benutze die code-tags. ich habe deinen beitrag editiert, du hast jetzt auch so eine hübsche box um deinen quellcode. wenn du bei deinem beitrag auf edit klickst, dann siehst du wie das geht =) danke

bondia
30.12.2007, 16:23
Danke für die Hilfe, wenn ich die Motoren auf MotorSpeed(100,100)
drossel klappt es. Die Motoren stören die Elektronik ganz schön.
Die Motoren so nah ran an die Elektronik ist ganz schön gewagt.

Noch eine Frage zu if (taste1 && (taste1 == taste2)).
taste1 ist doch ein char wert der mehr Werte annehmen kann als 0 oder 1,
während taste1==taste2 nur 0 oder 1 sein kann?

damaltor
30.12.2007, 16:56
ja genau. mit dem && werden aber nur "wahr" oder "falsch" verknüpft, und jeder wert ungleich null ist "wahr". die frage bedeutet also sozusagen:

WENN taste1 nicht null UND (taste1 ist gleich taste2)

radbruch
30.12.2007, 17:05
Hallo


Noch eine Frage zu if (taste1 && (taste1 == taste2)).

Bei "taste1 &&" wird der Wert als boolsche Variable betrachtet.
Bei "taste1 &" wäre es ein Char.

Beispiel:
Wenn taste1=3 ergibt taste1 & 2 eine 2 (bit0 wird gelöscht), taste1 && 2 ergibt true (true && true).

Bei der PollSwitch()-Abfrage oben wird wegen "&&" erst geprüft, ob taste1 true oder false ist, wobei 0 false entspricht und alles >0 ist true. Bei false wird sofort abgebrochen und der Rest nicht mehr untersucht. Bei true dann wird noch geprüft, ob taste1 gleich taste2. Wenn das der Fall ist, ist die IF-Bedingung erfüllt.

Verwirrt?

damaltor hat natürlich auch recht, er schreibt das aber kürzer und ist deshalb schneller fertig. Und das sogar, obwohl er die Shifttaste nutzt!

Gruß

mic

damaltor
30.12.2007, 18:42
tataaa... =) :P