Nedávno jsem se rozhodl naprogramovat procesor ATmega pro odesílání zpráv do APRS . ATmega je používám spolu s FX614. Po všech testech se vše jevilo korektně, nyní však vyvstal problém který je pravděpodobně způsoben chybným výpočtem kontrolního součtu FCS v paketu. Mohu se prosím zeptat jakým způsobem se provádí kontrolní součet z kolika bytu se součet provádí. velice děkuji tomáš OK5TVR
Ahoj, zkus kouknout sem:
http://cs.nju.edu.cn/yangxc/dcc_teach/fcs-calc.pdf
http://www.ntcip.org/forum/NTCIP/msg00017.html
Ahoj,
tady je vytvořený program ve bascom jedná se zatím pouze o odesílání dat nadefinovaných do tabolky dat1:.
buhužel je asi kvuli špatnému výpočtu kontrolního součtu nefunkční. ale pro jistotu přikládám kod třeba se někomu podaří modifikace která bude funkční. ahoj tomáš OK5tvr
p.s. nadále pokračuji ve vývoji.
____________________
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 50
$framesize = 50
$baud = 1200
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , _
Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6
Config Portc.3 = Output
Config Portc.5 = Output
'Typ Displeje
Config Lcd = 16 * 2
Cls
Cursor Off
Dim Count As Byte
Dim Count1 As Byte
Dim Count1b As Byte
Dim Count1c As Byte
Dim B1 As Byte
Dim B2 As Byte
Dim B3 As Byte
Dim P1 As Byte
Dim O1 As Byte
Dim O2 As Byte
Dim S(27) As Byte
Dim Fcs_v As Word
Do
'portc.3 k ovládání ptt
Portc.3 = 1
Gosub Flag
Gosub Flag
Gosub Flag
'odesílá 27 bytu z tabulky
Restore Dta1
For Count = 1 To 27
Read B1
S(count) = B1
For Count1 = 0 To 7 'převod bytu na jednotlivé bity a odeslání
Rotate B1 , Left , 1
B2 = B1 And &H01
Portc.5 = B2
Waitus 745 'zpoždění 745 us pro badovou rychlost 1200
If B2 = 1 Then P1 = P1 + 1 'počítá kolik bit 1 bylo odeslání
If B2 = 0 Then P1 = 0
If P1 = 5 Then 'pokud 5 za sebou odešle 0
Portc.5 = 0
Waitus 745
End If
Next Count1
Next Count
Fcs_v = Crc16uni(s(1) , 27 , &HFFFF , &H8408 , 0 , 0) 'výpočet kontrolního součtu z 27 bytů určených k odeslání
Gosub Fcs
Gosub Flag
Gosub Flag
Gosub Flag
Portc.3 = 0
Wait 2
Loop
End
'tabulka dat určená k odeslání
Dta1:
Data &H86 , &HA2 , &H40 , &H40 , &H40 , &H40 , &H60 , &HAE , &H64 , &H8C , &HA6 , &H40 , &H40 , &H68 , &H4A , &H8A , &H98 , &H82 , &HB2 , &H40 , &H61 , &H03 , &HF0 , &H54 , &H65 , &H73 , &H74
'odeslání flagu
Flag:
B3 = &H7E
For Count1b = 0 To 15
Rotate B3 , Left , 1
B2 = B3 And &H01
Portc.5 = B2
Waitus 745
Next Count1b
Return
'kontrolní součet
Fcs:
B3 = &H28 'odeslání fsc nízkého bytu
For Count1c = 0 To 7
Rotate B3 , Left , 1
B2 = B3 And &H01
Portc.5 = B2
Waitus 745
If B2 = 1 Then P1 = P1 + 1
If B2 = 0 Then P1 = 0
If P1 = 5 Then
Portc.5 = 0
Waitus 745
End If
Next Count1c
B3 = &H15 'odeslání fsc bysokého bytu
For Count1c = 0 To 7
Rotate B3 , Left , 1
B2 = B3 And &H01
Portc.5 = B2
Waitus 745
If B2 = 1 Then P1 = P1 + 1
If B2 = 0 Then P1 = 0
If P1 = 5 Then
Portc.5 = 0
Waitus 745
End If
Next Count1c
Return
Ahoj Tome,
sice atmel moc neznam, ani primo konstrukci AX-25 ramce, ale v tom kodu, ktery jsi dal k nahlednuti, mi je divna jedna vec. Cekal bych, ze data budou odesilany po jednotlivych bytech, postupne bud od spodniho nebo od horniho bitu. Prijde mi ale, ze tak, jak to mas napsane, se Tve bity odesilaji v tomto poradi: 2 3 4 5 6 7 8 1. Nejdriv delas rotaci doleva a az pak vybiras bit na prvni pozici (AND 01). Nemelo by to byt naopak? Tj ze nejdriv si pomoci AND vyberes prvni bit a az pak provedes rotaci?
Martin ok1djo
v prvním případě jsem to měl stejně, ale byl problém když jsem nechal vše vypsat binárně na port.
mělo být odesláno 01000111 a odeslalo se 10100011, pri tomto zápisu se odešle 01000111 takže toto je snad správně.
tomáš