Witam,
potrzebuję zrobić komunikację miedzy 2 procesorami ATmega16. Jeden wysyła zmienną typu Byte (Status) z informacją o stanie wejść, a 2 to odbiera. Natomiast 2 będzie wysyłał do 1 także zmienną Byte (Settings) z informacjami konfiguracyjnymi. Dodatkowo chciałbym wysyłać sumę CRC w obu kierunkach. Transmisja w obu kierunkach jednocześnie!
Bity będą miały np takie znaczenie:
Po przeczytaniu kilku postów wiem, na co zwracać uwagę i co robić jak gubię znaki. W moim przypadku będę prawdopodobnie musiał zrobić transmisje buforowaną.
Układ do RS485, w który się zaopatrzyłem to MAX490E(full-duplex).
Ponieważ jest to moja pierwsza przygoda z transmisją danych po RS485 i piszę w Bascom to chciałbym was prosić o wskazanie najlepiej nadającej się do tego celu instrukcji Bascom.
Jak zwykle mile widziane fragmenty kodów.
Dotychczas zrobiłem transmisje w następujący sposób:
Układ 1:
Układ 2:
Układy po uruchomieniu odbierają pojedyncze znaki i zbierają je z zmiennej tekstowej Rx_byte, która później (po odebraniu 8 bitów) zamieniana jest na liczbę binarna.
Najpierw dane wysyła układ 1, a 2 odbiera je z opóźnieniem 10ms. 2 po odebraniu 8 znaków (bitów) wysyła swoje dane (Settings). W tym czasie 1 (po wysłaniu danej Status) czeka już w pętli na te dane, które mają przyjść z 2. Po odebraniu 8 znaków od 2 znowu wysyła swoje dane i sekwencja powtarza się.
Komunikacja taka działa, po jednoczesnym włączeniu zasilania do obu układów, wtedy jeden (pierwszy) nada swoje dane wcześniej a 2 odbierze je z opóźnieniem i nie ma konfliktu.
Sprawa komplikuje się gdy np w którymkolwiek momencie zresetujemy jeden z układów. Wtedy układy chyba pozostają w pętli i brak jest wymiany danych.
A tak przy okazji, czy pobieranie liczby 8bitowej w ten sposób:
jest poprawne, czy nie da się tego zrobić lepiej?
Połączenie układów wg. schematu niżej. Układy są połączone za pomocą skrętki UTP 8zył około 5m. Ta samą skrętka pozostałymi żyłami przesyłane jest zasilanie +12V(2 żyły) i masa zasilania (2 żyły).
Jaką należy tu zrobić komunikacją aby w każdym momencie odłączenie układu sygnalizowany było błędem , a podłączenie nawiązaniem komunikacji, bez utraty danych?
Pozdrawiam i z góry dziękuje za pomoc.
potrzebuję zrobić komunikację miedzy 2 procesorami ATmega16. Jeden wysyła zmienną typu Byte (Status) z informacją o stanie wejść, a 2 to odbiera. Natomiast 2 będzie wysyłał do 1 także zmienną Byte (Settings) z informacjami konfiguracyjnymi. Dodatkowo chciałbym wysyłać sumę CRC w obu kierunkach. Transmisja w obu kierunkach jednocześnie!
Bity będą miały np takie znaczenie:
'STATUS: |B7 |B6 | B5 | B4 | B3 | B2 | B1 | B0 |
' | 1 | 1 |LIGHT|CLEAN|PROG3|PROG2|PROG1|PROG0|
'SETTINGS WORD:|B7 | B6| B5| B4 | B3 | B2 | B1 | B0 |
' | 1 | 1 | 1 |SERVICE|BASE3|BASE2|BASE1|BASE0|Po przeczytaniu kilku postów wiem, na co zwracać uwagę i co robić jak gubię znaki. W moim przypadku będę prawdopodobnie musiał zrobić transmisje buforowaną.
Układ do RS485, w który się zaopatrzyłem to MAX490E(full-duplex).
Ponieważ jest to moja pierwsza przygoda z transmisją danych po RS485 i piszę w Bascom to chciałbym was prosić o wskazanie najlepiej nadającej się do tego celu instrukcji Bascom.
Jak zwykle mile widziane fragmenty kodów.
Dotychczas zrobiłem transmisje w następujący sposób:
Układ 1:
$crystal = 8000000
$baud = 19200
Config Serialin = Buffered , Size = 8
Do
Waitms 5
Print Bin(status);
Do
Waitms 1
Received = Ischarwaiting()
If Received <> 0 Then
Znak = Inkey()
Rx_byte = Rx_byte + Chr(znak)
Incr Bit_number
If Bit_number = 8 Then
Received = Binval(rx_byte)
If Received = 6 Then
Added = 777
Exit Do
Else
Added = 111
Waitms 100
Added = 0
Waitms 100
End If
End If
End If
Loop
Loop
EndUkład 2:
$crystal = 4000000
$baud = 19200
Config Serialin = Buffered , Size = 8
Do
Waitms 10
Do
Waitms 1
Received = Ischarwaiting()
If Received <> 0 Then
Znak = Inkey()
Rx_byte = Rx_byte + Chr(znak)
Incr Bit_number
If Bit_number = 8 Then
Received = Binval(rx_byte)
If Received = 3 Then
Program = 7
Exit Do
Else
Program = 11
Waitms 100
Program = 10
Waitms 100
End If
End If
End If
Loop
Waitms 1
Print Bin(settings);
Loop
EndUkłady po uruchomieniu odbierają pojedyncze znaki i zbierają je z zmiennej tekstowej Rx_byte, która później (po odebraniu 8 bitów) zamieniana jest na liczbę binarna.
Najpierw dane wysyła układ 1, a 2 odbiera je z opóźnieniem 10ms. 2 po odebraniu 8 znaków (bitów) wysyła swoje dane (Settings). W tym czasie 1 (po wysłaniu danej Status) czeka już w pętli na te dane, które mają przyjść z 2. Po odebraniu 8 znaków od 2 znowu wysyła swoje dane i sekwencja powtarza się.
Komunikacja taka działa, po jednoczesnym włączeniu zasilania do obu układów, wtedy jeden (pierwszy) nada swoje dane wcześniej a 2 odbierze je z opóźnieniem i nie ma konfliktu.
Sprawa komplikuje się gdy np w którymkolwiek momencie zresetujemy jeden z układów. Wtedy układy chyba pozostają w pętli i brak jest wymiany danych.
A tak przy okazji, czy pobieranie liczby 8bitowej w ten sposób:
Znak = Inkey()
Rx_byte = Rx_byte + Chr(znak)
Incr Bit_number
If Bit_number = 8 Then
Received = Binval(rx_byte)
End Ifjest poprawne, czy nie da się tego zrobić lepiej?
Połączenie układów wg. schematu niżej. Układy są połączone za pomocą skrętki UTP 8zył około 5m. Ta samą skrętka pozostałymi żyłami przesyłane jest zasilanie +12V(2 żyły) i masa zasilania (2 żyły).
Jaką należy tu zrobić komunikacją aby w każdym momencie odłączenie układu sygnalizowany było błędem , a podłączenie nawiązaniem komunikacji, bez utraty danych?
Pozdrawiam i z góry dziękuje za pomoc.