Operácie

AkcelerometerTopoliVirag.c: Rozdiel medzi revíziami

Z SensorWiki

 
(Jedna medziľahlá úprava od rovnakého používateľa nie je zobrazená.)
Riadok 10: Riadok 10:
  
 
volatile unsigned int Xzaciatok = 0; 
 
volatile unsigned int Xzaciatok = 0; 
volatile unsigned int XPWM=0;
+
volatile long int XPWM=0;
 
volatile unsigned int Xkoniec=0;
 
volatile unsigned int Xkoniec=0;
 
volatile unsigned int Xaktualne=0;
 
volatile unsigned int Xaktualne=0;
Riadok 18: Riadok 18:
 
// PWM Y
 
// PWM Y
 
volatile unsigned int Yzaciatok = 0; 
 
volatile unsigned int Yzaciatok = 0; 
volatile unsigned int YPWM=0;
+
volatile long int YPWM=0;
 
volatile unsigned int Ykoniec=0;
 
volatile unsigned int Ykoniec=0;
 
volatile unsigned int Yaktualne=0;
 
volatile unsigned int Yaktualne=0;
Riadok 27: Riadok 27:
 
FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE); // nová funkcia pre jeden znak
 
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","~!@#$%^&*()_+}|:"};
+
unsigned char pole[8][16]={"1x65456798776549","2xMOIJNKZHGFRTWD","3xjkreiooasjkrpl","4x@#$%^&*()_+}|:","5x65456798776549","6xMOIJNKZHGFRTWD","7xjkreiooasjkrpl","8x@#$%^&*()_+}|:"};
  
 
ISR(PCINT0_vect) //  X prerušenie
 
ISR(PCINT0_vect) //  X prerušenie
Riadok 40: Riadok 40:
 
dobeznaX=Xaktualne;
 
dobeznaX=Xaktualne;
 
XPWM=dobeznaX-Xzaciatok;
 
XPWM=dobeznaX-Xzaciatok;
 +
if (XPWM<=0)
 +
{
 +
XPWM=dobeznaX+65536-Xzaciatok;
 +
}
 
}
 
}
 
else
 
else
Riadok 48: Riadok 52:
 
Xzaciatok=Xaktualne;
 
Xzaciatok=Xaktualne;
 
rozdielX=Xzaciatok-Xkoniec;
 
rozdielX=Xzaciatok-Xkoniec;
 +
if (rozdielX <=0)
 +
{
 +
rozdielX=Xzaciatok+65536-Xkoniec;
 +
}
 
}
 
}
 
}
 
}
Riadok 63: Riadok 71:
 
Yzaciatok=Yaktualne;
 
Yzaciatok=Yaktualne;
 
rozdielY=Yzaciatok-Ykoniec;
 
rozdielY=Yzaciatok-Ykoniec;
 +
if (rozdielY <=0)
 +
{
 +
rozdielY=Yzaciatok+65536-Ykoniec;
 +
}
 
}
 
}
 
else
 
else
Riadok 69: Riadok 81:
 
dobeznaY=Yaktualne;
 
dobeznaY=Yaktualne;
 
YPWM=dobeznaY-Yzaciatok;
 
YPWM=dobeznaY-Yzaciatok;
 +
if (YPWM<=0)
 +
{
 +
YPWM=dobeznaY+65536-Yzaciatok;
 +
}
 
}
 
}
 
}
 
}
Riadok 93: Riadok 109:
 
   }
 
   }
 
}
 
}
// 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]);
 
 
}
 
}
 
 
 
 
  
  
Riadok 150: Riadok 123:
 
  TCCR1B = 0b11000010;              // T1 clk = F_CPU : 1024, falling edge pin ICP1,
 
  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 !!
 
  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)
+
   TCNT1 = 0x0000;          // inicializácia poèítadla (16-bit! Low+High bytes)
 
lcdInit4();
 
lcdInit4();
 
  stdout = &mystdout;          // Odteraz funguje printf();
 
  stdout = &mystdout;          // Odteraz funguje printf();
Riadok 156: Riadok 129:
  
 
int i=0,j=0;
 
int i=0,j=0;
//nekonecny cyklus
+
 
 +
 
 +
int cislo=0;
 +
int k1=0;
 +
 
 
for(;;){
 
for(;;){
  
+
//dozadu
 +
if (YPWM > 10000){
 +
cislo=12000-((YPWM-rozdielY)+20000);
 +
if (cislo<=0)
 +
cislo=0;
 +
lcdControlWrite(1<<LCD_CLR);
 +
lcdControlWrite(0x80);
 +
lcdControlWrite(0x80+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j][i]);
 +
}
 +
 
 +
lcdControlWrite(0x80+0x40+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j+1][i]);
 +
}
 +
 
 +
delay_ms(cislo);
 +
j++;
 +
if(j==7)
 +
j=0;
 +
}
 +
//dopredu
 +
if (YPWM < 9500){
 +
cislo=12000-(rozdielY-YPWM);
 +
if (cislo<=0)
 +
cislo=0;
 +
lcdControlWrite(1<<LCD_CLR);
 +
lcdControlWrite(0x80);
 +
lcdControlWrite(0x80+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j][i]);
 +
}
  
zaplndisp(0,i); //vyplnenie displeja s požadovanými riadkami
+
lcdControlWrite(0x80+0x40+4+k1);
delay_ms(1000); // delay aby sa dalo odčítať
+
for(i=0;i<10;i++){
if (((long)(XPWM*10)/rozdielX)==2) // test natočenia v smere x
+
lcdDataWrite(pole[j+1][i]);
// posuň displey doprava
+
}
lcdControlWrite(0x1C);
+
delay_ms(cislo);
else
+
j--;
if(((long)(XPWM*10)/rozdielX)==0) // test natočenia v smere -x
+
if(j<0)
// posuň displej doľava
+
j=6;
lcdControlWrite(0x18);
+
}
if (((long)(YPWM*10)/rozdielY)==2 && i<6) // test natočenia v smere y
+
//doprava
i++; // posun vypisaných riadkov
+
if (XPWM > 10000){
else
+
cislo=12000-((XPWM-rozdielX)+20000);
if(((long)(YPWM*10)/rozdielY)==0 && i>0) // test natočenia v smere -y
+
if (cislo<=0)
i--; // posun vypisaných riadkov
+
cislo=0;
 +
lcdControlWrite(1<<LCD_CLR);
 +
lcdControlWrite(0x80);
 +
lcdControlWrite(0x80+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j][i]);
 +
}
  
 +
lcdControlWrite(0x80+0x40+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j+1][i]);
 +
}
 +
delay_ms(cislo);
 +
k1++;
 +
if(k1==4)
 +
{
 +
k1=-4;
 +
}
 +
}
 +
//dolava
 +
if (XPWM < 9500){
 +
cislo=12000-(rozdielX-XPWM);
 +
if (cislo<=0)
 +
cislo=0;
 +
lcdControlWrite(1<<LCD_CLR);
 +
lcdControlWrite(0x80);
 +
lcdControlWrite(0x80+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j][i]);
 +
}
  
}
+
lcdControlWrite(0x80+0x40+4+k1);
 +
for(i=0;i<10;i++){
 +
lcdDataWrite(pole[j+1][i]);
 +
}
 +
delay_ms(cislo);
 +
k1--;
 +
if(k1<=-5)
 +
{
 +
k1=3;
 +
}
 +
}
 +
}
 
}
 
}
 +
 +
 
</source>
 
</source>

Aktuálna revízia z 14:36, 16. január 2013

#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 long 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 long 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]={"1x65456798776549","2xMOIJNKZHGFRTWD","3xjkreiooasjkrpl","4x@#$%^&*()_+}|:","5x65456798776549","6xMOIJNKZHGFRTWD","7xjkreiooasjkrpl","8x@#$%^&*()_+}|:"};

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;
	if (XPWM<=0)
	{
	XPWM=dobeznaX+65536-Xzaciatok;
	}
	}
	else
	// sirka impulzu nabezna
	{
					
	Xkoniec=Xzaciatok;
	Xzaciatok=Xaktualne;
	rozdielX=Xzaciatok-Xkoniec;
	if (rozdielX <=0)
	{
	rozdielX=Xzaciatok+65536-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;
	if (rozdielY <=0)
	{
	rozdielY=Yzaciatok+65536-Ykoniec;
	}
	}
	else
	// sirka impulzu dobezna
	{
	dobeznaY=Yaktualne;				
		YPWM=dobeznaY-Yzaciatok;
			if (YPWM<=0)
	{
	YPWM=dobeznaY+65536-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--;
  }
}


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;


int cislo=0;
int k1=0;

for(;;){

//dozadu
if (YPWM > 10000){
cislo=12000-((YPWM-rozdielY)+20000);
if (cislo<=0)
cislo=0;
lcdControlWrite(1<<LCD_CLR);
lcdControlWrite(0x80);
lcdControlWrite(0x80+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j][i]);
}

lcdControlWrite(0x80+0x40+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j+1][i]);
}

delay_ms(cislo);
j++;
if(j==7)
j=0;
}
//dopredu
if (YPWM < 9500){
cislo=12000-(rozdielY-YPWM);
if (cislo<=0)
cislo=0;
lcdControlWrite(1<<LCD_CLR);
lcdControlWrite(0x80);
lcdControlWrite(0x80+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j][i]);
}

lcdControlWrite(0x80+0x40+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j+1][i]);
}
delay_ms(cislo);
j--;
if(j<0)
j=6;
}
//doprava
if (XPWM > 10000){
cislo=12000-((XPWM-rozdielX)+20000);
if (cislo<=0)
cislo=0;
lcdControlWrite(1<<LCD_CLR);
lcdControlWrite(0x80);
lcdControlWrite(0x80+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j][i]);
}

lcdControlWrite(0x80+0x40+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j+1][i]);
}
delay_ms(cislo);
k1++;
if(k1==4)
{
k1=-4;
}
}
//dolava
if (XPWM < 9500){
cislo=12000-(rozdielX-XPWM);
if (cislo<=0)
cislo=0;
lcdControlWrite(1<<LCD_CLR);
lcdControlWrite(0x80);
lcdControlWrite(0x80+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j][i]);
}

lcdControlWrite(0x80+0x40+4+k1);
for(i=0;i<10;i++){
lcdDataWrite(pole[j+1][i]);
}
delay_ms(cislo);
k1--;
if(k1<=-5)
{
k1=3;
}
}
}
}