Hallo
Eine software-SPI-Kommunikation hatte ich dir schon hier gezeigt:
Code:
// RP6 liest optischen Maussensor aus (nur x/y)(Maussensor: ADNS-2051) 22.1.09 mic
#include "RP6RobotBaseLib.h"
#define clk_h DDRC |= 1; PORTC |= 1 // Für Anschluss an SDA/CLK am XBUS
#define clk_l DDRC |= 1; PORTC &= ~1 // clk - Pin 10
// data= Pin 12
#define data_h DDRC |= 2; PORTC |= 2 // Vcc - Pin 3
#define data_l DDRC |= 2; PORTC &= ~2 // GND - Pin 1
#define data_z DDRC &= ~2; PORTC &= ~2
#define data_in (PINC & 2)
/*
#define clk_h DDRA |= 1; PORTA |= 1 // Für Anschluss an ADC0/1
#define clk_l DDRA |= 1; PORTA &= ~1 // clk - ADC0
// data- ADC1
#define data_h DDRA |= 2; PORTA |= 2
#define data_l DDRA |= 2; PORTA &= ~2
#define data_z DDRA &= ~2; PORTA &= ~2
#define data_in (PINA & 2)
*/
void init( void)
{
data_z; // Datenpin auf Eingang ohne Pullup (Status Z)
clk_h; // Dummyclockimpuls erzeugen
sleep(5);
clk_l; // Maus wartet nun bis zum Timeot auf den nächsten Takt
mSleep(2000); // timeout adnr2051 erzwingen => reset
}
void write_data(uint16_t data)
{
uint8_t bit=16;
while(bit--)
{
if(data & (1<<bit)) {data_h;} else {data_l;} // {}-Klammern sind hier muss!
sleep(5);
clk_h; // Datenbit für Maus steht bereit
sleep(5); // Maus liest Datenbit
clk_l;
sleep(5);
}
data_z;
sleep(20);
}
uint8_t read_data(uint8_t adr)
{
uint8_t bit, data;
bit=8;
while(bit--)
{
if(adr & (1<<bit)) {data_h;} else {data_l;} // Datenbit ausgeben
sleep(5); // warten bis Pegel stabil
clk_h; // Maus darf Daten lesen
sleep(5); // warten bis Maus gelesen hat
clk_l; // Bit fertig
sleep(5);
}
clk_l;
data_z;
sleep(20);
bit=8;
data=0;
while(bit--)
{
clk_h;
sleep(5); // Bit anforden und warten bis Pegel stabil
if(data_in) {data |= (1<<bit);} // Bit einlesen
clk_l; // Bit gelesen
sleep(5);
}
sleep(20);
return(data);
}
int main(void)
{
uint8_t status;
initRobotBase();
init();
writeString_P("Produkt-ID: ");
writeInteger(read_data(0), 16);
writeString_P("\n\n\r");
while(1)
{
status=read_data(2);
if(status & 128) // Bewegung erkannt?
{
writeString_P("Status: "); // wenn Bit7 gesetzt ist
writeInteger(status, 16);
writeString_P(" x: ");
writeInteger(read_data(3), 10); // können die eingefrorenen Deltawerte
writeString_P(" y: "); // für x und y ausgelesen werden.
writeInteger(read_data(4), 10);
writeString_P("\n\r");
}
sleep(255);
}
return(0);
}
(Aus https://www.roboternetz.de/phpBB2/ze...=421130#421130)
Mit write_data() sendet man einen 16bit-Wert, Bit15-8 sind die Schreibadresse, Bit15 muss bei einem Kommando zusätzlich gesetzt sein. Bit7-0 ist das Datenbyte. Mit read_data() wird ein Wert von einer Adresse gelesen.
Wenn der Takt low ist werden die jeweiligen Daten bereitgestellt, mit einem high auf dem Takt werden sie gelesen.
Gruß
mic
Lesezeichen