- 12V Akku mit 280 Ah bauen         
Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 45

Thema: (Asuro Anfänger) Erstes Programm und kein Plan von Nix

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36

    (Asuro Anfänger) Erstes Programm und kein Plan von Nix

    Anzeige

    E-Bike
    So Leute Hallo
    Ich mach da ja vonner Schule dieses "Projekt" mit dem Asuro mit.
    Ok Schule ist noch nicht, aber ich kann meine Finger nicht von dem Teil lassen und hab dann, jetzt auch versucht mein erstes Programm zu schreiben. Ziel soll sein fahren und bei Hindernis 5 mal rot leuchten
    soll nacher noch mehr könn aber so weit bin ich gekommen
    Hier der Code:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
      unsigned char taste;
      int blink=0;
      Init();
      MotorDir(FWD,FWD); 
      while(1)
      {
    	 taste=PollSwitch();
    	 SerWrite(taste,5);
    	 if(taste>0)
    	 {
    		MotorSpeed(0,0);
    		for(int i=0; i<10 ; i++)
    		{
    			if(blink==0)
    			{
    				StatusLED(RED);
    				blink=1;
    				for(int a=0;a<333;a++)
    				{
    					Sleep(217);
    				}
    			}else if(blink==1)
    			{
    				StatusLED(OFF);
    				blink=0;
    				for(int a=0;a<333;a++)
    				{
    					Sleep(217);
    				}
    			}
    		}
    	 }
    	 if(taste==0)
    	 {
    	 MotorSpeed(120,120);
    	 }
      }
      return 0;
    }

    Das ganze Funktioniert auch aber wenn ich den SerWrite(); Befehl weg lasse dann geht nix mehr der geht einfach so in die for Schleife obwohl Taste garnicht >0 sein kann dann macht der nach jedem blinken son ruck als ob er absulut jede if anweisung und for Schleife in dem Programm ignuriert -.-
    Und ich hab absulut keine Ahnung wieso, weil der Befehl eigentlich ja nur die Variable Taste über die infrarot Schnittstelle senden soll

    Ich Danke schon mal für eure Hilfe

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    sieht schon mal gar nich so schlecht aus.

    der code ist zwar durchaus noch optimierbar, aber er tut wohl seinen dienst.

    das problem ist die funktion pollswitch():
    diese funktion macht häufige zicken und gibt falsche werte zurück. das liegt an fehlerhaften widerständen, an dem kondensator C6 und an einigen anderen dingen.

    es gibt verschiedene lösungsansätze dafür, von mehrfachen abfragen, bis hin zu änderungen an der platine. bitte benutze die suchfunktion, und gib taster ein, und wähle das asuro forum aus.

    auf jeden fall ist es so, dass pollswitch, als eine der ersten funktionen eines programms ausgeführt, immer falsche werte gibt. durch die SerWrite funktion, die (in mikroprozessorzeitrechnung) ewig dauert, kann der kondensator C6 entladen werden und die funktion kann ewas bessere werte schaffen.

    mal was anderes: tut die serwrite funktion überhaupt ihren dienst? nee wa?=)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    öhm ich bin doch im asuro Forum ??? oder meinst das im Zusammhang der Suchfunktion

    Naja also ich hab da nun so einen taster test laufen lassen
    der gibt 1 2 4 8 16 32 aus so solls auch glaub sein also von der Hardware alles ok (meiner Meinung nach zumindest)

    Hab jetzt mit dem hyperterminal von Windows meine SerWrite funktion ausgelesen also in der zeit wo er färht bzw noch kein taster gedrückt ist
    das aus
    $0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0 $0$0

    wobei $ anscheint sone arte Leerzeichen sein soll

    Wie dem auch sei also könnte schon eine sleep(216) also 3 ms ausrechen damit der kondensator sich entladen kann

    Noch ne interessante Frage gibt es das oder ähnliche Probleme auch bei anderen Funktionen ?

  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 albi1989

    Doch, du bist schon im asuro-Bereich. Herzlich willkommen.

    Deine Tastenwerte sehen gut aus, allerdings vermutlich bei stehendem asuro. In deinem Programm könntest du anstatt (taste>0) testweise auch mal auf die einzelnen Taster prüfen (taste==1)... (taste==32) oder Gruppen wie (taste==33) oder (taste==12) bzw. (taste==7) oder (taste==56). Jeder Taster wird durch ein Bit im Ergebniss von PollSwitch() dargestellt. Mehrere Taster durch die Summe der Wertigkeiten der jeweiligen Bits. (*würgs* alles klar soweit?)

    Eine Möglichkeit wäre die Mehrfachabfrage von PollSwitch() und der anschliessende Vergleich der Ergebnisse:

    taste1=PollSwitch();
    taste2=PollSwitch();

    if ((taste1==taste2) && (taste1>0)) ....

    Vielleicht bringt auch eine kurze Verzögerung nach Init() etwas:

    Init();
    Sleep(255);

    Mit serWrite() kann man nur Zeichenketten an den PC senden, der zweite Parameter gibt die Länge der Zeichenkette an. Um Werte zu senden, must du eine andere Funktion verwenden:

    PrintInt(taste);

    Die Funktion ist aus der erweiterten asuro-Bibliothek und sieht so aus:

    Code:
    void PrintInt(int wert)
    {  	char text[6]="      ";
    	itoa(wert,text,10);
    	SerWrite(text,5);
    }
    Wenn du diesen Code vor int main() in dein Programm kopierst, kann du diese Funktion auch mit deiner aktuellen Bibliothek nutzen.

    ...gibt es das oder ähnliche Probleme auch bei anderen Funktionen?
    Leider, oder zum Glück, gibt es ähnliche Probleme bei der Odometrie, bei den Liniensensoren und auch bei der Regelung der Motoren. Schliesslich wollen wir ja was lernen und nicht nur unterhalten werden.

    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
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Ich hab eine kleine Funktion geschrieben welche mir den PolSwitch Wert korrigiert(er dämpft im Grunde genommen die Schwankungen von PollSwitch):

    Code:
    unsigned char fkt_taster(void)
    {
        unsigned char taster=0;
    
        taster=PollSwitch();
    
        if(taster==PollSwitch() && taster!=0)
            return taster;
        else
            return 0;
    }

    Eine einfachere Variante zu blinken ist folgende:
    Code:
                for(i=0;i<MAX;i++)
                {
                    Msleep(500);
                    StatusLED(GREEN);
                    Msleep(500);
                    StatusLED(OFF);
                }
    Grüße,
    Harri

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    hilfts was? ist ein guter ansatz.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Ich schätze mal du verwendest nicht die asuro lib aus dem Netz, dann kannst du das Msleep und PrintInt wie in den letzten Beiträgen beschrieben nicht verwenden. Ich empfehle dir aber dringend die asuro lib runterzuladen.

    Ich hab mir für einen anderen Prozessor mal eine Minimalstvariante von itoa geschrieben(um Speicherplatz zu sparen), beachte aber bitte dass sie nur 3 Stellen handeln kann sowie nur positive Zahlen(also ideal für unsigned char wie es der Rückgabewert von PollSwitch ist):

    Code:
    unsigned char *int_to_ascii(int punkte)
    {
      static unsigned char temp[4]={'\0','\0','\0', '\0'};
      int n=0,hilfsvar=1;
    
      for(n=3;n>0;n--)
       {
         temp[n-1]=(punkte%(hilfsvar*10)-punkte%hilfsvar)/hilfsvar+'0';     
         hilfsvar=hilfsvar*10;
        }
       hilfsvar=0;
       for(n=0;n<3;n++)
       {
       	 if(temp[n]!='0')
       	   hilfsvar=1;//1 wenn kein blanking mehr erforderlich
       	 
       	 else if(temp[n]=='0' && hilfsvar==0)
       	   temp[n]=' ';
       }
    	return temp;
    }
    Somit kannst du dann auch ohne Asurolib schreiben:
    Code:
    SerWrite(int_to_ascii(PollSwitch()),4);

    Grüße,
    Harri
    Grüße,
    Harri

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    itoa geht auch ohne erweiterte lib... nei mir sogar mit der cd version
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    itoa geht auch ohne erweiterte lib
    Eben, itoa ist ein Bestandteil der stdlib.h
    Harry3, was ist jetzt Deine Funktion besser ?
    Ist sie schneller?
    Belegt sie weniger Flash ?
    Habe jetzt keine Lust zu testen, aber die modulo operationen sehen nicht gerade "schnell" aus...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Ihr seid göttlich geiles Forum !!!
    Voll viel Information muss ich erst mal verkraften
    Mit der Bibliothek meint ihr die asuro.h die ich da eingebunden habe ?
    Wo bekommt man aktuelle erweiterte Library her ?
    Wo ist der unterschied zwischen Sleep(); und Msleep(); außer dem größeren Datentypen ?
    Danke für den code fürs blinken
    hab das schon so mal ausprobiert aber mit sleep(); was meiner meinung nach auch gehn müsste hats da aber nicht (kann auch anderen grund gehabt haben) deswegen hab ich so lange was rum geschreiben bis es dann so ging
    if ((taste1==taste2) && (taste1>0))
    hab ich so änlich schon mal gesehn aber warum sollte taste1 ungleich taste2 sein ? oder dauert PollSwitch(); wieder so lange das sich das bis dahin geändert haben kann wegen dem Kondensator?

    Oh Gott viele Fragen hab ich da naja ist ja ein Forum und dafür da
    für die nächste könnt ich bestimmt die suchfunktion benutzen aber da ich ja schon so viel gefragt hab tuts die eine da auch nichts mehr ^^

    wenn ich bei meinem programm immer noch so wie oben ein rad festhalte geht das blinken los wurde aber eig keines meiner taster angepackt und was dann noch komischer ist dann geht er erst bei 10 bis 15 mal blinken wieder los also nach jeden 5 mal ein ruck dann wieder blinken, wieso hab ich wie so oft kein plan
    den effekt find ich sogar eig voll toll weil angenomm es verhackt sich nur ein rad oder der henkt einfahc nur iwo fest oder färht wogegen wo er nicht lang kommt und die taste sich abe nicht betätigen
    aber ich mag sachen nicht die ich nicht versteh wieso das so ist

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen