// Program STOPKY pro mereni casu prujezdu mezi cidlama pro souteze solarnich robotu//// (c) miho 2004//// Historie//// 1.00 Uvodni verze#define VER "1.00"// Definice zakladnich parametru//#include <16F84.h> // procesor#use delay(clock=4000000) // krystal#use rs232(baud=9600, xmit=PIN_B4) // seriovka a jeji parametry#fuses XT,PUT,NOWDT,NOPROTECT // prepinace// Definice pro pripojeni LCD displeje//#define LCD_RS PIN_A2 // Signal RS#define LCD_E PIN_A3 // Signal E#define LCD_D0 PIN_A4 // Data#define LCD_D1 PIN_B1#define LCD_D2 PIN_B2#define LCD_D3 PIN_B3#include <LCD.C>// Definice pro pripojeni vstupu (cidel)//#define BUTTON_START PIN_B7 // Tlacitko START#define BUTTON_STOP PIN_B6 // Tlacitko STOP#define BUTTON_TEST PIN_B5 // Tlacitko TEST pro prechod do testovaciho rezimu// Defince pro pripojeni vystupu pro pipak//#define BEEP_PORT_P PIN_A0 // Piezo pipak pozitivni#define BEEP_PORT_N PIN_A1 // Piezo pipak negativni// Definice globalnich promennych//unsigned int Beep; // citac pulperiod pro pipnutishort int Beep_state; // stav pipaku (0 nebo 1)unsigned int State_run; // 0 .. klid// 1 .. bezi mereni casu// 2 .. cas zmereny// Obsluha vstupu cidel//// Cas se meri od signalu na tlacitku START po signal na tlacitku STOP// Signaly na tlacitkach vyvolaji preruseni a dojde k preklopeni stavu v promenne State_run//#int_RBRB_isr(){if(State_run){if(~input(BUTTON_STOP)){State_run=2; // DomerenoBeep=100;disable_interrupts(INT_RB); // Zakaz vstup tlacitek aby byl cas na zpracovani}}else{if(~input(BUTTON_START)){State_run=1;Beep=100;}}}// Obsluha preruseni od casovace//unsigned int32 Time; // citac casu (perioda 256us)#int_RTCCRTCC_isr(){if(State_run==1) Time++; // zvetsi citacif(Time==(3600000000>>8)) Time=0; // Osetreni preteceni po 1 hodineif(Beep) // pokud se ma pipnout pipni{ // Beep je pocet pulperiodBeep--;output_bit(BEEP_PORT_P,Beep_state);Beep_state=~Beep_state;output_bit(BEEP_PORT_N,Beep_state);}}// Obsluha vystupu a jeho presmerovani na LCD a RS232//int PutCharMode;#define LCD 1#define RS232 2void PutChar(char c){if(PutCharMode & LCD) LCD_Putc(c);if(PutCHarMode & RS232) putc(c);}// Vypis casu - dlouhy program ale jen na jedinem miste//void DisplayCas(){int32 xTime;// Tisk vysledku v ms// printf(PutChar,"Cas:%8lums\n\r",(Time<<8)/1000);// Tisk vysledku v sxTime=(Time<<8)/1000;printf(PutChar,"Cas:%4lu.%03lus\n\r",xTime/1000,xTime%1000);}// Testovaci rezim//void TestMode(){int T;// Otestuj tlascitko TESTif(input(BUTTON_TEST)) return;// Vypis na displejprintf(LCD_Putc,"\fTest Mode\n");for(;1;){T=0;if(~input(BUTTON_START)) T+=1;if(~input(BUTTON_STOP)) T+=2;printf(LCD_putc,"\n%d",T);if(T){if(T==3) T=4;output_bit(BEEP_PORT_P,0);output_bit(BEEP_PORT_N,1);delay_ms(T);output_bit(BEEP_PORT_P,1);output_bit(BEEP_PORT_N,0);delay_ms(T);}}}// Hlavni program//void main(){// Inicializace LCD displejelcd_init();PutCharMode=LCD|RS232;printf(PutChar,"\n\rStopky v."VER"\r\n(c) miho 2004\n\r");delay_ms(100);// Inicializace stavovych promennychState_run=0; // stopky stoji// Inicializace vstupu (preruseni od zmeny stavu)input(BUTTON_START); // precti RB aby se inicializoval registr zmen RBport_b_pullups(TRUE); // zapni pull up odpory// Testovaci modTestMode();// Inicializace casovace pod prerusenimsetup_counters(RTCC_INTERNAL,WDT_18MS); // Perioda je 256 instrukcnich taktu// Hlavni smycka porad dokolafor(;1;){// Nuluj citaceTime=0; // nulovy casBeep=0; // nepipejState_run=0;// Povoleni prerusenienable_interrupts(INT_RTCC); // povol preruseni od casovaceenable_interrupts(INT_RB); // povol preruseni od zmeny portu RBenable_interrupts(global); // povol preruseni// Cekej az se zacne meritfor(;State_run==0;){}// Prubezne vypisuj casPutCharMode=LCD; // vystup jen na LCDfor(;State_run==1;){DisplayCas();}// Vypis vysledny cas - na LCD hnedDisplayCas();// Vypis vysledny cas - na RS232 az po pipnutidelay_ms(100); // ted se pod prerusenim pipaPutCharMode=RS232;disable_interrupts(global); // zakaz preruseni (aby fungovalo casovani seriovky)DisplayCas();enable_interrupts(global); // opet povol preruseni}}