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







Zitieren

Lesezeichen