Velem van a baj, a bascom verziómmal vagy tényleg nem lehet atmega 8 nál használni a soros megszakítást?
Kód: Egész kijelölése
Config Serialin = Buffered , Size = 30 , Bytematch = 10
Kód: Egész kijelölése
Config Serialin = Buffered , Size = 30 , Bytematch = 10
Kód: Egész kijelölése
$regfile = "m8def.dat"
$crystal = 11059200
$baud = 9600
$hwstack = 110
$swstack = 110
$framesize = 60
Config Sda = Portc.4
Config Scl = Portc.5
Config Serialin = Buffered , Size = 64 , Bytematch = &H10
Enable Interrupts
$include "init_rs485.inc"
Reset Rs485dir
Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Olvas As Byte
Mytype = "slave"
Const Myname = "[01_slave]"
Thisslave = "01"
Olvas = 0
'******** Main program **************************
Call Startconvert
Do
If Olvas > 0 Then Gosub Rs485cmd
'Call Readtemp(tempmsb)
Print Tempmsb
Waitms 500
Loop
'******** end main program **********************
Rs485cmd:
Call Get_line(tmp_line , Flag , Error)
If Flag = 1 Then
Select Case G_cmd
Case "[what]" : Call Send_line(thisslave , Myname )
Case "[temp]" : Call Readtemp(tempmsb)
Case "[restart]" : Call Send_line(thisslave , "[Init. done]")
End Select
End If
Decr Olvas
Return
End
$include "subs_rs485.inc"
Serial0charmatch:
Incr Olvas
Return
Kód: Egész kijelölése
'Include file
'
'*********************************************************************************
'
Sub Checksumm(chk_line As String)
Chk_a = 0
For Chk_n = 1 To Len(chk_line)
Chk_cs = Mid(chk_line , Chk_n , 1)
Chk_c = Val(chk_cs)
Call Calccrc
Next Chk_n
Chk_as = Hex(chk_a) : Chk_tmp2 = "0000" + Chk_as : Chk_as = Right(chk_tmp2 , 4)
Chk_tmp1 = Right(chk_as , 2) : Chk = Chk_tmp1 : Chk_tmp1 = Left(chk_as , 2)
Chk = Chk + Chk_tmp1
End Sub
'
'*********************************************************************************
'
Sub Calccrc
For Chk_v = 1 To 8
Chk_tmp4 = Chk_a Mod 2 : Chk_tmp3 = Chk_c Mod 2 : Chk_cy = Chk_tmp4 + Chk_tmp3
Chk_a = Chk_a / 2 : Chk_c = Chk_c / 2
If Chk_cy = 1 Then Chk_a = Chk_a Xor 40961
Next Chk_v
End Sub
'
'*********************************************************************************
'
Sub Send_line(s_slave As String , S_cmd As String)
Print
Waitms 100 'to get rid of garbage
If Type = "Master" Then
Tmp_line = "{" + S_slave + Sep + Master + Sep + S_cmd + Sep
Else
Tmp_line = "{" + Master + Sep + S_slave + Sep + S_cmd + Sep
End If
Call Checksumm(tmp_line)
Tmp_line = Tmp_line + Chk + "}" : Print Tmp_line : Tmp_line = " "
End Sub
'
'*********************************************************************************
'
Sub Get_line(tmp_line As String)
Error = 0
Flag = 1
If Type = "Master" Then
'Input Tmp_line Timeout = 40000 ' was 65436
Else
'slave
Input Tmp_line ' no timeout
End If
Chkstart = Left(tmp_line , 1)
If Chkstart = "{" Then
Dd = Mid(tmp_line , 2 , 2)
If Dd = Thisslave Or Dd = "99" Then
If Tmp_line = "" Then
Error = 4 : Flag = 0
Else
' {<dd>#<ss>#<cmd>#<crcl><crch>}
Tel = Len(tmp_line) : Tmp = Left(tmp_line , 1)
If Tmp = "{" Then
Tmp = Mid(tmp_line , 4 , 1)
If Tmp = Sep Then
Tmp = Mid(tmp_line , 7 , 1)
If Tmp = Sep Then
Teltmp = Tel - 5 : Tmp = Mid(tmp_line , Teltmp , 1)
If Tmp = Sep Then
Tmp = Right(tmp_line , 1)
If Tmp = "}" Then
Dd = Mid(tmp_line , 2 , 2)
If Type = "Master" Then
If Dd <> Master Then Flag = 0
Else
If Dd <> Thisslave And Dd <> "99" Then Flag = 0
End If
Ss = Mid(tmp_line , 5 , 2) : Teltmp = Tel - 13 : G_cmd = Mid(tmp_line , 8 , Teltmp)
Teltmp = Tel - 4 : S_chk = Mid(tmp_line , Teltmp , 4)
If Type = "Master"then
Tmp_line = "{" + Dd + Sep + Ss + Sep + G_cmd + Sep
Else
If Dd = "99" Then
Ddh = "99"
Else
Ddh = Thisslave
End If
Tmp_line = "{" + Ddh + Sep + Master + Sep + G_cmd + Sep
End If
Call Checksumm(tmp_line)
Tmp_line = Tmp_line + Chk + "}"
If Chk <> S_chk Then
Error = 3 : Flag = 0
End If
Else
Error = 9 : Flag = 0
End If
Else
Error = 8 : Flag = 0
End If
Else
Error = 7 : Flag = 0
End If
Else
Error = 6 : Flag = 0
End If
Else
Error = 5 : Flag = 0
End If
End If
If Flag = 0 Then G_cmd = ""
Else
Flag = 0
End If
Else
Flag = 0
End If
End Sub
'******** start convert *************************
Sub Startconvert()
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
End Sub
'************************************************
'******** read temperature **********************
Sub Readtemp(tempmsb As Byte)
'-------------
I2cstart
I2cwbyte &H90 'send adress byte
I2cwbyte &HAA 'send register byte
I2cstop
I2cstart
I2cwbyte &H91 'read register
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
Tempmsb = Tempmsb - 3
Call Send_line(thisslave , Tempmsb)
End Sub Readtemp
'************************************************
Kód: Egész kijelölése
'include-file init_benbus.inc
Dim Chk As String * 4
Dim Chk_a As Word
Dim Chk_as As String * 10
Dim Chk_c As Byte
Dim Chk_cs As String * 1
Dim Chk_cy As Word
Dim Chk_line As String * 100
Dim Chk_n As Word
Dim Chk_tmp1 As String * 8
Dim Chk_tmp2 As String * 8
Dim Chk_tmp3 As Word
Dim Chk_tmp4 As Word
Dim Chk_v As Word
Dim Chkstart As String * 1
Dim Dd As String * 2
Dim Ddh As String * 2
Dim Error As Byte
Dim Flag As Byte
Dim G_cmd As String * 20
Dim S_chk As String * 2
Dim S_cmd As String * 20
Dim S_slave As String * 2
Dim Ss As String * 2
Dim Tel As Integer
Dim Teltmp As Integer
Dim Tmp As String * 1
Dim Tmp_line As String * 255
Dim Mytype As String * 6
Dim Thisslave As String * 2
Declare Sub Calccrc
Declare Sub Checksumm(chk_line As String)
Declare Sub Get_line(tmp_line As String , Flag As Byte , Error As Byte)
Declare Sub Send_line(s_slave As String , S_cmd As String )
Declare Sub Readtemp(tempmsb As Byte)
Declare Sub Startconvert()
Const Master = "00"
Const Sep = "#"
'Activate RS485 driver (MAX485 DE)
Rs485dir Alias Pind.3
Config Rs485dir = Output
Kód: Egész kijelölése
Call Send_line(thisslave , Myname )