Komunikácia medzi ATmega16 a elektronickým kompasom HM55B

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]

:arrow_right: administrator: přejmenováno z “Kompas elektronicky”

:arrow_right: administrator: přiloženy externí soubory
HM55BDatasheet.pdf (167 KB)

ok takze komunikacia sa mi uz podarila nadviazat, teraz potrebujem zapisat data do nejakej premennej. Neviem ci to moze byt nejak takto. Data vzdy citam pojednom.

for(i = pocitadlo; i > 0; i--) { KOM_PORT |= (1 << SCK); _delay_us (5); _delay_us (5); if (SDIO != 1) { compasdata = (compasdata << 1) +0; KOM_PORT &= ~(1 << SCK); _delay_us (5); _delay_us (5); } else { compasdata = (compasdata << 1) +1; KOM_PORT &= ~(1 << SCK); _delay_us (5); _delay_us (5); } }

Nějak mi to nepasuje.