- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Problem mit IR-Schnittstelle

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31

    Problem mit IR-Schnittstelle

    Anzeige

    Praxistest und DIY Projekte
    Hallo da drausen,
    ich wollte ein Testprogramm zur einlesung und anschliessender Uebertragung von Linienverfolgewerten schreiben, doch bei folgendem Programm bekomme ich vom Hyperterminal nur wirre Zeihen(die zum Teil nicht mal auf der Tastatur vorhanden sind!) ausgegeben:

    Code:
    //Linienverfolgungstest
    
    #include "asuro.h"
    
    void Turn (void);
    
    int main (void)
    { 
      //Variablen
      unsigned int data[2];
      unsigned int ldata[100];
      int i,j;
      Init();
      MotorDir(FWD,FWD);
      MotorSpeed(150,150);
      FrontLED(ON);
      j=1;
      while(1){
        //Werte Einlesen
        for(i=1;i<100;i++){
    	  LineData(data);
    	  ldata[j]=data[0];
    	  j++;
    	  ldata[j]=data[1];
    	  j++;
    	};
    	MotorSpeed(0,0);
    	j=1;
    	//Werte Senden
    	for(i=1;i<100;i++){
    	  SerWrite(ldata[j] ,5);
    	  j++;
    	  SerWrite(ldata[j] ,5);
    	  j++;
    	};
      }
      return 0;
    };
    Das bekomme ich aber angezeigt:
    Code:
    SerWrite("ASURO",5);
    der Weissblattest funktioniert auch!
    Bitte helft mir!

    Danke
    Chrissi

  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

    Du mußt die Werte in Zeichenketten umformen:

    Code:
    #include "asuro.h"
    
    // aus: https://www.roboternetz.de/phpBB2/ze...=328394#328394
    void PrintInteger(unsigned int x)
    {
       char ergebnis[5]  = {'0','0','0','0','0'};
       while (x >=10000) { ergebnis[0]++; x -=10000; }
       while (x >= 1000) { ergebnis[1]++; x -= 1000; }
       while (x >=  100) { ergebnis[2]++; x -=  100; }
       while (x >=   10) { ergebnis[3]++; x -=   10; }
       ergebnis[4] +=x;
       SerWrite(ergebnis,5);
    }
    
    int main(void)
    {
       ...
    	for(i=1;i<100;i++){
         PrintInteger((ldata[j]);
         j++;
         PrintInteger((ldata[j]);
         j++;
       };
       ...
    }
    (nicht getestet)

    ldata[100]; bietet nur Speicherplatz für 50 Wertepaare.

    Nach dem Einlesen eines Datenpaares solltest du kurz warten, 100 Werte sind mit 8MHz ruckzuck eingelesen: LineData(data); Sleep(255);

    Nach SerWrite() sollte ein Zeilenvorschub ausgegeben werden sonst wird möglicherweise nichts angezeigt: SerWrite("\n\r", 2);

    Ohne Motoransteuerung kann man den asuro auch von Hand über die Linie schieben.

    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
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Danke, mit deinem code und Sleep(255); funktioniert es!
    Wenn ich aber das einfuege, bleibt er in der for-Schleife fuer Sleep haengen:
    Code:
    for(i=1;i<50;i++){
    	  LineData(data);
    	  ldata[j]=data[0];
    	  j++;
    	  ldata[j]=data[1];
    	  j++;
    	  for(a=1;a<100;a++){Sleep(255);}
    	};
    Und kannst du mir die Funktion PrintInteger erklaehren, die verstehe ich nicht so ganz?

    MFG,
    Chrissi

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

    Die Funktion PrintInteger() macht nichts anderes als einen 16bit-Wert (ohne Beachtung des Vorzeichens) in eine Zeichenkette(=String) mit fünf Zeichen umzuwandeln.

    Zu Beginn wird die Zeichenfolge mit "00000" vorbelegt (16bit-Werte sind maximal 5-stellig und gehen bis 65tausendirgendwas oder 2 hoch 16 minus 1). Dann wird vom Wert (in x) 10000 abgezogen solange der Wert größergleich 10000 ist. Gleichzeitig wird in der Zeichenkette die erste Stelle hochgezählt. Das funktioniert weil die ASCII-Werte der Ziffern aufeinanderfolgend sind. Anschließend werden 1000 abgezogen solange der Wert größergleich 1000 ist und die zweite Ziffer in der Zeichenkette wird hochgezählt. Dasselbe dann nochmal mit 100 und 10, der Rest kann dann einfach zur letzen Ziffer addiert werden. Die Zeichenkette ist nun fertig (mit führenden Nullen) und wird mit SerWrite() zum Terminal gesendet. Fertig.

    Weitere Anmerkungen:
    Der Index des Feldes ldata[] beginnt mit 0 und endet mit 99. Für 50 Wertepaare müßte es deshalb so aussehen:

    j=0;
    for(i=0;i<50;i++){

    Das j kannst du auch sparen:

    ldata[2*i]=data[0];
    ldata[2*i+1]=data[1];

    Oder:

    ldata[i]=data[0];
    ldata[50+i]=data[1];

    Natürlich muß man dann beim Senden den Code entsprechend anpassen....

    Mit der orginalen 72kHz-Library sollte die Sleep()-Schleife

    49*99*255*(1/72000)=17,2 Sekunden verzögern.

    (49 mal i, 99 mal a und 255 mal Sleep)

    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!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Danke, jetzt habe ich die Funktion so ungefähr verstanden.
    Aber ich kapiere nicht, wie du vorhast, die sleep-Schleife in Queltext Umzusetzen!

    Danke
    Chrissi
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Wenn ich aber das einfuege, bleibt er in der for-Schleife fuer Sleep haengen
    Das ist deine Sleep()-Schleife! Sie dauert (mit 72kHz-Lib) eben 17 Sekunden. Vielleicht wartest du nicht lange genug und deutest es als Programmabsturz.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    Achso!
    Ich habe beim testen tatsächlich nur ein paar Sekunden gewartet!
    Da muss man die Anzahl der Schleifendurchläufe senken, es sollte ja nur als kurze Pause zwischen den Messungen dienen!

    Danke für die Hilfe,
    Chrissi
    Der Computer macht immer das, was du ihm sagst, aber nicht immer das, was du willst...

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad