- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Programm geht nicht!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31

    Programm geht nicht!

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich habe ein Programm geschrieben, bei dem sich der Asuro entweder nach rechts, oder links drehen soll.
    Aber er springt immer bei switch nach TurnL, weil immer die linke backLed leuchtet. die werte, die PollSwitch zurüchgibt stimmen, die hab ich gemessen! Ich finde keinen Fehler!
    so sieht das programm aus, vielleicht habe ich irgendwas übersehen:
    Code:
     #include "asuro.h"
    
    //Metoden
    void TurnR (void);
    void TurnL (void);
    
    int main(void)
    {
    	//Inizialisieren
    	Init();
    	//Variablen
    	unsigned char t1 = 0;
    	unsigned char t2 = 0;
    	unsigned char t3 = 0;
    	// losfahren
    	MotorDir(FWD, FWD);
    	MotorSpeed(200, 200);	
    	//endlosschleife
    	while(1)
    	{
    	  //tastenabfrage
    	  t1 = PollSwitch();
    	  Sleep(10);
    	  t2 = PollSwitch();
    	  Sleep(10);
    	  t3 = PollSwitch();
    	  //tastenauswertung
    	  switch (t1 && t2 && t3){
    	    case 32: TurnR(); break;
    	    case 16: TurnR(); break;
    	    case  8: TurnR(); break;
    	    case  4: TurnL(); break;
    	    case  2: TurnL(); break;
    	    case  1: TurnL(); break;
    	    case  0: MotorDir(FWD, FWD); break;
    	  };
    	};
    	//wegen int:
    	return(0);
    };
    
    void TurnR (void)
    {
      //variablen
      int i=0;
      //stueck zurueck
      MotorDir(RWD,RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      //drehen
      MotorDir(FWD, RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      BackLED(OFF,ON);
    };
    
    void TurnL (void)
    {
      //variablen
      int i=0;
      //stueck zurueck
      MotorDir(RWD,RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      //drehen
      MotorDir(RWD, FWD);
      for (i=0;i<50;i++)
    	{Sleep(255);}
      BackLED(ON,OFF);
    };
    schonmal danke für die hilfe
    Chrissi
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

  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

    Der "Fehler" liegt wohl hier:

    switch (t1 && t2 && t3){

    && ist ein logisches Und, das Ergebniss ist false wenn eines der ts false ist. Wird nun eine Taste gedrückt und alle ts sind ungleich null dann ist der Ausdruck true und GCC speichert das als 1 und case interpretiert es als Auswahl. Alles klar? So könnte es funktionieren:

    if (t1 && (t1 == t2 == t3)) switch(t1){

    was bedeutet: wenn t1 true ist (also ungleich 0) und t1 gleich t2 gleich t3 ist dann switche mit t1...

    Ach, und mit großer MotorSpeed() die Drehrichtung ändern ist übel fürs Getriebe!

    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
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Danke, ich werde es morgen testen, im Moment keine zeit!
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Sorry, dass das so lange gedauert hat, aber es funktioniert noch nicht so ganz!
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    32
    Beiträge
    239
    hallo

    was heißt "funktioniert noch nicht so ganz"???
    kannst du dein problem genauer beschreiben, damit wir wissen, wo man zu suchen anfangen soll
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Hallo,
    Entschuldigung für den sinnlosen Post!!
    Ich habe ein bisschen an switch rumprobiert, aber bei
    if (t1 == t2 == t3) switch (t1){
    dreht er sich wie wild mal in die eine, mal in die andere Richtung, er meint dauernd dass er irgendwo anstösst!
    bei
    if ((t1 =! 0) && (t2 =! 0) && (t3 =! 0)) switch (t1){
    meint er, dass er immer an der gleichen Stelle anstößt, und macht so einen Kreis nach rückwärts rechts!
    Ich weiß nicht, was ich diesmal falschgemacht hab, oder ob ich nur einen dummen Syntaxfehler gemacht hab!

    so sieht das Programm im Moment aus:
    Code:
    #include "asuro.h"
    
    //Metoden
    void TurnR (void);
    void TurnL (void);
    
    int main(void)
    {
    	//Inizialisieren
    	Init();
    	//Variablen
    	unsigned char t1 = 0;
    	unsigned char t2 = 0;
    	unsigned char t3 = 0;
    	// losfahren
    	MotorDir(FWD, FWD);
    	MotorSpeed(200, 200);
    	//endlosschleife
    	while(1)
    	{
    	  //tastenabfrage
    	  t1 = PollSwitch();
    	  Sleep(10);
    	  t2 = PollSwitch();
    	  Sleep(10);
    	  t3 = PollSwitch();
    	  //tastenauswertung
    	  if ((t1 =! 0) && (t2 =! 0) && (t3 =! 0)) switch (t1){
    	    case 32: TurnR(); break;
    	    case 16: TurnR(); break;
    	    case  8: TurnR(); break;
    	    case  4: TurnL(); break;
    	    case  2: TurnL(); break;
    	    case  1: TurnL(); break;
    	    case  0: MotorDir(FWD, FWD); break;
    	  };
    	};
    	//wegen int:
    	return(0);
    };
    
    void TurnR (void)
    {
      //variablen
      int i=0;
      //stueck zurueck
      MotorDir(RWD,RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      //drehen
      MotorDir(FWD, RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      BackLED(OFF,ON);
    };
    
    void TurnL (void)
    {
      //variablen
      int i=0;
      //stueck zurueck
      MotorDir(RWD,RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      //drehen
      MotorDir(RWD, FWD);
      for (i=0;i<50;i++)
    	{Sleep(255);}
      BackLED(ON,OFF);
    };
    mfg Chrissi
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Hallo,
    also ich schreib den ungleich-operator normal so: != anstatt =!. Weiß nicht ob das beim asuro einfluss hat.

    Warum machst du keine einfache if-else-konstruktion.

    if (irgendwas) {
    mach was...
    }
    else if (irgendwas) {
    mach was...
    }


    mfg

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Hallo Wsk8,
    der ungleich-operator war das Problem!
    Es bedurfte nur noch einer kleinen änderung an den Turn() Methoden, da in switch bei einer abfrage auf != 0 ein case 0: natürlich unsinnig ist!
    So funktioniert es:
    Code:
    #include "asuro.h"
    
    //Metoden
    void TurnR (void);
    void TurnL (void);
    
    int main(void)
    {
    	//Inizialisieren
    	Init();
    	//Variablen
    	unsigned char t1 = 0;
    	unsigned char t2 = 0;
    	unsigned char t3 = 0;
    	// losfahren
    	MotorDir(FWD, FWD);
    	MotorSpeed(200, 200);
    	//endlosschleife
    	while(1)
    	{
    	  //tastenabfrage
    	  t1 = PollSwitch();
    	  Sleep(10);
    	  t2 = PollSwitch();
    	  Sleep(10);
    	  t3 = PollSwitch();
    	  //tastenauswertung
    	  if ((t1 != 0) && (t1 = t2 = t3)) switch (t1){
    	    case 32: TurnR(); break;
    	    case 16: TurnR(); break;
    	    case  8: TurnR(); break;
    	    case  4: TurnL(); break;
    	    case  2: TurnL(); break;
    	    case  1: TurnL(); break;
    	  };
    	};
    	//wegen int:
    	return(0);
    };
    
    void TurnR (void)
    {
      //variablen
      int i=0;
      //stueck zurueck
      MotorDir(RWD,RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      //drehen
      MotorDir(FWD, RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      BackLED(OFF,ON);
      MotorDir(FWD,FWD);
    };
    
    void TurnL (void)
    {
      //variablen
      int i=0;
      //stueck zurueck
      MotorDir(RWD,RWD);
      for (i=0;i<50;i++)
        {Sleep(255);}
      //drehen
      MotorDir(RWD, FWD);
      for (i=0;i<50;i++)
    	{Sleep(255);}
      BackLED(ON,OFF);
      MotorDir(FWD,FWD);
    };
    mfg Chrissi
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

Berechtigungen

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

12V Akku bauen