AkcelerometerTopoliVirag.c
Zo stránky SensorWiki
- include <stdlib.h>
- include <stdio.h>
- include <avr/io.h>
- include "lcd.h"
- include <avr/interrupt.h>
// PWM X
volatile unsigned int Xzaciatok = 0; volatile unsigned int XPWM=0; volatile unsigned int Xkoniec=0; volatile unsigned int Xaktualne=0; volatile long rozdielX; volatile unsigned int dobeznaX=0;
// PWM Y volatile unsigned int Yzaciatok = 0; volatile unsigned int YPWM=0; volatile unsigned int Ykoniec=0; volatile unsigned int Yaktualne=0; volatile long rozdielY; volatile unsigned int dobeznaY=0;
FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE); // nová funkcia pre jeden znak
unsigned char pole[8][16]={"9865456798776549","PLMOIJNKZHGFRTWD","sdjkreiooasjkrpl","~!@#$%^&*()_+}|:","9865456798776549","PLMOIJNKZHGFRTWD","sdjkreiooasjkrpl","~!@#$%^&*()_+}|:"};
ISR(PCINT0_vect) // X prerušenie { //hodnota countra pri prerušení Xaktualne=TCNT1;
// dobežná hrana if (!(PINB & 0b00100000)) // sirka impulzu dobezna { dobeznaX=Xaktualne; XPWM=dobeznaX-Xzaciatok; } else // sirka impulzu nabezna {
Xkoniec=Xzaciatok; Xzaciatok=Xaktualne; rozdielX=Xzaciatok-Xkoniec; } }
ISR(PCINT1_vect) // Y prerušenie { //hodnota countra pri prerušení Yaktualne=TCNT1;
// nábežná hrana if (PINC & 0b00000001) // sirka impulzu nabezna { Ykoniec=Yzaciatok; Yzaciatok=Yaktualne; rozdielY=Yzaciatok-Ykoniec; } else // sirka impulzu dobezna { dobeznaY=Yaktualne; YPWM=dobeznaY-Yzaciatok; } }
//oneskorenie, milisekundy
void delay_ms(unsigned int ms) {
unsigned int index;
while (ms) { index = F_CPU / 19040; while (index) { asm volatile ("nop"); index--; }
ms--; }
} // poloha kurzora void polohakurzora(int sor,int oszlop) {
if (sor==1) lcdControlWrite(0x40+0x80+oszlop); else lcdControlWrite(0x80+oszlop);
}
int SDH(void) // vlastná funkcia pre display "set cursor home" { lcdControlWrite(0x02); return 0; }
void zaplndisp(int oszlop, int sor) // vlastna funkcia na vyplnenie displeja z dátového poľa { int i,j;
j=sor;
polohakurzora(0,0);
for(i=oszlop;i<=oszlop+8;i++) // vyplnenie prvého riadku
{
lcdDataWrite(pole[j][i]);
} j++; polohakurzora(1,0); for(i=oszlop;i<=oszlop+8;i++) // vyplnenie druhého riadku {
lcdDataWrite(pole[j][i]);
} }
int main(void) {
DDRB = 0b00000000; // nastav ICR - Port B, pin0 ako INPUT DDRC = 0b00000000; // nastav ICR - Port C, pin5 ako INPUT PCICR=0b00000011; // nastavenie externého prerušenia PCIFR=0b00000011; PCMSK1=0b00000001; PCMSK0=0b00100000;
TCCR1B = 0b11000010; // T1 clk = F_CPU : 1024, falling edge pin ICP1, TCCR1A = 0b00000000; // T1 in timer mode !! Note: if You omit this, TCNT1 will be only 8-bit !! TCNT1 = 0x0000; // inicializácia počítadla (16-bit! Low+High bytes)
lcdInit4();
stdout = &mystdout; // Odteraz funguje printf();
sei(); // povolenie všetkých prerušení
int i=0,j=0; //nekonecny cyklus for(;;){
zaplndisp(0,i); //vyplnenie displeja s požadovanými riadkami delay_ms(1000); // delay aby sa dalo odčítať if (((long)(XPWM*10)/rozdielX)==2) // test natočenia v smere x // posuň displey doprava lcdControlWrite(0x1C); else if(((long)(XPWM*10)/rozdielX)==0) // test natočenia v smere -x // posuň displej doľava lcdControlWrite(0x18); if (((long)(YPWM*10)/rozdielY)==2 && i<6) // test natočenia v smere y i++; // posun vypisaných riadkov else if(((long)(YPWM*10)/rozdielY)==0 && i>0) // test natočenia v smere -y i--; // posun vypisaných riadkov
}
}