#include #include #define SDI P1_3 // #define SDO P3_0 // LTC2418 #define CS P3_1 // #define SCK P1_4 // static unsigned int disp = 0; // disp je brojac koji odredjuje koji displej radi static unsigned int cif[4]; // niz koji pamti cetiri cifre koje se prikazuju na displeju - bez znaka unsigned long int var,temp,zad; unsigned long int read_ltc2418(); int br,y,f,flag=0,enab=1; void delay(void) { unsigned int liCounter; // pauza for(liCounter=0; liCounter<128; liCounter++){}; } void Ext_Int (void) interrupt 0 // { // EA = 0; // // for(y=0;y<50000;y++); // // potvrdjivanje alarma i iskljucivanje P1_2 = 0; // flag = 0; // enab = ~enab; // // EA = 1; // } // void Displej (void) interrupt 1 { EA = 0; // zabrana prekida TH0 = 0xF0; TL0 = 0x00; P1_0 = 0; // P1_1 = 0; // P3_6 = 0; // gasenje svih displeja P3_7 = 0; // switch(cif[disp]) // biranje cifre { case 0: P2 = ~0xEE; break; // case 1: P2 = ~0x60; break; // case 2: P2 = ~0xCD; break; // case 3: P2 = ~0xE9; break; // case 4: P2 = ~0x63; break; // izgled cifara koje se prikazuju na displejima case 5: P2 = ~0xAB; break; // case 6: P2 = ~0xAF; break; // case 7: P2 = ~0xE0; break; // case 8: P2 = ~0xEF; break; // case 9: P2 = ~0xEB; break; // } switch(disp) // biranje koji displej radi { case 0: P1_0 = 1; P1_1 = 0; P3_6 = 0; P3_7 = 0; P2_4 = 1; break; case 1: P1_0 = 0; P1_1 = 1; P3_6 = 0; P3_7 = 0; P2_4 = 1; break; case 2: P1_0 = 0; P1_1 = 0; P3_6 = 1; P3_7 = 0; P2_4 = 0; break; // P2_4 je tackica case 3: P1_0 = 0; P1_1 = 0; P3_6 = 0; P3_7 = 1; P2_4 = 1; disp = -1; break; } disp++; // disp sadrzi informaciju o tome koji displej se sledeci pali EA = 1; // dozvola prekida } /*------------------------------------------------ MAIN C function ------------------------------------------------*/ void main (void) { SCK = 0; CS = 1; SDI = 0; TMOD = (TMOD & 0xF0) | 0x01; /* Set T/C0 Mode */ ET0 = 1; /* Enable Timer 0 Interrupts */ TR0 = 1; /* Start Timer 0 Running */ TH0 = 0xF0; TL0 = 0x00; TL1 = 0x00; TH1 = 0x00; ET1 = 1; /* Enable Timer 1 Interrupts */ TR1 = 1; /* Start Timer 1 Running */ IT0 = 0; // prekid na zadnju ivicu EX0 = 1; // dozvola spoljasnjeg prekida EA = 1; /* Global Interrupt Enable */ P1_2 = 0; // alarm while (1) { if(f==1) { var = 0x00; var = read_ltc2418(); // pozivanje funkcije temp = var; cif[0] = var / 1000; // var = var - cif[0]*1000; // cif[1] = var / 100; // var = var - cif[1]*100; // izvlacenje cifara iz promenljive var cif[2] = var / 10; // var = var - cif[2]*10; // cif[3] = var; // var = 0x00; f=0; } switch(P0) { case 254: zad = 1340; break; // pos 1 134,0 case 253: zad = 1350; break; // pos 2 135,0 case 251: zad = 1360; break; // pos 3 136,0 case 247: zad = 1370; break; // pos 4 137,0 biranje temperature prekidacem case 239: zad = 1380; break; // pos 5 138,0 case 223: zad = 1390; break; // pos 6 139,0 } if(temp>zad) { flag = 1; // dostizanje zeljene vrednosti } if(temp<=zad && flag == 1 && enab == 1) { P1_2 = 1; // ukljucivanje alarma ukoliko temperatura padne ispod zeljene } } } unsigned long int read_ltc2418() // funkcija za komunikaciju sa LTC-om { unsigned long int g_sliData; unsigned long int i = 4194304; g_sliData =0; SCK = 0; SDI = 1; CS = 0; while(SDO); // Wait for EOC Low delay(); while(i) // i uzima vrednost od 4194304 do 1 { if(SDO) g_sliData += i; SCK = 1; delay(); SCK = 0; // "i" u pocetku ima vrednost 4194304 i/=2; // i pri svakoj iteraciji se prepolovljuje } //dok se ne izađe iz petlje CS = 1; g_sliData = g_sliData / 1024; g_sliData = g_sliData * 1.2213; // otpornost g_sliData = (g_sliData - 1000) * 2.617801047; // temperatura u stepenima Celzijusa return g_sliData; } void timer1_ISR (void) interrupt 3 { EA = 0; // zabrana prekida br++; // brojac prekida if(br == 65) // ulazak u if petlju na svakih 250 prekida { TL1 = 0x00; TH1 = 0x00; f=1; br = 0; // resetovanje brojaca } else { f=0; } EA = 1; // dozvola prekida }