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
Lesezeichen