#include #include #define F_CPU 16000000UL #include #include #include #include "lcd_c.c" // ------------------ DEFINICE -------------------------- #define SPI_PORT PORTB #define SPI_DIR DDRB #define SPI_PIN PINB #define SPI_DATA SPDR #define SPI_CLK (1<<7) #define SPI_MOSI (1<<5) #define SPI_MISO (1<<6) #define SPI_CS (1<<4) #define fdisplay 0x2fff #define prumerovani 15 //hodnota prumerovaciho filtru na odstarneni sumu // ------------------ GOBALNI PROMENNE ----------------- int Acc_X, Acc_Y, Acc_Z; //vysledna hodnota zrychleni int prum_X, prum_Y, prum_Z; // uint8_t prum = 0; char text[15]; // ------------------ FUNKCE --------------------------- uint8_t SPI_MasterInit(void); unsigned int SPI_SR (uint8_t DataIn, uint8_t AddressIn); void SPI_Send (uint8_t datain); void TimerInit(void); uint16_t uprava(uint16_t data1, uint16_t data2); // ------------------ MAIN ----------------------------- int main (void) { uint16_t temp =0; lcd_init (); lcd_clrscr (); if (SPI_MasterInit()){ //chybova hlaska lcd_gotoxy(0,0); lcd_puts("Chyba komunikace"); for (;;); //neklonecna smycka } lcd_gotoxy(0,0); lcd_puts("ACC X Y Z"); TimerInit(); sei (); //povoleni preruseni for (;;){ temp = ((SPI_SR(0x00,0b00010001))&0x00ff); prum_X = (prum_X + uprava (temp,(SPI_SR(0x00,0b00010000))) )/2; temp = ((SPI_SR(0x00,0b00010011))&0x00ff); prum_Y = (prum_Y + uprava (temp,(SPI_SR(0x00,0b00010010))) )/2; temp = ((SPI_SR(0x00,0b00010101))&0x00ff); prum_Z = (prum_Z + uprava (temp,(SPI_SR(0x00,0b00010100))) )/2; //prubezny vypocet prumeru z nahranych dat if (prum == prumerovani) { Acc_X = prum_X; Acc_Y = prum_Y; Acc_Z = prum_Z; prum = 0; } else prum ++; _delay_ms (5);//prodleva mezi stahnutim mereni (vzorkovaci frekvence cca 200 Hz) } } //------------------------ SPI nastavení portů a rozhraní------------------------------ uint8_t SPI_MasterInit(void) { SPI_DIR |= (SPI_CLK | SPI_MOSI | SPI_CS); //konfig smeru pinu SPI_PORT |= SPI_CS; // deaktivovani slave u SPI // Enable SPI, Master, set clock rate SPCR = (1<>8) & 0x00ff ; } //------------------------------ upravi cislo do formatu 16bit 2. doplnku------------------------------ uint16_t uprava(uint16_t data1, uint16_t data2) { int16_t pom; uint16_t pom2; pom2 = ( (data2<<8) | (data1&0x00ff) ); pom = ((pom2)<<6); //posun do formy 2.doplnku 16ti bitoveho return (pom/64); // bitovy posuv 6x = 2na6 tzn podelim 64 } //------------------------------ preruseni od OCR1A ------------------------------ ISR(TIMER1_COMPA_vect) { //pravidelne vypsani merenych dat na display lcd_gotoxy(0,1); sprintf(text," %4d %4d %4d",Acc_X, Acc_Y, Acc_Z); lcd_puts(text); TCNT1 = 0; }