- LiTime Speicher und Akkus         
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

    Powerstation Test
    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
    61
    Beiträge
    5.799
    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
    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
    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
    Milda
    Alter
    37
    Beiträge
    4.062
    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).
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    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
    Bild hier  
    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
    Milda
    Alter
    37
    Beiträge
    4.062
    die hab ich nicht gesehn =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  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
    61
    Beiträge
    5.799
    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!)
    Bild hier  
    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
  •  

LiTime Speicher und Akkus