'******************************************************************* ' Program name temperature ' Start Date 12nd.Feb.2010 ' Author Yoshio KATO ' Description : Used MCU ATtiny2313 ' : System Clock 8MHz Internal OSC ' : PORTD for AD converter '******************************************************************* $regfile = "attiny2313.dat" $crystal = 8000000 'internal clock 8MHz Dim I As Byte Dim Addata As Word , Wk As Word Dim Temp_save As Word Dim Humidity_save As Word Dim Temp As Word Dim Humidity As Byte ' humidity 'temperature Dim Wk1 As Byte Dim Tmcount As Byte Dim Ch_no As Byte Config Porta = &H7 Config Portb = &HFF Config Portd = &HFD Const Clk = 0 'PD0 Const Dout = 1 'PD1 Const Din = 2 'PD2 Const Cs = 3 'PD3 Const Digit1 = 0 Const Digit2 = 1 Const Digit3 = 4 Const Digit4 = 5 Const Digit5 = 6 Const Digit6 = 7 Const Temp_alm1 = 500 'alarm1 temperature Const Temp_alm2 = 600 'alarm1 temperature Dim Segdata(14) As Byte Main: ' Stop Ac Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 Ocr0a = 77 '8000000/1024=7812.5Hz 7812.5/(77+1)=100.16 about 100Hz=10ms On Oc0a Tmovf ' if timer0 overflow go to Tmovf interrupt routine Enable Oc0a Enable Interrupts '7segment data Segdata(1) = &HC0 ' 0 a,b,c,d,e,f Segdata(2) = &HF9 ' 1 b,c Segdata(3) = &HA4 ' 2 a,b,d,e,g Segdata(4) = &HB0 ' 3 a,b,c,d,g Segdata(5) = &H99 ' 4 b,c,f,g Segdata(6) = &H92 ' 5 a,c,d,f,g Segdata(7) = &H82 ' 6 a,c,d,e,f,g Segdata(8) = &HD8 ' 7 a,b,c,f Segdata(9) = &H80 ' 8 a,b,c,d,e,f,g Segdata(10) = &H90 ' 9 a,b,c,d,f,g Segdata(11) = &HBF 'display only g segment as minus Segdata(12) = &HFE 'when over 50 degree, a segment on Segdata(13) = &HFD 'when over 60 degree, b segment on Segdata(14) = &HFB 'reset flip flop Tmcount = 0 Wk = 13 Gosub Dispdata 'FlipFlop reset Waitms 1 Do 'ever loop Temp = Temp_save If Temp >= Temp_alm1 Then 'if temperature is over the alarm temperature, relay on Wk = 11 If Temp >= Temp_alm2 Then Wk = 12 End If Gosub Dispdata Reset Portb.digit6 'segment a on => relay power on Waitms 1 End If If Temp < 0 Then 'minus Temp = Temp * -1 Wk = 10 Gosub Dispdata If Temp < 100 Then 'change minus position Reset Portd.digit5 Else Reset Portb.digit6 End If Waitms 4 End If Wk = Temp Mod 10 'temp 0.1 Gosub Dispdata Reset Portd.digit3 Waitms 4 Temp = Temp / 10 Wk = Temp Mod 10 Gosub Dispdata Reset Portd.digit4 Waitms 4 Temp = Temp / 10 Wk = Temp Mod 10 'Portb = Segdata(wk + 1) If Wk <> 0 Then 'if temperature less than 10 degree ,zero suppresion Gosub Dispdata Reset Portd.digit5 End If Waitms 4 Humidity = Humidity_save 'humidity Wk = Humidity Mod 10 Gosub Dispdata Reset Porta.digit1 Waitms 4 Wk = Humidity / 10 Gosub Dispdata Reset Porta.digit2 Waitms 4 Loop End '******************************************************************* ' Out 7 segments data to PORTB ' Select digit by digit data '******************************************************************* Dispdata: Portb = &HFF Set Porta.digit1 Set Porta.digit2 Set Portd.digit3 Set Portd.digit4 Set Portd.digit5 Set Portb.digit6 Waitus 100 Portb = Segdata(wk + 1) Return '******************************************************************* ' Timer1 interrupt ' Interrupt ever 10ms ' Get data from A/D converter '******************************************************************* Tmovf: Tmcount = Tmcount + 1 If Tmcount >= 100 Then 'every 1000ms call getad Tmcount = 0 Ch_no = 0 Gosub Get_ad_converter Temp_save = Addata - 600 Ch_no = 1 Gosub Get_ad_converter Humidity_save = Addata / 10 End If Return '******************************************************************* ' Clock for A/D converter '******************************************************************* Clockout: Reset Portd.clk 'clock low Waitus 1 'wait 50 micro second Set Portd.clk 'clock high Waitus 1 'wait 50 micro second Return '******************************************************************* ' get data from A/D converter '******************************************************************* Get_ad_converter: Reset Portd.cs 'A/D converter CS low Waitus 1 'waite 50micro second Set Portd.din 'start pulse high Gosub Clockout Set Portd.din 'signal mode high Gosub Clockout Reset Portd.din Gosub Clockout 'clock for d2 Gosub Clockout 'clock for d1 If Ch_no = 1 Then Set Portd.din 'channel number 2 humidity End If Gosub Clockout 'clock for d0 Reset Portd.din '2 zero pulse Gosub Clockout 'clock for sampling Gosub Clockout 'clock for null bit Addata = 0 'clear A/D data For I = 1 To 12 Shift Addata , Left , 1 'logical shift left 1 bit Reset Portd.clk 'clock low Waitus 1 'wait 50 micro second If Pind.dout = 1 Then 'check data bit Set Addata.0 'data bit is high End If Set Portd.clk 'clock high Waitus 1 'wait 50 micro second Next I Set Portd.cs 'cs high Return