- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 9 von 9

Thema: Problem beim Programmieren einer simplen Verzögerung in C

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2007
    Beiträge
    9

    Problem beim Programmieren einer simplen Verzögerung in C

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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?

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2007
    Beiträge
    9
    Also hier das kleine Programm:

    Code:
    #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?

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo bondia

    So funktioniert's mit meinen asuro prima:
    Code:
    #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;
    }
    Bild hier  
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    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
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2007
    Beiträge
    9
    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?

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    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)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    tataaa... =) :P
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress