/******************************************************************** * Naslov programa: *-------------------------------------------------------------------* * Programiral: * *-------------------------------------------------------------------* * prevedeno z (PICC - CCS PCM verz.2.542) * *********************************************************************/ /* OPIS: 2000-03-31 - madz_1.cp -meri temperaturo in jo poçilja po RS232 */ /***************************************/ /* P O G O J N O _ P R E V A J A N J E */ /***************************************/ #define PIC 84 //#define UPORABLJAM_LCD #define DS1820_SINGLE #ifdef UPORABLJAM_LCD //#define LCD_SANO_SLOVENSKI_ZNAKI /*da je majn definiranih zanakov v LCD*/ #define LCD_BREZ_CSZ /*da lcd rutine porabijo manj ROMa*/ #endif #if PIC == 84 #define IRQ_POENOSTAVLJEN //priçpara RAM in ROM - NE USTREZA PICu 63 #endif #case // Da loŸi male in velike Ÿrke #id CHECKSUM #USE FAST_IO(A) #USE FAST_IO(B) #ZERO_RAM // Briçe RAM po startu programa /***********************************/ /*******************************************/ /* D E F I N I C I J E _ V _ I _ P I N O V */ /*******************************************/ //============================ #if PIC==84 //============================ #include <16f84.h> #include //#USE DELAY (CLOCK=4000000) #USE DELAY (CLOCK=3800000) //zaradi IRQ je RS232 delal prepoŸasi, //REæITEV je la§no zmanjçana cifra za CLOCK //3650000 <-çe dela, 3600000 pa ne veŸ //3950000 <-çe dela, 4000000 ne dela veŸ #fuses XT,WDT,PUT,NOPROTECT /********************************************/ //****DEFINICIJE IMEN V/I PRIKJU¬KOV #define _TRIS_A 0b00010100 #define LED PIN_A0 #define TOUCH_PIN PIN_A1 //izhod #define RS232_RX PIN_A2 #define RS232_TX PIN_A3 //---------------------------- #define _TRIS_B 0b11011111 //enable LCD mora ustai izhod //lcd=b0-b3 ,rs=b4,e=b5 struct lcd_pin_map { // This structure is overlayed int data : 4; // be pin B0. BOOLEAN rs; //RS na B2 BOOLEAN enable; //E na B3 int unused : 2; // zgornja dva bita niso uporabljeni preko te strukture } lcd; #define _TRIS_B_LCD 0b11000000 #byte lcd = 6 //PORTB // This puts the entire structure #endif //AKTIVIRANJE SERIJSKEGA VMESNIKA //#use rs232(baud=9600, xmit=RS232_TX, rcv=RS232_RX,RESTART_WDT,INVERT) #use rs232(baud=9600, xmit=RS232_TX, rcv=RS232_RX,RESTART_WDT) /***********************************************/ /* G L O B A L N E _ S P R E M E N L J I V K E */ /***********************************************/ signed long temperatura; unsigned int stot_sek0; unsigned int stot_sek_ds1820; unsigned long stot_sekLong; /*******************/ /* F U N K C I J E */ /*******************/ void Inicializacija_periferije () { set_tris_a (_TRIS_A); set_tris_b (_TRIS_B); OPTION = WDT_1152MS | RTCC_INTERNAL ; // W-Dog: 2x, RTCC: int. clock//WDT_2304MS //ta komanda briçe TMR0 in zmoti IRQ,paçe dolga je zato ni primerna--> setup_counters(RTCC_INTERNAL,WDT_1152MS); enable_interrupts(RTCC_ZERO); enable_interrupts(GLOBAL); // INTCON = GLOBAL | RTCC_ZERO; // OmogoŸi prekinitve za RTCC } /*****************/ /* I N C L U D E */ /*****************/ #include "lcd_uk63.icp" #include "ds1820.icp" void Print_temp(void) { char temp_decimalke; temp_decimalke = '0'; if (bit_test(temperatura,0)) temp_decimalke = '5'; #ifdef UPORABLJAM_LCD // printf(lcd_putc,"\rTemp. = "); // printf(lcd_putc,"\n"); // printf(lcd_putc," C "); printf(lcd_putc,"\rTemp. = \n%3d.%c C ",(int)temperatura>>1,temp_decimalke); #endif printf("\r\nTemp. = %3d.%c C ",(int)temperatura>>1,temp_decimalke); } void Error(int stev) { #ifdef UPORABLJAM_LCD printf(lcd_putc,"\fError:%d",stev); #endif printf("\nError:%d",stev); while(1); //Ÿaka na wdt_reset } void Run(void) { BYTE korak0,korak1,korak2; //,korak3; korak0 = 1; //korak0 = merejenje temperature korak1 = 1; //korak1 = nadzor temperature korak2 = 1; //korak2 = nadzor Ÿasa trajanja operacij #ifdef UPORABLJAM_LCD // lcd_init(); #endif while (1) { Inicializacija_periferije(); //za vsak primer Ÿe bi se kaj pokvarilo restart_wdt(); //----- zaŸetek korakov0 if (korak0 == 1) { if (Start_meritve_ds1820()) { stot_sek0 = 250; plpl_korak0: ++korak0; continue; } if (!stot_sek0) { //Ÿe v 2.5s ni naslednjega koraka0 javi da ni sonde Error(3); } } if (korak0 == 2) { if (Konec_meritve_ds1820()) { stot_sek0 = 250; goto plpl_korak0; } if (!stot_sek0) { //Ÿe v 2.5s ni naslednjega koraka0 javi da ni sonde Error(3); } } if (korak0 == 3) { if (Beri_temp_ds1820()) { temperatura = temp_ds1820; // Ÿe je uspeçno prebral stot_sek0 = 250; korak0 = 1; Print_temp(); } if (!stot_sek0) { //Ÿe v 2.5s ni naslednjega koraka0 javi da ni sonde Error(3); } } } // konec zanke while 1 } //konec funkcije RUN void main() { PORTA=0; PORTB=0; while (1) { Inicializacija_periferije(); //da se odprejo izhodni tris #if 0 while (1) { printf("\nTx dela ! "); delay(1000); restart_wdt(); } #endif #ifdef UPORABLJAM_LCD lcd_init(); #endif #ifdef UPORABLJAM_LCD printf(lcd_putc,"\rDisplej del "); delay_ms(500); #endif Run(); } // konec while 1 } // konec main /*************************************/ /* P R E K I N I T E V _ T I M E R 0 */ /*************************************/ unsigned int interrupt_counter; #include "ram_irq.icp" void Prekinitev_timer0(void) { // KVARC == 4Mhz vsakih 1us*256 = 256us se izvaja rutina #include "zac_irq.icp" //TIMERJI ZA PROCESE if (interrupt_counter==0) {// vsakih 10ms if(stot_sek_ds1820!=0) --stot_sek_ds1820; if(stot_sek0!=0) --stot_sek0; if(stot_sekLong!=0) --stot_sekLong; interrupt_counter=39; //39*256us je 99.84ms = 1/100 sek } else interrupt_counter--; #include "kon_irq.icp" }