0% found this document useful (0 votes)
104 views5 pages

Firmware Master JCF

This document contains code for a firmware master that collects sensor data from slave devices at set time intervals. It summarizes: 1) The firmware master collects data such as temperature, CO2 levels, and heating status from slave devices every set interval in seconds and stores the values in variables. 2) It displays the collected data on an LCD and sends it to a PC via serial communication. 3) A real-time clock is used to keep time and the firmware can set the clock time via user input.

Uploaded by

RaJa Muda Arief
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
104 views5 pages

Firmware Master JCF

This document contains code for a firmware master that collects sensor data from slave devices at set time intervals. It summarizes: 1) The firmware master collects data such as temperature, CO2 levels, and heating status from slave devices every set interval in seconds and stores the values in variables. 2) It displays the collected data on an LCD and sends it to a PC via serial communication. 3) A real-time clock is used to keep time and the firmware can set the clock time via user input.

Uploaded by

RaJa Muda Arief
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

1

Firmware Master (Betreuer)


'MMR Projet Master JCF

'Mess-Intervall in Sekunden (Zeit zwischen 2 Aufzeichnungen) Dim Minterval As Word Dim Ee_minterval As Eram Word

$regfile = $crystal = $hwstack = $swstack = $framesize

"8535def.dat" 4000000 100 100 = 100

' I2C-Pins Config Sda = Portc.1 Config Scl = Portc.0

'variables for real time clock Config Clock = User Config Date = Dmy , Separator = . Dim Weekday As Byte Config Lcd = 20 * 2 Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , Db4 = Portc.4 , E = Portc.3 , Rs = Portc.2 Config Watchdog = 2048 Stop Watchdog Config Portb.0 = Output Config Portd.2 = Input Portd.2 = 1 Config Portd.6 = Output Portd.6 = 1 'LED 'Taster 'Pullup Taster 'Tristate= R/W\ 'erst mal tristate

'Timer1 fr 1s - Interrupt Ocr1ah = High(15624) Ocr1al = Low(15624) Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Disconnect On Oc1a Timer1_isr Enable Oc1a Enable Interrupts Dim Secticks As Long Dim New_flag As Bit

'Software-UART to send and read to and from the station Open "comd.4:9600,8,n,1" For Output As #1 Open "comd.3:9600,8,n,1" For Input As #2 'Hardware-UART zur Kommunikation mit dem PC $baud = 9600 'Input byte Dim Ok As Byte 'Speicherplatz fr einkommende Daten Dim Secs As Long Dim Temperature_outside As Single Dim Temperature_inside As Single Dim Temperature_inside_near As Single Dim Onflag As Byte Dim Co2valid As Byte Dim Co2value As Word Dim Heatingpercent As Byte

Dim Commandflag As Bit 'temporary variables Dim Btmp As Byte Dim I As Byte Dim S(10) As String * 10 Dim Stmp As String * 4

2
'test Dim J As Byte Dim S1 As String * 1 'Total time in seconds (master time) Dim Masterseconds As Long '------------------------------------------------------------------------------' MAIN '------------------------------------------------------------------------------'Messintervall (zur Sicherheit Default-wert 600s) Minterval = Ee_minterval If Minterval = 0 Then Minterval = 10 If Minterval = &HFFFF Then Minterval = 10 'Uhrzeit bereit haben fr 1. Messung! Gosub Readclock Cls Lcd "Master station ready" Print "Master station ready" Print "Interval = " ; Minterval Print ",Date, Time, Master-Seconds, Slaveticks, Temp. outside,"; Print " Temp. inside far, Temp inside near, Heating 1/0, CO2[ppm],Heating%" Commandflag = 1 Waitms 50 Start Watchdog '------------------------------------------------------------------------------Do 'if button pushed: measure Debounce Pind.2 , 0 , Readvalues , Sub 'when time is ready to measure: do it If Commandflag = 1 Then Gosub Getdata Gosub Printvalues Gosub Displaylcd End If 'connection OK? If not watchdog resets uC Reset Watchdog 'input from terminal? Ok = Inkey() Gosub Dispatchinput Waitms 10

Loop

'------------------------------------------------------------------------------Dispatchinput: 'dispatch input from terminal Stop Watchdog Select Case Ok 'On "s" from terminal set time + date Case "s" Gosub Setclock

'on "t" from terminal set time interval Case "t" Print "Current interval: " ; Minterval Input "time interval in secs:" , Minterval Ee_minterval = Minterval

'On "m" : measure! Case "m" Commandflag = 1

'on "?" help Case "?"

3
Print "s = set clock" Print "t = set time interval" Print "m = force measure"

End Select Start Watchdog Return '------------------------------------------------------------------------------Getdata: 'get data from measuring station

'LED Set Portb.0.0 'make cable driver ready to transmit Portd.6 = 0 Waitms 5 'Command to station Print #1 , "*"; Waitms 10 'switch cable driver to read data Portd.6 = 1

'Read 8 pieces of data terminated by CR For I = 1 To 8 Input #2 , S(i) Reset Watchdog Next I 'correction if LF (10) left in the buffer ' (this occurs on all but first item, as input cuts behind the CR) For I = 1 To 8 If Left(s(i) , 1) = Chr(10) Then S(i) = Mid(s(i) , 2) Reset Watchdog Next I '''Print : Print : Print 'Assign data to variables for processing Secs = Val(s(1)) Temperature_outside = Val(s(2)) Temperature_inside = Val(s(3)) Temperature_inside_near = Val(s(4)) Onflag = Val(s(5)) Co2valid = Val(s(6)) Co2value = Val(s(7)) Heatingpercent = Val(s(8)) Commandflag = 0 'LED Reset Portb.0 Return '------------------------------------------------------------------------------Printvalues: 'TAB so values begin in 2. column Print Chr(9);

'clock Gosub Printclock '''Reset Watchdog 'Echo values to PC Print Print Print Print Print Secs; Chr(9); Temperature_outside; Chr(9); Temperature_inside;

4
Print Chr(9); Print Temperature_inside_near; Print Chr(9); Print Onflag ; 'Print Chr(9); 'Print Co2valid ; Print Chr(9); Print Co2value; Print Chr(9); Print Heatingpercent '''Reset Watchdog Return '------------------------------------------------------------------------------Displaylcd: Locate 2 , 1 : Lcd Spc(20) 'Locate 1 , 1 : Lcd Secs Locate 2 , 1 : Stmp = Fusing(temperature_outside , "##.#") : Lcd Stmp Locate 2 , 10 : Lcd Co2value '''Reset Watchdog Return '------------------------------------------------------------------------------Readvalues: Commandflag = 1 Return '------------------------------------------------------------------------------Timer1_isr: 'Jede Sekunde 'Gosub Readclock Gosub Lcdclock (frher)

Incr Secticks If Secticks >= Minterval Then Commandflag = 1 Secticks = 0 End If Incr Masterseconds '''Toggle Portb.0 Return '------------------------------------------------------------------------------Lcdclock: 'display time + date Locate 1 , 1 : Lcd Spc(20) : Locate 1 , 1 '''Lcd _hour : Lcd ":" : Lcd _min : Lcd ":" : Lcd _sec Lcd Time$ Locate 1 , 10 '''Lcd _day : Lcd "." : Lcd _month : Lcd ".20" : Lcd _year Lcd Date$ '''Reset Watchdog Return '------------------------------------------------------------------------------Printclock: 'Lsyssec = Syssec(seconds) Print Lsyssec; Print Chr(9);

' '

'Print _day; Print "." ; Print _month; Print "." ; Print _year; Print " "; Print _hour; Print ":"; Print _min; Print ":"; Print _sec; Print Date$; Print Chr(9); Print Time$; Print Chr(9); Print Syssec(); '''Print Masterseconds; Print Chr(9); Return '------------------------------------------------------------------------------' ' ' ' ' ' ' ' ' '

5
Getdatetime: 'must be called so, because BASCOM looks for it when TIME$ and DATE$ is used Readclock: 'this is the prevous name 'Read real time clock DS1307 'set register pointer to 0 I2cstart I2cwbyte &HD0 I2cwbyte 0 I2cstop 'read registers I2cstart I2cwbyte &HD1 I2crbyte _sec , Ack I2crbyte _min , Ack I2crbyte _hour , Ack I2crbyte Weekday , Ack I2crbyte _day , Ack I2crbyte _month , Ack I2crbyte _year , Nack I2cstop ' Jahr 'convert BCD to decimal _sec = Makedec(_sec) _min = Makedec(_min) _hour = Makedec(_hour) _day = Makedec(_day) _month = Makedec(_month) _year = Makedec(_year) Return '------------------------------------------------------------------------------Setclock: 'set new time and date and eventually turn on oscillator + SQW out 'to init clock: oscillator must be turned on (bit7=0 in register 0 ) 'to turn on SQW/OUT: bit 4 = 1 in register 7 (Control register) 'both are done automatically (if Seconds <60)

'input new time Input "Day (1-31):" , _day Input "Month (1-12):" , _month Input "Year (00-99):" , _year Input "Hour (0-23):" , _hour Input "Minutes (0-59):" , _min Input "Seconds (0-59):" , _sec _sec = Makebcd(_sec) _min = Makebcd(_min) _hour = Makebcd(_hour) _day = Makebcd(_day) _month = Makebcd(_month) _year = Makebcd(_year)

'write to DS1307 I2cstart I2cwbyte &HD0 I2cwbyte 0 'Register 0 for secs I2cwbyte _sec 'Seconds I2cwbyte _min 'Minutes I2cwbyte _hour 'Hours I2cwbyte Weekday 'Weekday I2cwbyte _day 'Day I2cwbyte _month 'Month I2cwbyte _year 'Year I2cwbyte &H10 'SQW enabled I2cstop Return '-------------------------------------------------------------------------------

You might also like