ahojte,
pokusam sa nadviazat komunikaciu medzi HM55B a atmega16.
do kompasu vysielam tieto data:
0b0000 reset
0b1000 zaciatok merania
0b1100 pre zacatie komunikacie
odpoved z modulu ma byt ak je vsetko v poriadku 0b1100 a potom mozem zacat primat suradnice x,y
momentalne som pokrocil nejak ze funkcie reset zaciatok merania a readcommand funguju aspon podla oscilatora, a ostatne momentalne nemam moznost odskusat tak to postnem sem ci by to podla vas mohlo fungovat.
pridavam link na priebehy
parallax.com/Portals/0/Downl … asheet.pdf
[code]#define KOM_PORT PORTB
#define KOM_DDR DDRB
#define KOM_PIN PINB
#define CSB 6
#define SDIO 5
#define SCK 4
void resetcommand()
{
int i;
KOM_PORT &= ~(1<< CSB); //NULUJE CSB
KOM_DDR |= (1 << SDIO); //vystup
for(i=0; i < 4; i++)
{
KOM_PORT &= ~(1 << SDIO); // SDIO = 0
KOM_PORT |= (1 << SCK);
KOM_PORT &= ~(1 << SCK);
}
KOM_DDR &= ~(1 << SDIO);
KOM_PORT |= (1 << CSB);
}
void MeasurementCommand()
{
int i,c=0;
KOM_PORT &= ~(1<< CSB); //NULUJE CSB
KOM_DDR |= (1 << SDIO); //vystup
for(i=0; i < 4; i++)
{
if (c<1)
{
KOM_PORT |= (1 << SDIO); // SDIO = 1
}
else
{
KOM_PORT &= ~(1 << SDIO); // SDIO = 0
}
KOM_PORT |= (1 << SCK);
_delay_us(5);
KOM_PORT &= ~(1 << SCK);
_delay_us(5);
c+=1;
}
KOM_DDR &= ~(1 << SDIO);
KOM_PORT |= (1 << CSB);
}
void readcommand()
{
int i,c=0;
KOM_PORT &= ~(1<< CSB); //NULUJE CSB
KOM_DDR |= (1 << SDIO); //vystup
for(i=0; i < 4; i++)
{
if (c<2)
{
KOM_PORT |= (1 << SDIO); // SDIO = 1
}
else
{
KOM_PORT &= ~(1 << SDIO); // SDIO = 0
}
KOM_PORT |= (1 << SCK);
_delay_us (5);
KOM_PORT &= ~(1 << SCK);
_delay_us (5);
c+=1;
}
KOM_DDR &= ~(1 << SDIO);
KOM_PORT |= (1 << CSB);
}
int citanie_dat(int pocitadlo)
{
int compasdata = 0, i;
KOM_PORT &= ~(1<< CSB);
KOM_DDR &= ~(1<< SDIO);
for(i = pocitadlo; i > 0; i--)
{
KOM_PORT |= (1 << SCK);
if (SDIO == SCK)
{ compasdata = (compasdata << 1) +1;
KOM_PORT &= ~(1 << SCK);
}
else
{ compasdata = (compasdata << 1) +0;
KOM_PORT &= ~(1 << SCK);
}
}
KOM_PORT |= (1 << CSB);
return (compasdata);
}
float vyp_stupnov()
{
int datax = 0, datay = 0, vysledok=0;
float stupne = 0;
MeasurementCommand(); // start signal
_delay_ms (40); // treba cakat 40ms
while(vysledok != 0B1100)
{
readcommand();
vysledok = citanie_dat(4);
}
datax = citanie_dat(11); // nacitanie x
datay = citanie_dat(11); // nacitanie y
stupne = 180 * atan2(-datay, datax);
return (stupne);
}
[/code]
administrator: přejmenováno z “Kompas elektronicky”
administrator: přiloženy externí soubory
HM55BDatasheet.pdf (167 KB)