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:

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;
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.

tips, wie man einen "perfekten" reset durchführt oder wie man daten senden/empfangen kann wären ganz nützlich.

mfg