bei einem test ohne den ADNS chip, leuchtete die LED mit voller intensität.
der ADNS "kontrolliert" ja diese LED
http://cp.literature.agilent.com/lit...989-3421EN.pdf
Funktioniert das board denn sonst?
hi ho...
also...wir haben ein board gebastelt. darauf befinden sich der ADNS 3060, ein mikrocontroller 89c4051 und ein MAX 232 zur seriellen kommunikation mit dem PC.
wenn wir das board jetzt in betrieb nehmen, dann leuchtet die LED, welche an dem ADNS angeschlossen ist, nur recht schwach. bei einem test ohne den ADNS chip, leuchtete die LED mit voller intensität.
der ADNS "kontrolliert" ja diese LED. in seinen registern kann man dieses an und abstellen. laut datenblatt, ist der ADNS so voreingestellt, daß die LED dauerhaft leuchtet.
demnach müsste die LED nach "anschalten" des boards hell leuchten. evtl. muss man bei dem ADNS auch erst einen reset durchführen...wie mache ich das ? die LED wurde nach schaltplan im datenblatt von agilent angeschlossen.
vielleicht hat da ja schon jemand erfahrungen sammeln können.
schonmal danke im voraus !
mfg
bei einem test ohne den ADNS chip, leuchtete die LED mit voller intensität.
der ADNS "kontrolliert" ja diese LED
http://cp.literature.agilent.com/lit...989-3421EN.pdf
Funktioniert das board denn sonst?
Es handelt sich bei dem eigentlich um genau die Schaltung aus dem Datenblatt, nur eben mit einem 89c2051, der an 3,3V Betrieben wird und einem zusätzlichen max232.
Die LED wird ja über einen MosFET geschaltet. Bevohr ich den IC aufgelötet hatte habe ich das Bord mal an Spannung gelegt um zu prüfen ob auch alles richtig arbeitet, dabei hat die LED voll geleuchtet, weil der MosFET ja nicht auf Masse gezogen wurde.
Soweit funz alles, ich bekomme bloß kein Lebenszeichen vom ADNS.
Mus man erst irgendeinen Reset durchführen? Ich werd aus dem Datenblatt net so ganz schlau...
mfg
hi ho...
wir haben immer noch probleme den ADNS 3060 anzusprechen.
bei einem versuch aus dem register 0x00 zu lesen (product-id) bekamen wir keine antwort bzw. nur nullen zurück.
hier erstmal unser quellcode:
wir sind uns aber auch noch nicht im klaren darüber, ob der ADNS überhaupt einen richtigen reset bekommt, da die LED durchgehend nur schwach leuchtet.Code:#include<reg51.h> // Port 1 sbit NPD = 0x92; sbit Reset = 0x93; sbit MOSI = 0x94; sbit SCLK = 0x95; sbit MISO = 0x96; sbit NCS = 0x97; // Port 3 sbit LED = 0xB5; // Variablendekleration unsigned char clock_count, enable; char i; int adresse[8], wert[8]; // Funktionsdeklaration void senden(unsigned char var_adresse, var_wert); void lesen(unsigned char var_adresse); void pause(unsigned char time); void main (void) { //Initialisierung - Register und Timer einstellen SCON = 0x50; //01010000 PCON = 0x80; //10000000 1000 0000 IE = 0x9A; //10011010 Timer0, Timer1, Serial Interrupt TMOD = 0x21; //00100001 Timer1 für Baudrate, Timer0 16bit TH0 = 0xB7; // Interrupt 20,000 ms TL0 = 0xFF; // bzw. f=50 Hz TH1 = 0xFA; // Timer1 HighByte TL1 = 0xFA; // Timer1 LowByte TR0 = 1; // Timer0 starten TR1 = 1; // Timer1 starten // Variablen setzen i = 0; clock_count = 0; // PortPins setzen LED = 1; Reset = 1; SCLK = 1; MOSI = 1; MISO = 1; NCS = 1; NPD = 1; while (1) { } } void timer0(void) interrupt 1 { //interrupt tritt 50x in der Sekunde auf TH0 = 0xB7; // Interrupt 20,000 ms TL0 = 0xFF; // bzw. f=50 Hz if (i==25) { Reset = 0; } if (i == 50) { i = 0; } i = i + 1; } void serial(void) interrupt 4 { if(RI == 1) { switch(SBUF) { case 1: LED = 0; break; case 2: LED = 1; break; case 3: Reset = 1; Reset = 0; break; case 4: senden(138, 89); break; case 5: lesen(0); break; } RI = 0; } } void senden(unsigned char var_adresse, var_wert) { int rest; // 8 Bit Adresse ins Array schreiben adresse[0] = var_adresse%2; // adresse[0] ist Bit0 - LSB rest = (int)var_adresse / 2; adresse[1] = rest%2; rest = (int)rest / 2; adresse[2] = rest%2; rest = (int)rest / 2; adresse[3] = rest%2; rest = (int)rest / 2; adresse[4] = rest%2; rest = (int)rest / 2; adresse[5] = rest%2; rest = (int)rest / 2; adresse[6] = rest%2; adresse[7] = (int)rest / 2; // 8 Bit Wert ins Array schreiben wert[0] = var_wert%2; // wert[0] ist Bit0 - LSB rest = (int)var_wert / 2; wert[1] = rest%2; rest = (int)rest / 2; wert[2] = rest%2; rest = (int)rest / 2; wert[3] = rest%2; rest = (int)rest / 2; wert[4] = rest%2; rest = (int)rest / 2; wert[5] = rest%2; rest = (int)rest / 2; wert[6] = rest%2; wert[7] = (int)rest / 2; // Adresse und Wert an den ADNS senden NCS = 0; SCLK = 0; for(clock_count=8; clock_count>0; clock_count--) // 8 Bit Wert senden { MOSI = adresse[clock_count - 1]; SCLK = 1; SCLK = 0; } for(clock_count=8; clock_count>0; clock_count--) // 8 Bit Wert senden { MOSI = wert[clock_count - 1]; SCLK = 1; SCLK = 0; } } void lesen(unsigned char var_adresse) { int rest; // 8 Bit Adresse ins Array schreiben adresse[0] = var_adresse%2; // adresse[0] ist Bit0 - LSB rest = (int)var_adresse / 2; adresse[1] = rest%2; rest = (int)rest / 2; adresse[2] = rest%2; rest = (int)rest / 2; adresse[3] = rest%2; rest = (int)rest / 2; adresse[4] = rest%2; rest = (int)rest / 2; adresse[5] = rest%2; rest = (int)rest / 2; adresse[6] = rest%2; adresse[7] = (int)rest / 2; // Adresse und Wert an den ADNS senden NCS = 0; pause(5); SCLK = 0; for(clock_count=8; clock_count>0; clock_count--) // 8 Bit Wert senden { MOSI = adresse[clock_count - 1]; pause(5); SCLK = 1; pause(5); SCLK = 0; } pause(5); // Wert an den PC senden for(clock_count=8; clock_count>0; clock_count--) // 8 Bit Wert senden { SCLK = 0; pause(5); SCLK = 1; pause(5); SBUF = MISO; while(TI == 0) { } TI = 0; } } void pause(unsigned char time) // Pausenfunktion; Auflösung von 1 us bei 12 Mhz { unsigned char time_count; for (time_count=0;time_count<time;time_count++) // Aufruf bis hier 4 Takte { } // Bis hier dann 14 Takte; Dann Pro count 16 Takte } // Verlassen der Funktion 2 Takte end;
tips, wie man einen "perfekten" reset durchführt oder wie man daten senden/empfangen kann wären ganz nützlich.
mfg
Moin,
wieso nutzt Du nicht einfach den normalen Hardware-Reset? Ich mein, dafür ist die Leitung ja da. Allerdings funktioniert das ganze auch ohne Reset, d.h. nach Anlegen der Betriebsspannung sollte alles klar sein.
Dass Dir beim Auslesen nicht mal die korrekte Produkt-ID angezeigt wird, klingt merkwürdig.
Bin Deinen Code nicht durchgegangen, weil ich mich nur sehr wenig mit C auskenne. Hast Du die kleinen Stolpersteine beachtet, wie z.B. die Kennzeichnung der Datenrichtung bei der Übergabe der Adresse? Ich bin anfangs ein paar mal daran hängen geblieben.
Gruß, Ruppi
hi ho...
wir habens gestern doch noch zum laufen gebracht.
zuerst haben wir den MOSI pin welcher vom µC zum ADNS geht mit einem pull-up versehen. evtl. ist der jetzt im nachhinein garnicht mehr nötig...müssten wir dann nochmal testen.
nach tauschen des 24mhz quarzes vom ADNS gegen eines mit 12mhz, leuchtete auch aufmal die LED kurz nach dem einschalten mit voller intensität. entweder ist das andere quarz "inne dutten" oder wir haben es falsch angeschlossen...ist ein SMD quarz mit vier anschlüssen.
der reset wird übrigens softwaremäßig durchgeführt. wird dieser weggelassen bleibt die LED wieder dunkel. ohne geht es also nicht.
das lesen der produkt - id hat dann auch wunderbar funktioniert. bilddaten lassen sich nun auch in ein delphi programm einlesen. wobei der erste wert komischerweise immer ein minus davor hat. und etwas langsam ist es auch noch. könnte an dem 12mhz quarz liegen...oder aber einfach an der noch nicht ganz so sauberen programmierung in delphi. da muss also noch dran gefeilt werden.
das nächste problem ist jetzt, die bilddaten in ein image zu schreiben.
jetzt frage ich mich nur, wie ich die 8 bit bilddaten "entschlüsseln" muss. unser erster ansatz war, diese 8 bit irgendwie in eine sechsstellige hex zahl zu wandeln, womit man einem pixel eine farbe zuweisen könnte. 0x000000 bis 0xFFFFFF sind ja graustufen...solange die sprünge 0x111111 entsprechen.
also erstmal wäre es jetzt wie gesagt interessant, wie die empfangenen daten aufgebaut sind und wie man aus einem byte die farbe herausbekommt.
mfg
Steht alles im Datenblatt - das sind keine 8bit, sondern nur 6bit Grauwerte. Das erste Pixel im Bild hat eine Kennzeichnung, ich glaube es war das MSB.
Ich kann das Problem der Bildübertragung nicht ganz verstehen: Ihr bekommt pro Pixel einen Bytewert im Bereich zwischen 0 und 63 durch die V24 geschickt, oder? Jetzt wisst ihr, dass ihr 900 Pixel erwartet. Nach dem vollständigen Empfang bringt ihr das Bild zur Anzeige und fertig! Bei mir ist eine Baudrate von 115200 eingestellt, die Bilddaten empfange ich mit etwa 8 Bildern pro Sekunde.
Übrigens findet ihr noch mehr Info zu diesen Sensoren hier im Sensorforum.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=12579
Der Pullup an MOSI ist übrigens überflüssig.
Gruß, Ruppi
hi ho...
die threads über den ADNS und die wilden mausexperimente kenne ich schon.
habe im datenblatt gestern nix darüber gefunden...naja...2 uhr nachts war vielleicht auch schon etwas spät um ein solches datenblatt in sich "aufzusaugen".
zu beginn eines kompletten bildes ist das 6te bit eines pixelwertes eine "1". die restlichen 6ten bits sind dann immer "0".
also hat das byte bzw. haben die daten die man liest immer nur 6 bit...ok.
das einlesen eines bildes, sprich 900 datensätze dauert bei uns im moment ~5 sekunden. haben wie gesagt ein 12mhz quarz drauf und die software ist nocht nicht perfekt. es sind im moment noch 9600 baud eingestellt.
bei dir waren die 115200 baud doch nur ein schreibfehler oder ?
naja...wir werden uns da heute abend nochmal hinter klemmen.
mfg
Das war kein Schreibfehler... Ich hatte die Software mit Visual Basic geschrieben, dort gibt es ein fertiges Steuerelement für das Ansteuern der V24, allerdings geht das nur bis maximal 115200 Baud. Mein Quarz hat nur 3.68MHz.
Ruppi
hi ho...
hmm...also 6 bit pro pixel können es eigentlich nicht sein. das sind meine ich schon 8 bit. denn nur so ist ein bit immer "1", komischerweise das 7te und nicht das MSB, und das 6te immer "0" außer beim ersten pixel eines bildes.
hab mal nen screenshot von meinem programm gemacht, damit du weißt was ich meine. hier lese ich jedes bit einzeln und packe jeweils 8 in eine reihe.
Bild hier
bit 7 ist hier immer "1" (im datenblatt steht MSB müsste immer "1" sein). bit 6 ist immer "0" nur eben beim ersten pixel nicht. kommt also so schon fast hin...wenn man nun in jede reihe nur 6 bit schreibt, würde es mit dem MSB = "1" etc. ja nimmer passen.
da bit 6 immer 0 ist hat man auch nur einen farbwert von 0 bis 31.
mfg
Lesezeichen