Operácie

Meranie krátkych intervalov: Rozdiel medzi revíziami

Z SensorWiki

(Analýza)
(Algoritmus a program)
Riadok 55: Riadok 55:
 
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
 
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
  
<source lang="c">
+
#define F_CPU 16000000UL //Takt potrebny na vypocet delay z kniznice delay.h
/* A nezabudnite zdroják hojne komentovať  */
+
#include <util/delay.h>
 +
#include <avr/io.h>
 +
#include <avr/interrupt.h>
 +
#include <stdlib.h>
  
int main(void) {
+
#include "LCDlibrary.h"
      
+
 
     printf("Hello, World!\n");
+
//Makra na pracu s bitmi
    return(0);
+
#define bit(m) ((1<<m))
 +
#define bit_get(p,m) ((p) & bit(m))
 +
#define bit_set(p,m) ((p) |= bit(m))
 +
#define bits_set(p,m) ((p) |= (m))
 +
#define bit_clear(p,m) ((p) &= ~bit(m))
 +
#define bits_clear(p,m) ((p) &= ~(m))
 +
#define bit_flip(p,m) ((p) ^= bit(m))
 +
 
 +
//Makra pre registre
 +
#define DDR(x) (*(&x - 1))
 +
#define PIN(x) (*(&x - 2))
 +
 
 +
//Pre pouzitie pinu PD1 je potrebne zakazat pouzitie UARTu
 +
#define UART_DISABLE() bits_clear(UCSR0B,bit(RXEN0)|bit(TXEN0))
 +
 
 +
//Zapojenie prveho snimaca
 +
#define QTI1_PORT PORTC
 +
#define QTI1_PIN 0
 +
#define QTI1_INIT() bit_set(QTI1_PORT,QTI1_PIN);bit_clear(DDR(QTI1_PORT),QTI1_PIN)
 +
 
 +
//Zapojenie druheho snimaca
 +
#define QTI2_PORT PORTC
 +
#define QTI2_PIN 1
 +
#define QTI2_INIT() bit_set(QTI2_PORT,QTI2_PIN);bit_clear(DDR(QTI2_PORT),QTI2_PIN)
 +
 
 +
//Pouzite tlacidlo
 +
#define PB_PORT PORTD
 +
#define PB_PIN 7
 +
 
 +
//Pomocne funkcie na spustenie a zastavenie casovaca
 +
#define TIMER_STOP() bits_clear(TCCR0B,(bit(CS02)|bit(CS01)|bit(CS00)));TCNT0=0
 +
#define TIMER_START() TCNT0+=5;bits_set(TCCR0B,(bit(CS01)|bit(CS00)))
 +
 
 +
//Premenna pole obsahujuca prvky typu char, zobrazenie znakov na display
 +
char zobraz[8]={0};
 +
 
 +
volatile uint32_t milisekunda;
 +
 +
int QTI1_stav(void)
 +
{
 +
//Citanie logickych urovni z prveho snimaca
 +
if (bit_get(PIN(QTI1_PORT),QTI1_PIN))return 0; //Ak je na pine log 1, pred snimacom sa nic nenachadza
 +
else return 1; //V pripade ze je pred snimacom prekazka, snimac ma log 0
 +
}
 +
 
 +
int QTI2_stav(void)
 +
{
 +
//Citanie logickych urovni z druheho snimaca
 +
if (bit_get(PIN(QTI2_PORT),QTI2_PIN))return 0;
 +
else return 1;
 +
}
 +
 
 +
//Funkcia na obsluhu tlacidla
 +
uint8_t PushButton()
 +
{
 +
bit_clear(DDR(PB_PORT),PB_PIN); //Nastavenie tlacidla na vstup
 +
uint8_t stav=0xFF; //Nestlacene tlacidlo
 +
for(uint8_t i=0;i<5;i++)
 +
{
 +
stav &= bit_get(PIN(PB_PORT),PB_PIN); //Citanie hodnoty na pine tlacidla
 +
_delay_ms(5); //Osetrenie tlacidla na zakmity
 +
}
 +
bit_set(DDR(PB_PORT),PB_PIN); //Nastavenie portu na vystup pre pouzitie displaya
 +
return(stav); //Vysledny stav tlacidla
 +
}
 +
int main(void)
 +
{
 +
//Inicializacne funkcie
 +
UART_DISABLE();
 +
QTI1_INIT();
 +
QTI2_INIT();
 +
lcd_init();
 +
//Odoslanie znakov na display na pozadovane suradnice
 +
lcd_puts_addr(0,"Meranie");
 +
lcd_puts_addr(0x40,"intervalov");
 +
_delay_ms(500);
 +
//Rotovanie displaya do lava, pretoze pouzite slovo je mimo rozashu
 +
for (uint8_t i=0;i<10;i++)
 +
{
 +
lcd_command(LCD_MOVE_DISP_LEFT);
 +
_delay_ms(200);
 +
}
 +
lcd_clrscr(); //Mazanie displaya
 +
lcd_puts_addr(0,"T:");
 +
 +
bit_set(TIMSK0,TOIE0); //Povolenie prerusenia Casovaca 0
 +
sei(); //Globalne povolenie prerusenia
 +
 +
     while(1)
 +
     {
 +
//Testovanie stlacenia tlacidla
 +
if (PushButton())
 +
{
 +
milisekunda=0; //Po stlaceni tlacidla sa premenna nuluje
 +
lcd_clrscr(); //A obrazovka sa znova nastavi pre dalsie meranie
 +
lcd_puts("Restart");
 +
_delay_ms(1000);
 +
lcd_clrscr();
 +
lcd_puts("T:");
 +
}
 +
//Testovanie vystupu prveho snimaca, pricom casovac nemoze bezat
 +
//Po prechode objektu pre snimacom sa spusta casovac a nasledne meranie
 +
if (QTI1_stav() && milisekunda==0)
 +
{
 +
TIMER_START();
 +
lcd_puts_addr(2,"Start!");
 +
}
 +
//Testovanie vystupu druheho snimaca, pricom casuvac musi bezat
 +
//Zastavenie casovaca po prechode objektu pred snimacom a nasledne zobrazenie nameranej hodnoty v ms
 +
if (QTI2_stav() && milisekunda!=0)
 +
{
 +
TIMER_STOP();
 +
lcd_puts_addr(2,"Koniec");
 +
lcd_puts_addr(0x40,ultoa(milisekunda,zobraz,10));
 +
lcd_puts("ms");
 +
}
 +
//Pocas behu programu sa zobrazuje hodnota milisekund
 +
if (TCCR0B!=0)lcd_puts_addr(0x40,ultoa(milisekunda,zobraz,10));
 +
 +
 +
}
 +
}
 +
//Obsluha prerusenia pre casovac 0
 +
ISR(TIMER0_OVF_vect)
 +
{
 +
TCNT0+=5; //Pre presnejsiu hodnotu (1ms) je potrebne inkrementovat register casovaca
 +
milisekunda++; //premenna obsahujuca pocet milisekund (32bit hodnota)
 
}
 
}
</source>
+
 
  
 
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!

Verzia zo dňa a času 10:16, 10. január 2014

Autori: Ján Mrkvička, Jozef Kuleha
Študijný odbor: Aplikovaná mechatronika 2. Ing. (2013)

Zadanie

C. Meranie krátkych intervalov.

Na doske Acrob s LCD displejom treba merať čas medzi dvoma udalosťami, ktoré bude predstavovať zopnutie snímačov QTI. Príkladom aplikácie môže byť meranie doby voľného pádu alebo doba kyvu kyvadla. Synchronizácia (štart) merania tlačidlom. K zapojeniu treba vypracovať dokumentáciu, popis programu, schému zapojenia displeja a riadiacej jednotky.

DVPS Zadanie Time1.pngQTIsenzor.jpg

Literatúra:


Analýza

ParallaxLCDAppMod.jpg

  • obrázok zapojenia vývodov použitej súčiastky
  • odkaz na katalógový list
  • priebehy dôležitých signálov

Popis riešenia

Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru (nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.

Schéma zapojenia snímača Zapojenie.png

Súbor:Example.jpg

Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo nahrať už aspoň 10 študentov.


Algoritmus a program

Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili. Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu. Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.

Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:

  1. define F_CPU 16000000UL //Takt potrebny na vypocet delay z kniznice delay.h
  2. include <util/delay.h>
  3. include <avr/io.h>
  4. include <avr/interrupt.h>
  5. include <stdlib.h>
  1. include "LCDlibrary.h"

//Makra na pracu s bitmi

  1. define bit(m) ((1<<m))
  2. define bit_get(p,m) ((p) & bit(m))
  3. define bit_set(p,m) ((p) |= bit(m))
  4. define bits_set(p,m) ((p) |= (m))
  5. define bit_clear(p,m) ((p) &= ~bit(m))
  6. define bits_clear(p,m) ((p) &= ~(m))
  7. define bit_flip(p,m) ((p) ^= bit(m))

//Makra pre registre

  1. define DDR(x) (*(&x - 1))
  2. define PIN(x) (*(&x - 2))

//Pre pouzitie pinu PD1 je potrebne zakazat pouzitie UARTu

  1. define UART_DISABLE() bits_clear(UCSR0B,bit(RXEN0)|bit(TXEN0))

//Zapojenie prveho snimaca

  1. define QTI1_PORT PORTC
  2. define QTI1_PIN 0
  3. define QTI1_INIT() bit_set(QTI1_PORT,QTI1_PIN);bit_clear(DDR(QTI1_PORT),QTI1_PIN)

//Zapojenie druheho snimaca

  1. define QTI2_PORT PORTC
  2. define QTI2_PIN 1
  3. define QTI2_INIT() bit_set(QTI2_PORT,QTI2_PIN);bit_clear(DDR(QTI2_PORT),QTI2_PIN)

//Pouzite tlacidlo

  1. define PB_PORT PORTD
  2. define PB_PIN 7

//Pomocne funkcie na spustenie a zastavenie casovaca

  1. define TIMER_STOP() bits_clear(TCCR0B,(bit(CS02)|bit(CS01)|bit(CS00)));TCNT0=0
  2. define TIMER_START() TCNT0+=5;bits_set(TCCR0B,(bit(CS01)|bit(CS00)))

//Premenna pole obsahujuca prvky typu char, zobrazenie znakov na display char zobraz[8]={0};

volatile uint32_t milisekunda;

int QTI1_stav(void) { //Citanie logickych urovni z prveho snimaca if (bit_get(PIN(QTI1_PORT),QTI1_PIN))return 0; //Ak je na pine log 1, pred snimacom sa nic nenachadza else return 1; //V pripade ze je pred snimacom prekazka, snimac ma log 0 }

int QTI2_stav(void) { //Citanie logickych urovni z druheho snimaca if (bit_get(PIN(QTI2_PORT),QTI2_PIN))return 0; else return 1; }

//Funkcia na obsluhu tlacidla uint8_t PushButton() { bit_clear(DDR(PB_PORT),PB_PIN); //Nastavenie tlacidla na vstup uint8_t stav=0xFF; //Nestlacene tlacidlo for(uint8_t i=0;i<5;i++) { stav &= bit_get(PIN(PB_PORT),PB_PIN); //Citanie hodnoty na pine tlacidla _delay_ms(5); //Osetrenie tlacidla na zakmity } bit_set(DDR(PB_PORT),PB_PIN); //Nastavenie portu na vystup pre pouzitie displaya return(stav); //Vysledny stav tlacidla } int main(void) { //Inicializacne funkcie UART_DISABLE(); QTI1_INIT(); QTI2_INIT(); lcd_init(); //Odoslanie znakov na display na pozadovane suradnice lcd_puts_addr(0,"Meranie"); lcd_puts_addr(0x40,"intervalov"); _delay_ms(500); //Rotovanie displaya do lava, pretoze pouzite slovo je mimo rozashu for (uint8_t i=0;i<10;i++) { lcd_command(LCD_MOVE_DISP_LEFT); _delay_ms(200); } lcd_clrscr(); //Mazanie displaya lcd_puts_addr(0,"T:");

bit_set(TIMSK0,TOIE0); //Povolenie prerusenia Casovaca 0 sei(); //Globalne povolenie prerusenia

   while(1)
   {

//Testovanie stlacenia tlacidla if (PushButton()) { milisekunda=0; //Po stlaceni tlacidla sa premenna nuluje lcd_clrscr(); //A obrazovka sa znova nastavi pre dalsie meranie lcd_puts("Restart"); _delay_ms(1000); lcd_clrscr(); lcd_puts("T:"); } //Testovanie vystupu prveho snimaca, pricom casovac nemoze bezat //Po prechode objektu pre snimacom sa spusta casovac a nasledne meranie if (QTI1_stav() && milisekunda==0) { TIMER_START(); lcd_puts_addr(2,"Start!"); } //Testovanie vystupu druheho snimaca, pricom casuvac musi bezat //Zastavenie casovaca po prechode objektu pred snimacom a nasledne zobrazenie nameranej hodnoty v ms if (QTI2_stav() && milisekunda!=0) { TIMER_STOP(); lcd_puts_addr(2,"Koniec"); lcd_puts_addr(0x40,ultoa(milisekunda,zobraz,10)); lcd_puts("ms"); } //Pocas behu programu sa zobrazuje hodnota milisekund if (TCCR0B!=0)lcd_puts_addr(0x40,ultoa(milisekunda,zobraz,10));


} } //Obsluha prerusenia pre casovac 0 ISR(TIMER0_OVF_vect) { TCNT0+=5; //Pre presnejsiu hodnotu (1ms) je potrebne inkrementovat register casovaca milisekunda++; //premenna obsahujuca pocet milisekund (32bit hodnota) }


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!

Zdrojový kód: serial.h a main.c

program.c

Overenie

Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.