 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
eddie Član

Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 723 Aktiv.: 3.05 Kraj: Severna primorska
|
Objavljeno: Pet Dec 21, 2007 7:35 pm Naslov sporočila: avr, modbus, crc16 |
|
|
Pozdravljeni!
Na atmega 48 poizkušam vzpostaviti modbus slavea. Programiram v bascom-avr okolju. Bascom ima med sampli primer modbus slavea ampak po mojih testiranjih ne deluje. Ugotovil sem, da se zalomi pri preračunavanju pravilnosti prenosa(crc).
Verjetno je problem v napačni začetni vrednosti algoritma crc(0), saj modbus uporablja crc, katerega začetna vrednost je -1!
Poizkušal sem predelati kodo, ki je v helpu:
Koda: |
Public Function CRC16(buf() As Byte, lbuf As Integer) As Integer
Dim CRC1 As Long
Dim b As Boolean
CRC1 = 0 ' init CRC
For i = 1 To lbuf ' for each byte
CRC_MSB = CRC1 \ 256
crc_LSB = CRC1 And 255
CRC_MSB = CRC_MSB Xor buf(i)
CRC1 = (CRC_MSB * 256) + crc_LSB
For J = 0 To 7 Step 1 ' for each bit
CRC1 = shl(CRC1, b)
If b Then CRC1 = CRC1 Xor &H1021
Next J
Next i
CRC16 = CRC1
End Function
'Shift Left function
Function shl(n As Long, ByRef b As Boolean) As Long
Dim L As Long
L = n
L = L * 2
If (L > &HFFFF&) Then
b = True
Else
b = False
End If
shl = L And &HFFFF&
End Function
|
Ampak imam težave pri precej osnovnih stvareh:
nikakor mi ne uspe, da bi ta del kode uporabil kot funkcijo, ki bi jo poklical iz glavnega prgrama.
Prišel sem tako daleč, da sem ugotovil, da jo moram funkcijo najprej deklarirati, prej kot jo lahko kličem, do konca pa mi ne uspe... bascom javlja kar neke čudne errorje...
Poizkušal sem nekako takole:
Koda: |
'Glavni program...
'Deklaracije vseh potrebnih stvari od baudrate-a, spremenljivk, vrednosti kristala, stacka,...
Dim polje(8) As Byte
Declare Public Function CRC16(buf() As Byte, lbuf As Integer) As Integer
Do
Crc = Function CRC16(polje(),6)
Loop
End 'program
Public Function CRC16(buf() As Byte, lbuf As Integer) As Integer
Dim CRC1 As Long
Dim b As Boolean
CRC1 = 0 ' init CRC <- TALE VREDNOST BI MORALA BITI -1!!!!!
For i = 1 To lbuf ' for each byte
CRC_MSB = CRC1 \ 256
crc_LSB = CRC1 And 255
CRC_MSB = CRC_MSB Xor buf(i)
CRC1 = (CRC_MSB * 256) + crc_LSB
For J = 0 To 7 Step 1 ' for each bit
CRC1 = shl(CRC1, b)
If b Then CRC1 = CRC1 Xor &H1021
Next J
Next i
CRC16 = CRC1
End Function
'Shift Left function
Function shl(n As Long, ByRef b As Boolean) As Long
Dim L As Long
L = n
L = L * 2
If (L > &HFFFF&) Then
b = True
Else
b = False
End If
shl = L And &HFFFF&
End Function
|
Kje bi moral deklarirati funkcijo shl? V glavnem programu ali v funkciji Crc16?
Hvala za pomoč!
Lp, eddie |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|