-         

Ergebnis 1 bis 7 von 7

Thema: Asuro - Erstes Programm

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.05.2015
    Beiträge
    35

    Asuro - Erstes Programm

    Anzeige

    Hallo,

    da ich keine Programmierkenntnisse bis jetzt in C habe, begann ich mich mit der Anleitung für C im Handbuch zum Asuro auseinanderzusetzen.

    Gestern habe ich ein Programm geschrieben (oder besser einfach nur zusammengesetzt aus dem gelesenen) um meinen Kleinen einfach nur mal vorwärts fahren zu lassen. Läuft ohne Probleme.

    Heute wollte ich dieses Programm erweitern um die Bedingung, wenn er irgendwo gegen fährt, sollen die Taster ein Signal liefern und die Motoren sollen sich auf 0,0 setzen, sprich stehen bleiben.

    Folgendes habe ich geschrieben:

    Code:
    #include "asuro.h"
    
    int main (void)
    
    
    
    {
    
    Init();
    
    unsigned char taste;
    
    taste = PollSwitch();
    
    if (taste > 0);
    
    	{
    	
    		MotorSpeed(0,0);
    		BackLED(ON,ON);
    	
    	}
    	
    MotorDir(FWD,FWD);
    MotorSpeed(120,152);
    StatusLED(GREEN);
    
    while(1);
    return 0;
    
    }
    Das sind so die Anweisungen, die ich aus der Anleitung habe. Ich möchte, die IF prüft, ob die Variable taste einen Wert <0 hat, wenn ja, dann soll die Geschwindigkeit MotorSpeed auf 0,0 gesetzte und die BackLEDs eingeschaltet werden, wenn Variable taste nicht <0 ist soll er einfach vorwärtsfahren mit grüner StatusLED.

    Die Bedingung scheint zu funktionieren, aber leider nicht korrekt, denn die BackLEDs leuchten auch beim normalen fahren, nehme ich die Anweisung raus, sind sie auch aus. Also er scheint in die Bedingung einzusteigen, leider aber laufen die Motoren weiter.

    Wo liegt mein Denkfehler?

    Gruß,
    wendtdir
    Geändert von wendtdir (17.05.2015 um 18:05 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    Hallo wendtdir,

    bitte benutze die Code Tags um Code zu psoten, damit bleibt Dieser dann auch leserlich.

    Zum Problem: Das ";" hinter der if (Bedingung) schient nicht korrekt zu sein (zu viel). Der Compiler meckert es ggf nicht an, weil er nicht auf Logik prüfen kann, sondern nur auf die Syntax - und die ist richtig. Denn jetzt "denkt" der Compiler "das war schon alles hinter der Bedingung.
    Merke: wenn man nur eine einzige Zeile als Anweisung hätte, kann man auch ohne geschweifte Klammern schreiben, muss dann aber zwingend in (der gleichen Zeile wie die Bedingung steht*) das Semikolon setzen. Genau das hast du getan. Dem Compiler interessiert es nicht ob es logisch für Dich korrekt ist - oder nicht.

    Wenn das Programm also nicht noch mehr wesentliche Fehler enthält, sollte es nach Berichtigung des ";" das tun was Du möchtest. Mal abgeseh davon das der Moment des Rückwärts fahrens praktisch vielleciht etwas zu kurz sein könnte. Optional würde ich der alternativ Anweisung komplett in ein else {} verpacken.

    Viele Grüße
    Jörg
    Geändert von HeXPloreR (18.05.2015 um 09:55 Uhr) Grund: * Edit - wichtiger Info dazu!!
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    04.05.2015
    Beiträge
    35
    Ich habe meinen ersten Text nochmal überarbeitet.

    Zu deinem Tipp, das ";" zu entfernen, leider hat es nicht funktioniert.

    Ich habe der Variablen "taste" direkt den Wert 1 zugeordnet um zu testen, ob er in die Bedingung überhaupt einsteigt und er machte genau das, was in der if-Anweisung stand, daher denke ich, dass der Code, den ich geschrieben habe soweit funktioniert. Ich tippe dann eher auf ein Hardware-Problem.

    Der SelfTest zeigt mir, dass bei den Tasten 3 und 4 ein Kontakt entsteht, aber nicht nur die Front LED bzw. die linke BackLED leuchten, sondern jeweils immer mit beide BackLEDs.
    Aus der AsuroWiki habe ich ein Kalibrierungsprogramm geladen um zu testen, was ankommt. Bei Taster 4 kommt nichts, bei Taster 3 habe ich eine Verschiebung der Zahlen gesehen. Da muss ich dann nochmal schauen, ob ich nicht irgendwo falsch gelötet habe. Aus Unachtsamkeit hatte ich beim Bestücken schon eine Diode von der Polarität falsch eingelötet und einen Widerstand ebenfalls in eine nicht korrekte Öffnung gesetzt.

    Gruß,
    wendtdir

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    Hallo wendtdir,

    natürlich ist es sinnvoll die Hardware zuerst zu überprüfen, ob auch alles richtig eingelötet ist usw - das musst Du leider ganz alleine und sehr sorgfälltig tun ... dann kann man sehen ob Dein Code MIT dem Semikolon korrekt funktioniert.
    Wovon ich mal grundsätzlich nicht ausgehen, wenn dahinter noch eine passende Bedingung abgearbeitet werden soll - und auch nur dann.

    Hier in dem Asuro Handbuch-Seite 60 steht unter 9.1.4. Bedingungen ganz deutlich kein ";" drin.
    Lade doch einfach mal das letzte Beispielprogramm unter 9.1.4. in den Asuro ein.
    Code:
    #include “asuro.h”
    
    int main(void) {
    Init ()
    while (1) {
    if (PollSwitch()>0) {StatusLED (RED);}
    else {StatusLED (GREEN);}
    }
    Viele Grüße
    Jörg
    Geändert von HeXPloreR (17.05.2015 um 19:08 Uhr)
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    04.05.2015
    Beiträge
    35
    Danke.

    Ich habe das Beispielprogramm jetzt erweitert und siehe da, er macht, was ich wollte.

    Code:
    #include "asuro.h"
    
    int main(void)
    
     {
     
    Init();
    
    while(1)
    	{
    	if(PollSwitch()>0)
    	{StatusLED(RED);
    	BackLED(ON,ON);
    	MotorDir(BREAK,BREAK);}
    	else
    	{StatusLED(GREEN);
    	BackLED(OFF,OFF);
    	MotorDir(FWD,FWD);
    	MotorSpeed(120,152);}
    	}
    
    return 0;
    
    }
    Das nächste, was ich demnächst einbauen möchte, er soll bei Kollision eine Zeit x zurücksetzen, sich drehen um eine gewisse Gradzahl und dann vorwärtsfahren bis zur nächsten Kollision.

    Nochmals Danke, Jörg.

    Gruß,
    Dirk

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Wenn die Motoren drehen kann es oft passieren das PollSwitch ein Fehler-messung macht für die niedrigste Bitwert-tasten. (K5 oder K6) Ein Kollisionserkennung macht man oft durch speichern von 2 Pollswitch-messungen (testen ob den Taster-eindruck stabil ist) in Variabelen und diese zu vergleichen mit einander und den gewünschte zustand.

    zbs.
    Code:
    ...
    int t1=PollSwitch();
    int t2=PollSwitch();
    
    if ((t1==t2) && (t1>0) ) { // mache Kollision }
      elseif {// keine kollision }
    ...

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    04.05.2015
    Beiträge
    35
    Hallo Valen,

    danke, deinen Code habe ich auch noch mit eingebaut, als kleine Sicherheit. Ab und an machen die Taster wirklich, was sie wollen .

    Für interessierte Anfänger hier ist jetzt mein kleines Programm:

    Code:
    #include "asuro.h"
    
    void MSleep(int dauer)
    
    {
    int z;
    for(z=0; z<dauer;z++)
    Sleep(72);
    }
    
    int main(void)
    
    {
    Init();
    
    while(1)
    	{
    	
    	int t1;
    	int t2;
    
    	t1 = PollSwitch();
    	t2 = PollSwitch();
    	
    	if((t1==t2) &&(t1>0))
    	{StatusLED(RED);
    	BackLED(ON,ON);
    	MotorDir(BREAK,BREAK);
    	MotorDir(RWD,RWD);
    	MotorSpeed(120,70);
    	MSleep(2000);
    	}
    	else
    	{StatusLED(GREEN);
    	BackLED(OFF,OFF);
    	MotorDir(FWD,FWD);
    	MotorSpeed(120,140);}
    	}
    
    return 0;
    
    }
    Der kleine Asuro fährt vorwärts, bis die Taster eine "Kollision" melden, dann wendet er für 2 Sekunden rückwärts und fährt bis zur Kollision wieder vorwärts. Die Differenz bei MotorSPeed(120,140) dient dem Ausgleich, der rechte Motor scheint etwas langsamer zu drehen, was evtl. an meinem Ritzeltausch liegt oder daran, dass die Achsen etwas weiterzusammengerückt sind. Mittlerweile läuft es aber. Im Normalfall sollten dort natürlich die gleichen Werte stehen.

    Gruß,
    Dirk

Ähnliche Themen

  1. erstes Programm in C
    Von IchKG im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 08.02.2008, 10:23
  2. Antworten: 44
    Letzter Beitrag: 12.09.2007, 00:54
  3. Asuro erstes Programm Fehler ?!
    Von BKA im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 09.05.2006, 20:52
  4. Erstes größeres ASURO-Programm macht nur Probleme
    Von Amaris im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 23.10.2005, 21:25
  5. erstes Programm
    Von sulu im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 6
    Letzter Beitrag: 16.09.2005, 21:06

Berechtigungen

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