Projekt akcelerometer.c: Rozdiel medzi revíziami
Zo stránky SensorWiki
 Vytvorená stránka „#include <avr/io.h> #include "lcd.h" #include <avr/interrupt.h>   #include <stdlib.h> #include <stdio.h> FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETU...“  | 
				Bez shrnutí editace  | 
				||
| (Jedna medziľahlá úprava od rovnakého používateľa nie je zobrazená.) | |||
| Riadok 1: | Riadok 1: | ||
<source lang="c">  | |||
#include <avr/io.h>  | #include <avr/io.h>  | ||
#include "lcd.h"  | #include "lcd.h"  | ||
| Riadok 4: | Riadok 5: | ||
#include <stdlib.h>  | #include <stdlib.h>  | ||
#include <stdio.h>  | #include <stdio.h>  | ||
FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE);		//   | FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE);		// nová funkcia pre jeden znak  | ||
unsigned char pole[8][16]={"1234567890111213","abcdefghijklmnop","qwertyuiopasdfgh","!@#$%^&*()_+}|{?","1234567890111213","abcdefghijklmnop","qwertyuiopasdfgh","!@#$%^&*()_+}|{?"};  | unsigned char pole[8][16]={"1234567890111213","abcdefghijklmnop","qwertyuiopasdfgh","!@#$%^&*()_+}|{?","1234567890111213","abcdefghijklmnop","qwertyuiopasdfgh","!@#$%^&*()_+}|{?"};  | ||
volatile unsigned int STARTX = 0;   | volatile unsigned int STARTX = 0;   			// premenné na výpočet PWM pre os X  | ||
volatile  	long DELTAX;  | volatile  	long DELTAX;  | ||
volatile unsigned int PULSEX=0,PWMX;  | volatile unsigned int PULSEX=0,PWMX;  | ||
| Riadok 13: | Riadok 14: | ||
volatile unsigned int bufferX=0;  | volatile unsigned int bufferX=0;  | ||
volatile unsigned int STARTY = 0;   | volatile unsigned int STARTY = 0;   			//  premenné na výpočet PWM pre os Y  | ||
volatile  	long DELTAY;  | volatile  	long DELTAY;  | ||
volatile unsigned int PULSEY=0,PWMY;  | volatile unsigned int PULSEY=0,PWMY;  | ||
| Riadok 19: | Riadok 20: | ||
volatile unsigned int bufferY=0;  | volatile unsigned int bufferY=0;  | ||
ISR(PCINT0_vect)  | ISR(PCINT0_vect)					// prerušenie pre vstup X  | ||
{  | {  | ||
bufferX=TCNT1;	  | bufferX=TCNT1;						//uloženie hodnoty z countra na začiatku prerušenia  | ||
if (!(PINB & 0b00100000))  | if (!(PINB & 0b00100000))				//test dobežnej hrany  | ||
	{  | 	{  | ||
	PULSEX=bufferX;  | 	PULSEX=bufferX;					// dobežná hrana -> výpočet šírky impulzu  | ||
	PWMX=PULSEX-STARTX;  | 	PWMX=PULSEX-STARTX;  | ||
	}  | 	}  | ||
	else  | 	else  | ||
	{  | 	{  | ||
	//TCNT1=0x000;  | 	//TCNT1=0x000;					// nábežná hrana -> výpočet periódy  | ||
	ENDX=STARTX;  | 	ENDX=STARTX;  | ||
	STARTX=bufferX;  | 	STARTX=bufferX;  | ||
| Riadok 37: | Riadok 38: | ||
}  | }  | ||
ISR(PCINT1_vect)  | ISR(PCINT1_vect)					// prerušenie pre vstup Y  | ||
{  | {  | ||
bufferY=TCNT1;  | bufferY=TCNT1;						//uloženie hodnoty z countra na začiatku prerušenia  | ||
if (PINC & 0b00000001)  | if (PINC & 0b00000001)					//test nábežnej hrany  | ||
	{  | 	{  | ||
		ENDY=STARTY;  | 		ENDY=STARTY;				// nábežná hrana -> výpočet periódy  | ||
	STARTY=bufferY;  | 	STARTY=bufferY;  | ||
	DELTAY=STARTY-ENDY;  | 	DELTAY=STARTY-ENDY;  | ||
| Riadok 49: | Riadok 50: | ||
	else  | 	else  | ||
	{  | 	{  | ||
	PULSEY=bufferY;  | 	PULSEY=bufferY;					// dobežná hrana -> výpocet šírky impulzu  | ||
		PWMY=PULSEY-STARTY;  | 		PWMY=PULSEY-STARTY;  | ||
	}  | 	}  | ||
| Riadok 57: | Riadok 58: | ||
void lcdGotoXY(int riadok,int stlpec)  | void lcdGotoXY(int riadok,int stlpec)			// vlastná funkcia pre nastavenie polohy kurzora na displeji  | ||
{  | {  | ||
| Riadok 67: | Riadok 68: | ||
}  | }  | ||
void delay_ms(unsigned int ms)  | void delay_ms(unsigned int ms)				// vlastna funkcia pre časové oneskorenie  | ||
{  | {  | ||
   unsigned int index;  |    unsigned int index;  | ||
| Riadok 73: | Riadok 74: | ||
   while (ms)  |    while (ms)  | ||
   {  |    {  | ||
    index = F_CPU / 19040;   |     index = F_CPU / 19040;    				// 1ms!!  | ||
    while (index)  |     while (index)  | ||
| Riadok 85: | Riadok 86: | ||
}  | }  | ||
int SDH(void)  | int SDH(void)						// vlastná funkcia pre display "set cursor home"   | ||
{  | {  | ||
	lcdControlWrite(0x02);	  | 	lcdControlWrite(0x02);	  | ||
| Riadok 91: | Riadok 92: | ||
}  | }  | ||
void Plot(int stlp, int riadok)  | void Plot(int stlp, int riadok)				// vlastna funkcia na vyplnenie displeja z dátového poľa   | ||
{  | {  | ||
	int i,j;  | 	int i,j;  | ||
| Riadok 98: | Riadok 99: | ||
	j=riadok;  | 	j=riadok;  | ||
	lcdGotoXY(0,0);  | 	lcdGotoXY(0,0);  | ||
	for(i=stlp;i<=stlp+8;i++)  | 	for(i=stlp;i<=stlp+8;i++)			// vyplnenie prvého riadku  | ||
	{  | 	{  | ||
	lcdDataWrite(pole[j][i]);  | 	lcdDataWrite(pole[j][i]);  | ||
| Riadok 105: | Riadok 106: | ||
	j++;  | 	j++;  | ||
	lcdGotoXY(1,0);  | 	lcdGotoXY(1,0);  | ||
		for(i=stlp;i<=stlp+8;i++)  | 		for(i=stlp;i<=stlp+8;i++)		// vyplnenie druhého riadku  | ||
		{  | 		{  | ||
| Riadok 113: | Riadok 114: | ||
}  | }  | ||
int SDL(void)  | int SDL(void)						// posuň displej doľava  | ||
{  | {  | ||
	lcdControlWrite(0x18);	  | 	lcdControlWrite(0x18);	  | ||
| Riadok 119: | Riadok 120: | ||
}  | }  | ||
int SDR(void)  | int SDR(void)						// posuň displey doprava  | ||
{  | {  | ||
	lcdControlWrite(0x1C);	  | 	lcdControlWrite(0x1C);	  | ||
| Riadok 129: | Riadok 130: | ||
{  | {  | ||
	int i=0,j;  | 	int i=0,j;  | ||
DDRB = 0b00000000;   | DDRB = 0b00000000;              			// nastav ICR - Port B, pin0  ako INPUT  | ||
DDRC = 0b00000000;   | DDRC = 0b00000000;              			// nastav ICR - Port C, pin5  ako INPUT  | ||
	PCICR=0b00000011;  | 	PCICR=0b00000011;				// nastavenie externého prerušenia  | ||
	PCIFR=0b00000011;  | 	PCIFR=0b00000011;			  | ||
	PCMSK1=0b00000001;  | 	PCMSK1=0b00000001;  | ||
	PCMSK0=0b00100000;  | 	PCMSK0=0b00100000;  | ||
  TCCR1B = 0b11000010;   |   TCCR1B = 0b11000010;               			// T1 clk = F_CPU : 1024, falling edge pin ICP1,  | ||
  TCCR1A = 0b00000000;   |   TCCR1A = 0b00000000;                			// T1 in timer mode !! Note: if You omit this, TCNT1 will be only 8-bit !!  | ||
   TCNT1 = 0x0000;   |    TCNT1 = 0x0000;           				// inicializácia počítadla (16-bit! Low+High bytes)  | ||
lcdInit4();  | lcdInit4();  | ||
  stdout = &mystdout;   |   stdout = &mystdout;           				// Odteraz funguje printf();  | ||
sei();   | sei();                    				// povolenie všetkých prerušení     | ||
| Riadok 147: | Riadok 148: | ||
	Plot(0,i);  					//vyplnenie displeja s požadovanými riadkami  | |||
delay_ms(1000);						// delay aby sa dalo odčítať  | |||
	if (((long)(PWMX*10)/DELTAX)==2)		// test natočenia v smere x  | |||
	SDR();						// posun displeja  | |||
	else								  | |||
	if(((long)(PWMX*10)/DELTAX)==0)			// test natočenia v smere -x  | |||
	SDL();						// posun displeja  | |||
if (((long)(PWMY*10)/DELTAY)==2 && i<6)			// test natočenia v smere y  | |||
	i++;						// posun vypisaných riadkov  | |||
	Plot(0,i);   | |||
delay_ms(1000);  | |||
	if (((long)(PWMX*10)/DELTAX)==2)  | |||
	SDR();  | |||
	else  | |||
	if(((long)(PWMX*10)/DELTAX)==0)  | |||
	SDL();  | |||
if (((long)(PWMY*10)/DELTAY)==2 && i<6)  | |||
	i++;  | |||
	else  | 	else  | ||
	if(((long)(PWMY*10)/DELTAY)==0 && i>0)  | 	if(((long)(PWMY*10)/DELTAY)==0 && i>0)		// test natočenia v smere -y  | ||
	i--;  | 	i--;						// posun vypisaných riadkov  | ||
	}  | 	}  | ||
}  | }  | ||
</source>  | |||
Aktuálna revízia z 12:39, 28. december 2012
#include <avr/io.h>
#include "lcd.h"
#include <avr/interrupt.h>  
#include <stdlib.h>
#include <stdio.h>
FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE);		// nová funkcia pre jeden znak
unsigned char pole[8][16]={"1234567890111213","abcdefghijklmnop","qwertyuiopasdfgh","!@#$%^&*()_+}|{?","1234567890111213","abcdefghijklmnop","qwertyuiopasdfgh","!@#$%^&*()_+}|{?"};
volatile unsigned int STARTX = 0;   			// premenné na výpočet PWM pre os X
volatile  	long DELTAX;
volatile unsigned int PULSEX=0,PWMX;
volatile unsigned int ENDX=0;
volatile unsigned int bufferX=0;
volatile unsigned int STARTY = 0;   			//  premenné na výpočet PWM pre os Y
volatile  	long DELTAY;
volatile unsigned int PULSEY=0,PWMY;
volatile unsigned int ENDY=0;
volatile unsigned int bufferY=0;
ISR(PCINT0_vect)					// prerušenie pre vstup X
{
bufferX=TCNT1;						//uloženie hodnoty z countra na začiatku prerušenia
if (!(PINB & 0b00100000))				//test dobežnej hrany
	{
	PULSEX=bufferX;					// dobežná hrana -> výpočet šírky impulzu
	PWMX=PULSEX-STARTX;
	}
	else
	{
	//TCNT1=0x000;					// nábežná hrana -> výpočet periódy
	ENDX=STARTX;
	STARTX=bufferX;
	DELTAX=STARTX-ENDX;
	}
}
ISR(PCINT1_vect)					// prerušenie pre vstup Y
{
bufferY=TCNT1;						//uloženie hodnoty z countra na začiatku prerušenia
if (PINC & 0b00000001)					//test nábežnej hrany
	{
		ENDY=STARTY;				// nábežná hrana -> výpočet periódy
	STARTY=bufferY;
	DELTAY=STARTY-ENDY;
	}
	else
	{
	PULSEY=bufferY;					// dobežná hrana -> výpocet šírky impulzu
		PWMY=PULSEY-STARTY;
	}
}
void lcdGotoXY(int riadok,int stlpec)			// vlastná funkcia pre nastavenie polohy kurzora na displeji
{
		if (riadok==1)
		 lcdControlWrite(0x40+0x80+stlpec);
		 else
		 lcdControlWrite(0x80+stlpec);
}
void delay_ms(unsigned int ms)				// vlastna funkcia pre časové oneskorenie
{
  unsigned int index;
  while (ms)
  {
   index = F_CPU / 19040;    				// 1ms!!
        
   while (index)
   {
    asm volatile ("nop");
    index--;
   }
   ms--;
  }
}
int SDH(void)						// vlastná funkcia pre display "set cursor home" 
{
	lcdControlWrite(0x02);	
	return 0;	
}
void Plot(int stlp, int riadok)				// vlastna funkcia na vyplnenie displeja z dátového poľa 
{
	int i,j;
	
	j=riadok;
	lcdGotoXY(0,0);
	for(i=stlp;i<=stlp+8;i++)			// vyplnenie prvého riadku
	{
	lcdDataWrite(pole[j][i]);
	}	
	j++;
	lcdGotoXY(1,0);
		for(i=stlp;i<=stlp+8;i++)		// vyplnenie druhého riadku
		{
		
	lcdDataWrite(pole[j][i]);
	}
}
int SDL(void)						// posuň displej doľava
{
	lcdControlWrite(0x18);	
	return 0;	
}
int SDR(void)						// posuň displey doprava
{
	lcdControlWrite(0x1C);	
	return 0;	
}
int main(void)
{
	int i=0,j;
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í  
for(;;){
	
	Plot(0,i);  					//vyplnenie displeja s požadovanými riadkami
delay_ms(1000);						// delay aby sa dalo odčítať
	if (((long)(PWMX*10)/DELTAX)==2)		// test natočenia v smere x
	SDR();						// posun displeja
	else								
	if(((long)(PWMX*10)/DELTAX)==0)			// test natočenia v smere -x
	SDL();						// posun displeja
if (((long)(PWMY*10)/DELTAY)==2 && i<6)			// test natočenia v smere y
	i++;						// posun vypisaných riadkov
	else
	if(((long)(PWMY*10)/DELTAY)==0 && i>0)		// test natočenia v smere -y
	i--;						// posun vypisaných riadkov
	}
}