-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Odometrie die 1001

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2007
    Beiträge
    10

    Odometrie die 1001

    Anzeige

    Hallo,
    ich möchte gerne schauen wieviele Hell/Dunkel- Welchsel in 20 Sekunden links und rechts erfolgen.
    Dafür habe ich mir gedacht dieses Programm zu schreiben. Es klappt aber leider nicht so, wie ich mir das eigentlich vorgestellt habe. Die wechsel werden nicht richtig gezählt und nach dem 10ten "Wechsel" mag das Programm nicht mehr weiterzählen udn ich bekomme irgendwelche komischen Zeichen im Terminal angezeigt. Ich bin neu auf diesem Gebiet und wollte diese Aufgabe als Übung hernehmen.
    Ich danke fuer jeden Tipp.
    Code:
    #include "asuro.h" 
    #include <stdlib.h> 
    
    
    void ZahlSenden(int zahl) 
    { 
    	char text[6]=" "; 
    	itoa(zahl,text,10); 
    	SerWrite(text,5); 
    } 
    
    
    
    int main(void) 
    { 
    	unsigned char flagl, flagr, sw; 
    	unsigned int data[2]; 
    	unsigned int wechsel_l, wechsel_r, mittelwert, start_var_l, start_var_r; 
    	
    	Init(); 
    	MotorDir(FWD,FWD); 
    	MotorSpeed(125,125); 
    	OdometrieData(data);
    	start_var_l=data[0];
    	start_var_r=data[1];
    	mittelwert=350;
    	wechsel_l=0;
    	wechsel_r=0;
    	while (1) {
    		OdometrieData(data); 
    		if (data[0]<mittelwert && start_var_l>mittelwert) {
    			wechsel_l++;
    		}
    		
    		if (data[0]>mittelwert && start_var_l<mittelwert) {
    			wechsel_l++;
    		}
    		
    		if (data[1]<mittelwert && start_var_r>mittelwert) {
    			wechsel_r++;
    		}
    		
    		if (data[1]>mittelwert && start_var_r<mittelwert) {
    			wechsel_r++;
    		}
    		
    		
    		ZahlSenden(wechsel_r); 
    		SerWrite("\t ",3); 
    		ZahlSenden(wechsel_l); 
    		
    	
       }
       return 0; 
    }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    So auf die Schnelle vor der Arbeit:

    char text[6]=" ";
    itoa(zahl,text,10);
    SerWrite(text,5);

    Ich bin nicht sicher, ob dass ok ist.

    Ausserdem, und das ist wohl das hauptsächliche Problem, läuft die Endlosschleife immer mit den Startwerten:

    if (data[0]<mittelwert && start_var_l>mittelwert) {
    wechsel_l++;
    start_var_l=data[0];
    }

    Gruß

    mic

    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
    22.01.2007
    Beiträge
    10
    Hi,
    data wird ja eine Zeile drüber neu ausgelesen.
    Danke trotzdem für die Antwort

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    mal was kleines: \t ist EIN byte. es reicht SerWrite("\t",1).

    ansonsten könnte ich mir vorstellen, dass du den mittelwert zu niedrig gewählt hast (350).

    schreib mal ein programm, welches einfach nur bei drehenden motoren die aktuellen odometrie werte ausgibt, dann weisst du etwa in welcher größenordnung die sich bewegen (kannst bei dieser gelegenheit auch gleich rausfinden wie störlichempfindlich der asuro ist).
    kleinschreibung ist cool!

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Also doch ausführlicher:

    Die Startwerte werden zu Beginn eingelesen und nicht aktuallisiert. Dann wird bei jedem Durchlauf der Zähler erhöht auch wenn wir uns noch im schon gezählten Feld befinden.

    Einfaches Zahlenbeispiel:

    Mittelwert ist 350, start_var_l sei 200:

    Dies hier wird nie gezählt weil (start_var_l>mittelwert) immer falsch ist:

    if (data[0]<mittelwert && start_var_l>mittelwert) {
    wechsel_l++;
    }

    Aber dafür wird hier bei jedem Schleifendurchgang mit (data[0]>mittelwert) gezählt weil (start_var_l<mittelwert) immer wahr ist:

    if (data[0]>mittelwert && start_var_l<mittelwert) {
    wechsel_l++;
    }

    Wenn ein Bitwechsel festgestellt wurde, muss der Wert dazu gespeichert werden um den nächsten Bitwechsel erkennen zu können.




    @damaltor: Nach dem \t folgen zwei Leerzeichen

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    die hab ich nicht gesehn =)
    kleinschreibung ist cool!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2007
    Beiträge
    10
    ah danke ich glaube ich verstehe jetzt
    supi
    oh gott bin ich hohl

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2007
    Beiträge
    10
    sio sollte es abe rgehen oder ?
    Code:
    #include "asuro.h" 
    #include <stdlib.h> 
    
    
    void ZahlSenden(int zahl) 
    { 
    	char text[6]=" "; 
    	itoa(zahl,text,10); 
    	SerWrite(text,5); 
    } 
    
    
    
    int main(void) 
    { 
    	unsigned int data[2]; 
    	unsigned int wechsel_l, wechsel_r, mittelwert, start_var_l, start_var_r; 
    	
    	Init(); 
    	SerWrite("Start ",6); 
    	MotorDir(FWD,FWD); 
    	MotorSpeed(125,125); 
    	OdometrieData(data);
    	start_var_l=data[0];
    	start_var_r=data[1];
    	mittelwert=350;
    	wechsel_l=0;
    	wechsel_r=0;
    	while (1) {
    		OdometrieData(data); 
    		if (data[0]<mittelwert && start_var_l>mittelwert) {
    			start_var_l=data[0];
    			wechsel_l++;
    		}
    		
    		if (data[0]>mittelwert && start_var_l<mittelwert) {
    			start_var_l=data[0];
    			wechsel_l++;
    		}
    		
    		if (data[1]<mittelwert && start_var_r>mittelwert) {
    			start_var_r=data[0];
    			wechsel_r++;
    		}
    		
    		if (data[1]>mittelwert && start_var_r<mittelwert) {
    			start_var_r=data[0];
    			wechsel_r++;
    		}
    		
    		
    		ZahlSenden(wechsel_r);
    		SerWrite("\t-",3); 
    		ZahlSenden(wechsel_l);
    		SerWrite("\n\r",4); 
    		
    	
       }
       return 0; 
    }

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Fast *gg*

    if (data[1]>mittelwert && start_var_r<mittelwert) {
    start_var_r=data[0];
    wechsel_r++;
    }

    Du solltest schon den richtigen Wert speichern...

    (... und die Länge der Zeichenketten in den SerWrite()-Aufrufen überprüfen. \n oder \t sind jeweils nur ein Zeichen. Der \ bedeutet nur, dass das folgende Zeichen ein Steuerzeichen ist. Deshalb wird er nicht mitgezählt!)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2007
    Beiträge
    10
    ganz ehrlich aber ich verstehe nicht warum der trotzdem läuft auch wenn cih den fehler drin hab
    tut mir leid fuer die blöden fragen ..
    danke für die antworten und die geduld

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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