Originally Posted by
Salutatous
Sorry but comments are in French
This prog run with other industrial modbus material! (tested)
'Programme VigiBar pour pic 16F84A
'Adresse EEPROM 00=Version du logiciel =>3.0
'Adresse EEPROM 01=Adresse station de 1 à 255 => var:Station / question 2
'Adresse EEPROM 02=Vitesse en bauds => var: BR /question 3
'Vitesse de com 19200 = 32 = $20
'Vitesse de com 9600 = 84 = $54
'Vitesse de com 4800 =188 = $BC
'Adresse EEPROM 03/04=A pour correction de type ax+b => var:A /question 4
'Adresse EEPROM 05/06=B pour correction de type ax+b => var:B / question 5
'----------------------------
DEFINE OSC 8
CRC_Ok VAR BIT
BRx_Ok VAR BIT
i VAR BYTE 'Boucles
j VAR BYTE 'Boucles
Val_AD VAR BYTE 'Valeur AD
Station VAR BYTE 'N° de la station, changer dans EEPROM par Write 1,x
BR VAR BYTE 'Vitesse de transmission, changer dans EEPROM par Write 2,x
Nbr VAR BYTE 'Nbre des byte à recevoir ou transmettre
CRCL VAR BYTE 'pour entrer low crc
CRCH VAR BYTE 'pour entrer high crc
CRC16 VAR WORD 'Valeur du CRC
A VAR WORD 'A pour correction ax+b
B VAR WORD 'B pour correction ax+b
hPa VAR WORD 'Résultat apres correction de AD par ax+b
BufRx VAR BYTE[8] 'Buffer de réception
BufTx VAR BYTE[8] 'Buffer de transmission
'led VAR PORTB.7 'Led sur PORTB.7
RS485 VAR PORTB.0 'Bascule de rs485
InOut VAR PORTB.1 'Com i/o de rs485
AD VAR PORTB.2 'Résultat analogique/digital
Clk VAR PORTB.3 'Horloge du convertisseur AD
CS VAR PORTB.4 'Bascule convertisseur AD
INCLUDE "modedefs.bas"
EEPROM 0,[30,2,84,1,1,0,0] 'Version, N° station, Vitesse de transmission, aH, aL, bH, bL
Init:
Low RS485 'RS en attente reception
For i=0 to 7 'Initialise le tableau de communication
BufRx[i]=0
BufTx[i]=0
Next i
High CS
Read 1,Station
Read 2,BR
Read 3,A.HighByte
Read 4,A.LowByte
Read 5,B.HighByte
Read 6,B.LowByte
GoTo Principal
Principal:
'Boucle principale
Nbr=8
SerIn2 InOut,BR,5,Principal,[STR BufRx\Nbr] 'max 5ms entre car timeout
IF (BufRx[0]=Station) Then
For i=0 to 7
BufTx[i]=BufRx[i] 'Permet economie de code, CRC & prépa réponse
Next i
BRx_Ok=1
GoSub Calcul_CRC16
IF (CRC16.LowByte<>BufRx[6]) OR (CRC16.HighByte<>BufRx[7]) Then
CRC_Ok=1
Else
CRC_Ok=0
EndIF
IF (BufRx[1]=3)OR (BufRx[1]=4) Then 'Question lecture /It's read
'Err pas traité (BufRx[2]<>0) AND (BufRx[4]<>0)
***************Some work************************
IF (BufRx[1]=6)AND (BufRx[2]=0) Then 'C'est une écriture /It's write
******************Some work*********************
EndIF
IF (BRx_Ok=1) Then 'Toute autre valeur de BufRx[1] #3,4,6
Nbr=5 'Erreur
BufTx[1]=BufRx[1]+128
BufTx[2]=1
EndIF
IF (CRC_OK=0) Then 'Réponse si CRC est OK
High RS485
GoSub Calcul_CRC16
CRCL=Nbr-2
CRCH=Nbr-1
BufTx[CRCL]=CRC16.LowByte
BufTx[CRCH]=CRC16.HighByte
SerOut2 InOut,BR,[STR BufTx\Nbr]
'High led
For i=0 to 7 'Evite la boucle avec anciennes valeurs
BufRx[i]=0
Next i
Low RS485
EndIF
EndIF
GoTo Principal
Calcul_CRC16:
CRC16=$FFFF
For i=0 to Nbr-3
CRC16=CRC16^BufTx[i]
For j=1 to 8
IF CRC16.Bit0=1 Then
CRC16=$A001^(CRC16>>1)
Else
CRC16=CRC16>>1
EndIF
Next j
Next i
Return
End
Bookmarks