-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: Initialisierung eines ADNS 9500

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2009
    Ort
    Giessen
    Beiträge
    7

    Initialisierung eines ADNS 9500

    Anzeige

    Hi zusammen,
    hat von euch schon mal einer einen ADNS 9500 versucht zu initialisieren, da ich so langsam mit meinem Latein am Ende bin...

    Hier erstmal ein paar Infos:
    Programmiere mit AVR Studio4.18

    http://www.avagotech.com/pages/en/na...eam/adns-9500/


    hier mal ein Ausschnitt aus meinem Code:

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include "dataflash.h"
    #include "ADNS.h"
    #include "ADNS_ROM.h"
    
    #include "main.h"
    
    
    
    
    
    
    //***********************************************************************************
    void ADNS_Init(void)
    //***********************************************************************************
    {
    	//PORTB = (1<<PB7)|(1<<PB6)|(1<<PB4)|(1<<PB0);
    //	DDRB = (1<<PB0);
    	//Power UP
    	sbiBF(PORTB, PB0);
    	Delay1us(5);	
    	cbiBF(PORTB, PB0);
    
    
    	Delay1ms(250);
    	Delay1ms(250);
    
    	
    	ADNSWrite(ADNS_POWER_UP_RESET, 0x5A);
    	Delay1ms(50);
    	DF_SPI_RW(0x02);
    
    	DF_SPI_RW(0x03);
    
    	DF_SPI_RW(0x04);
    
    	DF_SPI_RW(0x05);
    
    	DF_SPI_RW(0x06);
    
    	SROM_Download();
    
    	sbiBF(PORTB, PB0);
    	Delay1us (5);
     	cbiBF(PORTB, PB0);
    
    	ADNSWrite(0x20,  0x04);
    	Delay1ms(150);
    	//Configuration des Sensors
    //	ADNSWrite(ADNS_CONFIG_II ,FIXED_FR);	//feste Frame Rate
    //	Delay1us(120);
    
    	//Frame Rate 11.750fps
    //	ADNSWrite(0x1A, 0xC0);		//Lower
    //	Delay1us(120);
    //	ADNSWrite(0x1B, 0x5D);		//Upper
    //	Delay1us(120);
    	
    	sbiBF(PORTB, PB0);
    
    }
    
    
    //************************************************************void SROM_Download(void)
    //************************************************************
    {
        char data;
    	unsigned int i;						//uint16_t i;
    	i=0; 
    	sbiBF(PORTB, PB0);
    //	Delay1us(5);
    	cbiBF(PORTB, PB0);	
    	ADNSWrite(ADNS_CONFIG_IV , SROM_SIZE); 	//= (1 << SROM_SIZE);			//3k SROM download
    //	Delay1us(120);
    	ADNSWrite(ADNS_SROM_ENABLE, 0x1D);		//SROM_ENABLE for initializing
    //	Delay1us(120);
    
    	sbiBF(PORTB, PB0);	
    	Delay1us(5);
    	cbiBF(PORTB, PB0);	
    
    	ADNSWrite(ADNS_SROM_ENABLE, 0x18);		//Start SROM downloading
    //	Delay1us(120);
    
    	sbiBF(PORTB, PB0);	
    	Delay1us(5);
    	cbiBF(PORTB, PB0);	
    
    	DF_SPI_RW(0x62);				//Adress of ADNS_LOAD_BURST
    	Delay1us(15);
    	
    
    	for (i=0; i<3070; i++)				//3070 Größe des SROM_Files
    	{
    		data = pgm_read_byte(&ADNS_Rom[i]);	//SROM File aus Flash lesen
    		DF_SPI_RW(data);			//in Motion Burst Register schreiben
    		Delay1us(15);
    	}
    
    	sbiBF(PORTB, PB0);	
    	Delay1us(5);
    	cbiBF(PORTB, PB0);
     	while (!ADNS_SROM_ID)			//Warte bis Rev.Nummer vollständig,
     	{								//dann ist SROM download beendet
     	 asm volatile ("nop"::);
     	}
    
    }
    
    
    //************************************************************unsigned char ADNSRead(unsigned char adr)
    //************************************************************
    {
    	 unsigned char temp;
    
     	DF_SPI_RW(adr);
    	Delay1us(120);
     
    	temp=DF_SPI_RW(0x00);
    	Delay1us(120);
    //	sbiBF(PORTB,PB0);
     	return temp;
    }
    
    
    //************************************************************
    void ADNSWrite(unsigned char adr, unsigned char data)
    //************************************************************
    {
     	DF_SPI_RW(adr|0x80);	//maskieren mit 0x80 da MSB = 1 sein muss
     	Delay1us(100);			//warten zwischen Adress und Data
    	DF_SPI_RW(data);
    	Delay1us(120);
     
    }
    
    
    //************************************************************
    void Delay1ms(unsigned int time)
    //************************************************************
    {
    	while(time--) _delay_ms(1);
    }
    
    
    //************************************************************
    void Delay1us(unsigned int time)
    //************************************************************
    
    {
    	while(time--) _delay_us(1);
    }
    Ach ja in ADNS_ROM.h liegt das ROM File welches ich für den AVR Studio angepasst habe und in dataflash steht eine Funktion zum Übertragen der Daten mittels SPI Schnittstelle.
    Die einzelnen Ports habre ich schon in main eingestellt!

    Weiß leider nich wo mein Fehler liegt.
    Bin für jeden Hinweis dankbar!!!!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    ArchAngel,

    leider kenne ich mich nur mit dem ADNS 2610 aus, aber vielleicht solltest Du folgendes mal ausprobieren: Stell' doch während des Auslesens des Registerinhalts, also nach den 120us Wartezeit, den MOSI-Ausgang vorübergehend auf Eingang um. Der Chip bekommt dann nur noch den Takt (SCLK) aber keine Sendedaten.

    Den Versuch halte ich für lohnend, weil man nicht genau weiss, ob und wie der ADNS 9500 die 0x00 interpretiert, die Du ihm in Deinem Programm beim Auslesen sendest. Eigentlich müsste er sie ignorieren - er braucht ja nur den Takt, um seine Daten über MISO 'rauszuschieben. Aber man weiss ja nie ...

    Ciao,

    mare_crisium

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    6
    Hallo ArchAngel242,

    hast du inzwischen den Sensor auslesen können?

    Ich habe hier auch das Problem, dass ich einen ADNS9500 nicht auslesen kann. Es kommen einfach keine Daten aus dem SPI MOSI raus. Die Ansteuerung (Software auf ARM7 und Hardwareverbindungen) habe ich inzwischen mehrfach geprüft. Mit einem ADNS6530 funktioniert auch alles problemlos, nur der 9500 weigert sich Daten auszugeben.

    Hat jemand eine Idee?

    Gruß nezaya

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2009
    Ort
    Giessen
    Beiträge
    7
    Hi nezaya,
    ne habe es noch nicht ganz hin bekommen. Nähere mich aber so langsam dem Problem.
    Schau doch erstmal ob du den ADNS 9500 richtig initialisierst. Ich hatte da schon das Problem mit dem Download des SROM Files.
    Ganz wichtig scheinen auch die einzelnen Befehls und Zeitabfolgen für die einzelnen Modies, wie z.B. Frame Capture und Motion Burst.
    Ach ja und nicht zu vergessen die NCS Leitung!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    6
    Also die Initialisierung mache ich wie im Datenblatt beschrieben.

    1. Spannung an (3,3V)
    2. SPI Port Reset mit high auf NCS
    3. 0x5a in PowerUpRegister (0x3a)
    4. >50 ms warten
    5. Register 0x02 bis 0x06 lesen.

    Allerdings kommt beim Lesen der Register schon keine brauchbare Ausgabe raus. Ein testweises Auslesen der Register ProductID und RevisionID liefert ebanfalls keine brauchbaren Werte. Und das sollte ja sogar ohne Initialisierung klappen. Im Datenblatt ist ja extra vermerkt, dass die Register zum testen der SPI Verbindung genutzt werden können. Da die SPI Kommunikation nicht funktioniert habe ich auch noch nicht versucht den (optionalen) Firmwareupload zu starten. Mit einem ADNS-6530 Sensor der zuvor verwendet wurde klappt die SPI Übertragung, irgendwo schieint da wohl noch ein Unterschied zu sein, den ich noch nicht gefunden habe.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2009
    Ort
    Giessen
    Beiträge
    7
    Also zu 2.SPI Port Reset :
    Ich lösche immer dieses Bit da es ja low activ ist!
    Der ADNS ist bei mir als Slave und generiert auch somit kein Takt Signal.

    Ich verstehe nur nich weswegen du nach Schritt 5 aufhörst, denn laut meinem Datenblatt folgen noch 2 Schritte.

    Soweit ich das verstanden hab sollte man immer nach einem Power Up die Initialisierung durch führen.
    Das SRom File am besten in einem Array abspeichen um so es einfach übertragen zu können....

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    6
    >Ich verstehe nur nich weswegen du nach Schritt 5 aufhörst, denn laut meinem Datenblatt folgen noch 2 Schritte.

    Naja ich kann auch alle Schritte machen, ändert aber nichts. Nötig ist es auch nicht, da der SROM-Download optional ist. Ohne Download läuft das Ding mit der vorgebrannten internen Firmware. Selbst nach kompletter Initialisierung gibt es immer noch kein vernünftiges Signal auf dem MISO. Dabei sollte das prinzipiell auch ganz uninitialisiert schon per SPI antworten. Ohne Signal auf dem MISO kann ich auch nicht prüfen ob der Download korrekt war. Entweder sind alle meine Chips kaput, oder ich habe irgendwo nen Denkfehler. Was mich halt irritiert ist, dass ich die ADNS6530 problemlos ansteuern kann, aber der ADNS9500 nicht kommuniziert. Der ADNS6530 hat zwar kürzere Timingzeiten, aber die habe ich extra für den ADNS9500 verlängert und inzwischen sogar mit ausreichend Reserve versehen.

    Könntest du, wenn deine Ansteuerung funktioniert, mal den Code zur Verfügung stellen. Dann könnte ich mal schnell einen AVR nehmen und nachschauen, ob es am Code oder an den Chips liegt.

    Vielleicht bekomme ich ja auch noch einen Lösungsvorschlag vom Avago Support.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    6
    Hallo ArchAngel242,

    ich muss noch mal nachfragen. Hast du es inzwischen geschafft, den ADNS-9500 Sensor anzusteuern? Ich kann zwar inzwischen Register korrekt auslesen und auch Schreiben, aber irgendwie funktioniert der Sensor immer noch nicht. Upload der Firmware ist OK. Im SROM_ID Register kann ich zumindest die 145 (0x91) auslesen, was auch die ID der hochgeladenen Firmware ist.

    Nach dem Upload setze ich wie gefordert das "Laser_Forced_Disable bit" auf 0. Allerdings ist die Ausgabe des Motion Registers 0x00. Das LP_Valid Bit zeigt also an, dass der Laser aufgrund falscher Registereinstellungen deaktiviert ist. Dummerweise hab ich jetzt keine Ahnung wo ich das beheben kann, da es ja keine Register gibt, in der ich die "Laser Power register" auf "complementary values" setzen kann. Das einzige Register das ich im Datenblatt des ADNS9500 im Bezug auf den Laser finden kann ist LASER_CTRL0. Das ist allerdings nur zum Aktivieren des Lasers nötig und wird ja auch korrekt geschrieben und hat den Wert 0x00.

    Hättest du, oder irgendwer anders, vielleicht eine Idee?

    Gruß nezaya

  9. #9
    Beim auslesen des Sensors ignoriert dieser den Pegel der MOSI-Leitung.

    Was das löschen des FORCE-DISABLE-Bits in LASER-PWR-CTRL0 angeht: da kann man nicht einfach 0 reinschreiben, da das bit 7 gesetzt bleiben muß. Das steht nur leider nicht so im Datenblatt. Zum einschalten des Lasers also 0x80 ins Register schreiben.

    Nach dem SROM-Download sollte man zunächst mit dem CRC-Test überprüfen, ob alles korrekt angekommen ist. Am bit 6 im Observation-Register kann man auch sehen, ob der Sensor den Code im SROM ausführt.

    Um aber die Bewegungsdaten aus dem Sensor zu bekommen, muß man vorher noch ein paar andere Register beschreiben. Das steht auch nicht so im Datenblatt.
    Ab besten mal das ausprobieren:
    -bis zum SROM-Download wie im Datenblatt
    -0x15 auf 0x13 schreiben (CRC-Test)
    -mindestens 10ms warten
    -0x26 und 0x25 auslesen (müßte 0xBEEF drin stehen)
    -0x2A (SROM-ID) aulesen (nach der neuesten Version 0x91)
    -0x04 auf 0x10 (CONFIGURATION-II) schreiben
    -0x63 auf 0x22 schreiben
    -0x9C auf 0x23 schreiben
    -0x40 auf 0x21 schreiben (dannach steht strotzdem wieder 0x42 im Register)
    -0x80 auf 0x20 schreiben (Laser einschalten)
    -MOTION-register lesen (müßte 0x20 drin stehen)
    -0x55 auf 0x0F schreiben
    -0x55 auf 0x2F schreiben (Auflösung setzen)
    -gewünschten Wert in LIFT-DETECTION-TRUST schreiben
    -0x00 auf 0x11 schreiben

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    6
    Hallo bf,

    bei mir sind standardmäßig (direkt nach dem Start des Sensors) alle Bits im LASER-PWR-CTRL0 Register Null. Damit ist es im Moment egal, ob ich das Register direkt 0x00 schreibe oder nur bit-0 auf Null setze. Ich habe aber inzwischen korrekterweise letztgenannte Variante implementiert. Jetzt wird das Register ausgelesen und Bit-0 des gelesenen Wertes zu Null gesetzt und dann wieder zurückgeschrieben. Das hat auch der Avago Support so empfohlen. Allerdings ist 0x00 wohl nicht der wirklich zu erwartende Startwert des LASER-PWR-CTRL0 Register. Du schreibst ja auch von 0x80. Ich denke der Wert hängt wohl auch von der Versorgungsspannung ab, weshalb es keinen Sinn macht da einen festen Wert reinzuschreiben. Außerdem resetet sich das Register bei jedem Auslesen des Motion-Registers wieder zum Defaultwert (bei mir 0x00), unabhängig was ich zuvor reingeschrieben habe. Mal sehen was der Support von Avago da noch dazu sagt.

    Ich werde aber deine Vorschläge zur erweiterten Startup-Sequenz mal ausprobieren.

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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