-         

Ergebnis 1 bis 8 von 8

Thema: Programm für spezifische LineData Werte

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25

    Programm für spezifische LineData Werte

    Anzeige

    Hallo, da bin ich mal wieder
    Bin grad dabei ein Programm zu schreiben mit dem man die Werte der Dioden T9 und T10 (die zwei vorne neben der roten LED mit der Hell/Dunkel gemessen wird) über die IR Schnittstelle bekommt. Das ganze sagt sich aber leichter als dass es tatsächlich ist insbesondere wenn man keine große Erfahrung in Sachen Programmieren hat. Hier mal mein erster Versuch mit sicherlich noch vielen Fehlern. Vieleicht kann mal jemand drüberschaun und das ganze korrigieren/erweitern/verbessern.

    Code:
    #include "asuro.h"
    #include <stdlib.h>
     
     
    int main(void)
    
    {
    	
    		Init();
    		
    		unsigned int data[2];
    		int i;
    		int T9;
    		int T10;
    		char zeichenkettenT9[4];
    		char zeichenkettenT10[4];
    	
    	while(1)
    	{	
    		
    		{
    		for(i=0; i<5000; i++)
    		Sleep(72);
    		}
    		
    		LineData(data);
    		
    		data[0]=T9;		
    		itoa(T9, zeichenkettenT9, 4);
    		
    		data[1]=T10;
    		itoa(T10, zeichenkettenT10, 4);
    
    	SerWrite("T9: %s"/n,zeichenkettenT9, 4); {Sleep(216);}
    	SerWrite("T10: %s"/n/n,zeichenkettenT10 4); {Sleep(216);}
    	}
    }
    Zu guter letzt dann noch die Fehler

    test.c:34: error: 'n' undeclared (first use in this function)
    test.c:34: error: (Each undeclared identifier is reported only once
    test.c:34: error: for each function it appears in.)
    test.c:34: warning: passing argument 2 of 'SerWrite' makes integer from pointer without a cast
    test.c:34: error: too many arguments to function 'SerWrite'
    test.c:35: error: expected ')' before numeric constant
    test.c:35: warning: passing argument 2 of 'SerWrite' makes integer from pointer without a cast


    Die Fehler beziehen sich hauptsächlich auf die Zeilen 34/35, das sind die mit SerWrite was auch logisch ist da ich mit dieser Funktion noch nie gearbeitet habe. ...Aber irgentwann ist immer das erste mal...

    Dann steht da auch noch diese Zeile:

    c:/winavr-20090313/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."


    Weiß jemand was es damit auf sich hat?

    Fragen über Fragen und hoffentlich Antworten über Antworen
    grüße Ollowain

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    26.10.2005
    Ort
    Eberswalde
    Alter
    37
    Beiträge
    15
    Hallo,

    an dem gleichen Problem saß ich gestern auch.
    Code:
    #include "asuro.h"
    int main(void)
    {
    	unsigned int data[2];
    
    	Init();
    	FrontLED(ON);
    
    	while(1)
    	{
    		LineData(data);
    		SerPrint("T9: ");
    		PrintInt(data[0]);
    		SerPrint("\r\nT10: ");
    		PrintInt(data[1]);
    		SerPrint("\r\n");
    		SerPrint("\r\n");
    		Msleep(1000);
    	}
    	return 0;
    }
    MfG ello
    Rechtschreib- und Tippfehler sind kein geistiges Eigentum und dürfen frei kopiert und verändert werden.
    http://frankh.h3u.de/gentoo.jpg

  3. #3
    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

    Mit der orginalen CD-Library könnte das so funktionieren:
    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    
    int main(void)
    
    {
    
          Init();
    
          unsigned int data[2];
          int i;
          int T9;
          int T10;
          char zeichenkettenT9[4];
          char zeichenkettenT10[4];
    
       while(1)
       {
    
          {
          for(i=0; i<5000; i++)
          Sleep(72);
          }
    
          LineData(data);
    
          T9=data[0];
          itoa(T9, zeichenkettenT9, 4);
    
          T10=data[1];
          itoa(T10, zeichenkettenT10, 4);
    
       	SerWrite("T9: ", 4);
    		SerWrite(zeichenkettenT9, 4);
    		SerWrite("/n/r", 2);
    		Sleep(216);
       	SerWrite("T10: ", 5);
    		SerWrite(zeichenkettenT10, 4);
    		SerWrite("/n/r", 2);
    		Sleep(216);
       }
    }
    Ich habe es nicht getestet, möglicherweise gibt es noch ein Problem mit der Endekennung der zeichenketten-Strings. FrontLED ist mit Absicht noch nicht eingeschaltet. (SerPrint erfordert die aktuelle Lib die ich für Einsteiger nicht empfehlen möchte)

    Die Datei signal.h ist veraltet, man sollte besser interrupt.h verwenden. Das kann man in asuro.h ändern:
    Code:
    #ifndef ASURO_H
    #define ASURO_H
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    //#include <avr/signal.h>
    #include <stdlib.h>
    Die Library des asuro, sie ist die Verbindung zwischen dem Programm und der Hardware (asuro.c und asuro.h), verwendet den C-Kompiler GCC. WinAVR und AVR-GCC sind eine Sammlung von verschiedenen Dateien die den Zugriff auf die AVR-Kontroller ermöglichen (im asuro steckt ein ATMega8 von AVR). Diese Dateien werden laufend verbessert und geändert. Weil die Library des asuro auch diese Dateien verwendet weist der Kompiler (GCC) darauf hín, dass die Datei signal.h inzwischen durch die Datei interrupt.h ersetzt wurde. Beide Dateien steuern die Zugriffe auf die Interrupts, die beim asuro z.b. für die Motor-PWM, das IR-Trägersignal und die Sleep()-Funktion zuständig sind. (btw kann ein Update von GCC unerwartete Effekte verursachen, ist aber gelegentlich bei Wechsel des Betriebssystems nötig)

    Gruß

    mic

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

  4. #4
    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

    "Nicht getestet" bedeutet bei mir lediglich, dass ich das Programm nicht auf meinen asuro geflasht habe. Selbstverständlich konnte ich es fehler- und warnungsfrei kompilieren.

    Versuche mal diese Version, die Zeichenketten sind länger und die Zahlenbasis von itoa (integer to ascii) sind geändert:
    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    
    int main(void)
    
    {
    
          Init();
    
          unsigned int data[2];
          int i;
          int T9;
          int T10;
          char zeichenkettenT9[5] ="     "; // Strings mit Leerzeichen vorbelegen
          char zeichenkettenT10[5]="     ";
    
       while(1)
       {
    
          {
          for(i=0; i<5000; i++)
          Sleep(72);
          }
    
          LineData(data);
    
          T9=data[0]; // Wert von unsigned data[0] nach signed T9 kopieren
          itoa(T9, zeichenkettenT9, 10); // letzter Parameter ist die Zahlenbasis
    
          T10=data[1];
          itoa(T10, zeichenkettenT10, 10);
    
       	SerWrite("T9: ",4);
    		SerWrite(zeichenkettenT9, 4);
    		SerWrite("/n/r", 2);
    		Sleep(216);
       	SerWrite("T10: ",5);
    		SerWrite(zeichenkettenT10, 4);
    		SerWrite("/n/n/r", 3);
    		Sleep(216);
       }
    }
    Hyperterminal sagt alle fünf sekunden:

    -- ASURO Testing --
    Line Test
    Diese Ausgabe stammt noch aus dem Selbsttest. Entweder hat das Flashen nicht funktioniert oder du hast eine leere Hex-Datei geflasht. Das passiert z.B. wenn man im Notepad vor dem Kompilieren nicht speichert.

    Gruß

    mic

    [Edit]
    Ollowain hat seinen Beitrag wohl wieder zurückgezogen

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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    Ja ich hab meinen Beitrag zurückgezogen weils nachdem ich es nochmal geflashed hab dann doch funktioniert hat. (Hatte noch die falsche .hex Datei oben im Tool eingetragen). Auf jeden fall hab ich jetzt schon ettliche hundert werte ausgelesen . Hier das Ergebnis meiner Messungen:
    (Dabei habe ich ihn zuerst in die Mitte gestellt und danach auf beide Seiten etwas hinaus geschoben.)

    Etwas links daneben: 3100 // 1100
    Genau in der Mitte: 2300 // 1300
    Etwas rechts daneben: 2100 // 2100

    Was sofort auffällt ist dass die werte des linken und rechten Fotortransistors im "Normalzustand"um 1000 abweichen. Verschiebt man den Asuro ändert sich daran nichts, d.h. es geht um 1000 rauf bzw. um 1000 runter.

    Woran könnte dieser Unterschied liegen?
    Hab bereits die Fototransistoren auf exakte Ausrichtung überprüft und außerdem beide Vorwiderstände gemessen. Soweit alles in bester Ordnung. Außerdem hat mein Asuro eine Abschirmung vorne unten, d.h. Fremdlicht kann auch nicht der Grund dafür sein.

  6. #6
    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,

    schön, dass es schon funktioniert. Allerdings sind deine Werte viel zu hoch und eigentlich unmöglich! Der 10bit-ADC kann maximal Werte bis 1023 erfassen.

    Ich vermute, du verwendest itoa immer noch mit der Zahlenbasis 4 (keine Ziffer deiner Werte ist größer als 3!). Ein "normaler" asuro sollte, vor allem mit Abschirmung und ausgeschalteter FrontLED, auf Werte im einstelligen Bereich (<10) kommen. Irgendwas ist da oberfaul. Versuche mal meine zweite Programmvariante (ich hoffe, die verwendest du noch nicht).

    Aussagekräftigere Werte erhält man, wenn man den asuro auf eine schwarze oder eine weise Fläche stellt. Danach erst kann man ihn in die Mitte von etwas oder etwas daneben von etwas stellen.

    Wenn du deine Werte im Terminal mit der Maus markierst und kopierst kannst du sie uns in einer Code-Box zeigen.

    Gruß

    mic

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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    Alles nur beispielwerte hab natürlich noch ettliche mehr aber das ist so der Durchschnitt:

    Alles Weiß:T9: 243/nT10: 155/n/
    Alles Schwarz: T9: 54/nT10: 34/n/
    Linie in der Mitte: T9: 190/nT10: 122/n/
    Asuro nach links versetzt: T9: 217/nT10: 83/n/
    Asuro nach rechts versetzt: T9: 123/nT10: 142/n/

    Prozentual ähnlich wie vorher also T9 immer noch deutlich größer als T10

    /n funktioniert übrigens nicht, d.h. im HyperTerminal wird alles hintereinander geschrieben ist aber nicht weiter schlimm.
    Kleiner Ausschnitt:
    Code:
    T9: 71/nT10: 36/n/T9: 71/nT10: 36/n/T9: 71/nT10: 34/n/TNÀrQ1°z 102/nùT8: 213/nT1
    0: 95/n/T9: 200/nT10: 128/n/T9: 200/nT10: 128/n/T9: 141/nT10: 155/n/T9: 144/nT10
    : 156/n/T9: 144/nT10: 156/n/T9: 226/nT10: 102/n/T9: 226/nT10: 93/n/T9: 226/nT10:
     93/n/T9: 252/nT10: 168/n/T9: 254/nT10: 169/n/T9: 254/nT10: 169/n/T9: 254/nT10:
    169/n/T9: 252/nT10: 168/n/T9: 252/nT10: 168/n/T9: 203/nT10: 113/n/zûö¸:°3»¶¿ /þå
    ïþûTu0» 1?¿„Íý~90; ^€ûT1pÐÉ/T9: 198/nT10: 124/n/1¸~11»³ T9: 199/nT10: 122/n/T9:
     196/nT10: 119/n/T9: 196/nT10: 120/n/T9: 209/nT10: 101/n/T9: 220/nT10: 90/n/T9:
    220/nT10: 87/n/T9: 220/nT10: 87/n/T9: 215/nT10: 87/n/T9: 215/nT10: 87/n/T9: 192/
    nT10: 124/n/Ýé†Ïn7ì~ßÜû Ÿ²^ òù~9}ßîrí þ ùçÍ··èï?T9: 197/nT10: 120/n/T9: 198/nT1
    0: 119/n/T9: 133/nT10: 152/n/T9: 132/nT10: 149/n/T9: 133/nT10: 150/n/T9: 243/nT1
    0: 167/n/T9: 243/nT10: 167/n/  þ      ý      ÷        T9: 54/nT10: 31/n/9: 54/nT
    10: 32/n/T8: 195/nT10: 124/n/T9:

  8. #8
    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

    Jaja, /n, und übrigends auch /r, funktionieren nicht, weil es nicht der Schrägstrich sondern der Backslash sein sollte:
    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    
    int main(void)
    
    {
    
          Init();
    
          unsigned int data[2];
          int i;
          int T9;
          int T10;
          char zeichenkettenT9[5] ="     "; // Strings mit Leerzeichen vorbelegen
          char zeichenkettenT10[5]="     ";
    
       while(1)
       {
    
          {
          for(i=0; i<5000; i++)
          Sleep(72);
          }
    
          LineData(data);
    
          T9=data[0]; // Wert von unsigned data[0] nach signed T9 kopieren
          itoa(T9, zeichenkettenT9, 10); // letzter Parameter ist die Zahlenbasis!
    
          T10=data[1];
          itoa(T10, zeichenkettenT10, 10);
    
       	SerWrite("T9: ",4);
    		SerWrite(zeichenkettenT9, 4);
    		SerWrite("\n\r", 2);
    		Sleep(216);
       	SerWrite("T10: ",5);
    		SerWrite(zeichenkettenT10, 4);
    		SerWrite("\n\n\r", 3);
    		Sleep(216);
       }
    }
    Die Werte erscheinen mir zwar immer noch zu hoch, die Unterschiede könnte man viellecht durch vorsichtiges verbiegen der Led/IR-Transistoren korrigieren.

    Gruß

    mic

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

Berechtigungen

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