Projekt akcelerometer.c: Rozdiel medzi revíziami
Z 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...“) |
|||
(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
}
}