- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: LineData() auslesen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    29.07.2005
    Alter
    33
    Beiträge
    128

    LineData() auslesen

    Anzeige

    Praxistest und DIY Projekte
    Hi leute,
    ich habe mich nun etwas weiter vor gewagt in der Programmierung des Asuros und das ist dabei rausgekommen:
    Es sollte eine Methode sein, um die Werte der Phototranistoren des Asuros aus zulesen, es hat soweit alles geklapt, nur habe ich ein paar kleinere Probleme
    Code:
    unsigned int data[2];
    unsigned char s[4] = "thze";
    
    	void PrintCharR(unsigned int x)
    	   {
    		  unsigned char einer, zehner, huni, tausend;
    		  x = data[1];
    		  
    		  einer= x%10;
    		  zehner= (x-einer)%100;
    		  huni= (x-(zehner*10+einer))%1000;
    		  tausend= (x-((huni*100)+(zehner*10)+einer))%10000; 
    				
    		  s[0]=huni+'0';
    		  s[1]=zehner+'0';
    		  s[2]=einer+'0';
    		  s[3]=tausend;
    		  
    		  SerWrite(s,4);
    	   }
    	   
    	void PrintCharL(unsigned int x)
    	   {
    		  unsigned char einer, zehner, huni, tausend;
    		  x = data[0];
    		  
    		  einer=x%10;
    		  zehner=(x-einer)/10;
    		  huni=(x-(zehner*10+einer))/100;
    		  
    		  if((x = 1000) && (x > 1000))
    				tausend= 1;
    		  else
    				tausend= 0;
    				
    		  s[0]=huni+'0';
    		  s[1]=zehner+'0';
    		  s[2]=einer+'0';
    		  s[3]=tausend;
    		  
    		  SerWrite(s,4);
    	   }
    die wären, der asuro übergibt einen nur 3stelligen wert, anstatt einen 4-stelligen!!!

    ich habe verschiedene Methoden versucht, die einzelwerte der "zehner, einer, tausender und hunderter" zu ermitteln, wobei ich auf die gute anleitung von "Radbruch" aus dem Threat: der Threat
    zurückgegriffen habe, nun habe ich das problem das die werte nicht, bzw als Zeichen wirwar, übermittelt werden!

    In meinem Code hab ich bei der funktion des Linken und des Rechten Phototransistors verschiedene möglcihkeiten genommen, wobei die obere Fehleraufweist, kann mir jemand bitte

    Lösungsansätze vorschlagen, bitte keine Komplettlösung, da ich selber auch noch was tuen möchte :P

    thx im vorraus greezZ dr Listner

    EDIT:
    achja, mir ist bewust, dass ich oben nur die Funktionen gepostet habe :P

    aufgerufen habe ich sie mit :
    Code:
    PrintCharL(a);   //bzw
    PrintCharR(a);

  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

    Es ist mir sehr peinlich, aber aus noch nicht erkannten Gründen funktioniert mein Code nicht mehr. Ich hatte das damals mit dem RP6 getestet, keine Ahnung ob es mit dem asuro überhaupt mal funktionierte. Verwende deshalb bitte die Alternative von izaseba:
    Code:
    // PrintChar-Funktion nach izaseba (mit int-Parameter) 
    void PrintChar(unsigned int x) 
       { 
          char ergebnis[]  = {'0','0','0'}; 
         while (x >=100){ 
          ergebnis[0]++; 
          x -=100; 
          } 
          while (x >= 10) { 
          ergebnis[1]++; 
          x -=10; 
          } 
          ergebnis[2] +=x; 
          SerWrite(ergebnis,3); 
       }
    Wenn du als Aufruf PrintChar(data[0]); bzw. PrintChar(data[1]); verwendest, benötigst du nur eine Funktion.

    Die Werte der Liniensensoren sind mit der serienmäßigen LED deutlich kleiner als die Werte der Odometrie, auf keinen Fall also 4-stellig.

    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
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    32
    Beiträge
    239
    hallo listner

    was willst du mit
    Code:
            if((x = 1000) && (x > 1000))
                tausend= 1;
            else
                tausend= 0;
    bezwecken?

    denn mit x = 1000 wird in x der Wert 1000 abgespeichert (zum Vergleichen muss man == verwenden)

    und 2. kann x nicht genau 1000 sein und gleichzeitig größer als 1000
    vl. meintest du if(x >= 1000) (gesprochen: x größer oder gleich 1000)
    bzw. wenn man es aufteilt if( x==1000 || x > 1000 )

    mfg hai1991

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Folgende Variable sollte ein String sein, so wie du das gemacht hast ist das aber kein String, sondern ein einfaches char Feld!
    unsigned char s[4] = "thze";

    Strings werden mit einem Nullterminator beendet, also:
    unsigned char s[5] = "thze\0";

    Folgende Zeilen ergeben auch keinen Sinn, du würfelst da die Stellen wild durcheinander! Bei der Tausenderstelle würde ein '0' auch nicht schaden!
    s[0]=huni+'0';
    s[1]=zehner+'0';
    s[2]=einer+'0';
    s[3]=tausend;
    Grüße,
    Harri

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Achja, was mir noch eingefallen ist:
    Nimm einfach die Funktionen aus der Bibliothek, in dem Fall sprintf:
    int sprintf ( char * str, const char * format, ... );

    Also in der der Art(nicht getestet!):

    Code:
    char temp[10]={0};
    int ldata[2]={0};
    
    LineData(ldata);
    sprintf(temp,"%ld",ldata[0]);
    SerWrite(temp,strlen(temp));
    Grüße,
    Harri

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    probier mal sowas:
    Code:
    unsigned char tausender(int x){
     return x / 1000;
    }
    
    unsigned char hunderter(int x){
     return (x - 1000 * tausender(x)) / 100;
    }
    
    unsigned char zehner(int x){
     return (x - 1000 * tausender(x) - 100 * hunderter(x)) / 10;
    }
    
    unsigned char einer(int x){
     return (x - 1000 * tausender(x) - 100 * hnderter(x) - 10 * zehner(x));
    }
    jetzt müsstest du mit diesen funktionen beliebige stellen finden können.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    29.07.2005
    Alter
    33
    Beiträge
    128
    schön und gut ^^ und thx 4 help, aber warum funktioniert diese methode:
    Code:
    void PrintCharL(unsigned int x)
    	   {
    		  unsigned char einer, zehner, huni, tausend;
    		  x = data[0];
    		  
    		  einer=x%10;
    		  zehner=(x-einer)/10;
    		  huni=(x-(zehner*10+einer))/100;
    		  
    		  if((x == 1000) || (x > 1000))
    				tausend= 1;
    		  else
    				tausend= 0;
    				
    		  s[0]=huni+'0';
    		  s[1]=zehner+'0';
    		  s[2]=einer+'0';
    		  s[3]=tausend+'0';
    		  
    		  SerWrite(s,5);
    	   }


    und diese methode nicht:
    Code:
    void PrintCharR(unsigned int x)
    	   {
    		  unsigned char einer, zehner, huni, tausend;
    		  x = data[1];
    		  
    		  einer= x%10;
    		  zehner= (x-einer)%100;
    		  huni= (x-(zehner*10+einer))%1000;
    		  tausend= (x-((huni*100)+(zehner*10)+einer))%10000; 
    				
    		  s[0]=huni+'0';
    		  s[1]=zehner+'0';
    		  s[2]=einer+'0';
    		  s[3]=tausend+'0';
    		  
    		  SerWrite(s,5);
    	   }

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    du solltest das % einsparen, es braucht extrem viel rechenzeit. evtl läuft dabei der speicher im µC über.

    ausserdem willsz du in einem unsigned char die tausenderstelle speichern, aber ein char geht nur bis 255.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Berechtigungen

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

12V Akku bauen