-         
Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 46

Thema: Code aus dem Band I für US funktioniert nicht mit neuer Lib

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    62
    Beiträge
    674

    Code aus dem Band I für US funktioniert nicht mit neuer Lib

    Anzeige

    Ich habe auf einen meiner ASUROs nun die US-Erweiterung aufgesteckt. Der Code aus dem Buch Mehr Spaß mit ASURO Band 1 funktioniert aber nicht. Auch die Suche im Forum nach einem Code für die neue Lib war nicht erfolgreich. Könnte bitte jemand einen funktionierenden Code posten, damit ich testen kann, ob die Hardware in Ordnung ist.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Der Code im Buch ist auf der Counter-Variablen count72kHz aufgebaut.
    Wenn du nur den Variablennamen geändert hast, dann stimmt das Timing nicht mehr, da in der neuen Lib der Zähler count36kHz ja nur noch halb so schnell hochgezählt wird.
    Somit wird dann mit der Formel aus dem Buch auch der Registerwert OCR2 nicht mehr sinnvoll berechnet.

    Falls du das schon gemacht hast, poste doch mal bitte deinen Code, denn sonst sind keine weiteren Differenzen vorhanden zwischen Asuro-Buch-Lib und der hier benutzten 'neuen Lib'.
    Lieber Asuro programieren als arbeiten gehen.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    62
    Beiträge
    674
    Code:
    #include "asuro.h"
    
    void LocalInit(void)
    {
    	// Change Oscillator-frequency of Timer 2
    	// to 40kHz, no toggling of IO-pin:
    	TCCR2  = (1 << WGM21) | (1 << CS20);
    	OCR2   = 0x64; // 40kHz @8MHz crystal
    	ADCSRA = 0x00; // ADC off 
    	// Analog comparator:
    	ACSR   = 0x02; // Generate interrupt on falling edge
    	ADMUX  = 0x03; // Multiplexer for comparator to // ADC pin 3
    	SFIOR |= (1 << ACME); // Enable muliplexing of comparator
    	DDRD &= ~(1 << 6); // Port D Pin 6 is input!
    }
    
    void Ping(unsigned char length)
    {
    	count36kHz = 0;
    	TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20); // Toggling of IO-Pin on 
    	
    	// generate the Chirp
    	while ( count36kHz*2  < length ) 
    	{
    		OCR2 = 0x64 + length/2 - count36kHz*2;
    	}
    	TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
    	OCR2 = 0x64; // set frequency back to 40kHz
    }
    
    int main(void)
    {
    	int pos, i, posmarker;
    	Init();
    	LocalInit();
    	
    	while(1) 
    	{
    		posmarker = 0;
    		Ping(20);
    		StatusLED(YELLOW);
    		for(pos = 0; pos < 100; pos++) 
    		{
    			Sleep(10);
    			if((ACSR & (1 << ACI)) != 0) 
    			{
    				if(posmarker == 0) { posmarker = pos; }
    			}
    			ACSR |= (1 << ACI);
    		} 
    		
    		if(posmarker>10) 
    		{ 
    			StatusLED(RED);
    			MotorDir(FWD, FWD);
    			MotorSpeed(200, 200);
    		}
    		else 
    		{
    			StatusLED(GREEN);
    			MotorDir(FWD, RWD);
    			MotorSpeed(0, 200);
    			for(i = 0; i<100; i++) 
    			{ Sleep(200); }
    		}
    	}
    	return 0;
    }
    Es tut sich nichts. Die Status-LED ist grün. Fertig.
    Die Hardware habe ich an Sender/Empfänger mit dem Oszi gecheckt. Am Sender stabil 40 kHz (4V) und am Sender kommt ein Sinussignal im 10 mV Bereich an und reagiert auf Hindernisse.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    Zitat Zitat von sternzthaler
    denn sonst sind keine weiteren Differenzen vorhanden zwischen Asuro-Buch-Lib und der hier benutzten 'neuen Lib'.
    Das stimt nicht ganz, es wird auch ein anderer Interrupt verwendet.

    @ehenkes: Hast du den Code aus der Asuro Lib 3.0 schon mal probiert. Der sollte auch mit der Lib V2.7 funktionieren.
    http://svn.gna.org/viewcvs/*checkout...sonic.c?rev=10

    Es muß allerdings noch folgende Zeile aus der ISR(TIMER2_COMP_vect) Funktion entfernt werden, damit es funktioniert.
    Code:
    TCNT2 += 0x25;

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    62
    Beiträge
    674
    Also ich habe jetzt folgendes gemacht:
    1) die Funktionen

    /**************** Ultraschall asuro.c **************************/
    void InitUltrasonics(void);
    void RestoreAsuro(void);
    int Chirp(void);
    /* ----------- END ------------ */

    in asuro.h deklariert und in asuro.c implementiert

    2) Diese Funktion ist nun in asuro.c

    ISR(TIMER2_COMP_vect)
    {
    //TCNT2 += 0x25;
    count36kHz++;
    if(!count36kHz) timebase++;
    }

    3) Folgender Code als Test:

    Code:
    #include "asuro.h"
    int abstand=0;
    
    int main(void)
    {
      Init();
      SerWrite("\r\n  --- ultrasonic test ---",29);
      Msleep(1000);
      
      do
      {
        abstand=Chirp();
        SerWrite("\r\n distanz in cm: ",20);
        Msleep(500);
        PrintInt(abstand);
      }
      while(1);
      return 0;
    }
    Ergebnis sieht interessant aus!!!

    distanz in cm: 2
    distanz in cm: 3
    distanz in cm: 5
    distanz in cm: 10
    distanz in cm: 5
    distanz in cm: 0
    distanz in cm: 0
    distanz in cm: 1
    distanz in cm: 1
    distanz in cm: 3
    distanz in cm: 8
    distanz in cm: 1
    distanz in cm: 1
    distanz in cm: 4
    distanz in cm: 198
    distanz in cm: 208
    distanz in cm: 2
    distanz in cm: 1
    distanz in cm: 1
    distanz in cm: 1
    distanz in cm: 1
    distanz in cm: 195
    distanz in cm: 195

    4) Als nächstes folgenden Code getestet:
    Code:
    #include "asuro.h"
    
    void LocalInit(void)
    {
    	// Change Oscillator-frequency of Timer 2
    	// to 40kHz, no toggling of IO-pin:
    	TCCR2 = (1 << WGM21) | (1 << CS20);
    	OCR2 = 0x64; // 40kHz @8MHz crystal
    	ADCSRA = 0x00; // ADC off // Analog comparator:
    	ACSR = 0x02; // Generate interrupt on falling edge
    	ADMUX = 0x03; // Multiplexer for comparator to // ADC pin 3
    	SFIOR |= (1 << ACME); // Enable muliplexing of comparator
    	DDRD &= ~(1 << 6); // Port D Pin 6 is input!
    }
    
    void Ping(unsigned char length)
    {
    	count36kHz = 0;
    	TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
    	// Toggling of IO-Pin on // generate the Chirp
    	while((count36kHz*2) < length) 
    	{
    		OCR2 = 0x64 + length / 2 - count36kHz*2;
    	}
    	TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
    	OCR2 = 0x64; // set frequency to 40kHz
    }
    
    int main(void)
    {
    	int pos, i;
    	int posmarker;
    	Init();
    	LocalInit();
    	while(TRUE) 
    	{
    		posmarker = 0;
    		Ping(20);
    		for(pos = 0; pos < 100; pos++) 
    		{
    			Sleep(10);
    			if((ACSR & (1 << ACI)) != 0) 
    			{
    				if(posmarker == 0) { posmarker = pos; }
    			}
    			ACSR |= (1 << ACI);
    		} 
    		
    		if(posmarker>10) 
    		{ 
    			StatusLED(GREEN);
    			MotorDir(FWD, FWD);
    			MotorSpeed(200, 200);
    		}
    		else 
    		{
    			StatusLED(RED);
    			MotorDir(FWD, RWD);
    			MotorSpeed(0, 200);
    			for(i = 0; i<100; i++) 
    			{ Sleep(200); }
    		}
    	}
    	return 0;
    }
    Nichts funktioniert, nur grünes Licht.

    Frage:
    Hier könnte man doch abstand=Chirp(...) verwenden. Kann bitte mal jemand den Code aus dem Band 1 umschreiben? Ich stehe noch etwas auf dem Schlauch.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    62
    Beiträge
    674
    Quatsch, ist prinzipiell ganz einfach:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
      int abstand=0;
      Init();
      while(TRUE)
      {
        abstand=Chirp();
    	if(abstand>10) 
    	{ 
    		StatusLED(GREEN);
    		MotorDir(FWD, FWD);
    		MotorSpeed(150, 150);
    	}
    	else 
    	{
    		StatusLED(RED);
    		MotorDir(FWD, RWD);
    		MotorSpeed(0, 150);
    		Msleep(3); 
    	}
      }
      return 0;
    }
    Hat das jemand schon optimiert?

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Zitat Zitat von m.a.r.v.i.n
    Das stimt nicht ganz, es wird auch ein anderer Interrupt verwendet.
    Oh ja, Sleep() ändert sich ja auch.
    Wenn nun in der "for (pos=0; pos<100; pos++)"-Schleife der Wert bei Sleep(10) auf 5 reduziert wird, dann sollte es aber doch wieder passen?

    Muss dann aber nicht auch die 20 im Ping()-Aufruf halbiert werden?
    Lieber Asuro programieren als arbeiten gehen.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    62
    Beiträge
    674
    Ping(...) und Sleep(...)? Den Code brauche ich nicht mehr.
    Er funktioniert auch nicht. Ich habe nun die besseren Funktionen int abstand = Chirp(...) und Msleep(...). Zur Hardware: Auf welchen Widerstandswert sollte man den Rückkopplungstrimmer einstellen?

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    62
    Beiträge
    674
    Welche Funktionen sind nach Anwendung von Chirp(...) deaktiviert? Geht z.B. Go(...) und Turn(...) - sprich die Encoder?

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    32
    Beiträge
    3.962
    nach cirp ist nix deaktiviert glaube ich, sondern nur nach der ultraschall-init-funktion. alles lässt sich aber mit restoreasuro() wieder richten.
    kleinschreibung ist cool!

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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