Transmisja danych RS485_RS422
- Pikczu
- Posty: 390
- Rejestracja: 17 sie 2015, 13:46
- Lokalizacja: Dublin, Ireland
- Kontakt:
Re: Transmisja danych RS485_RS422
Henryk,
A jest jakiś PDF do tego urządzenia ?
Może tam będzie jakieś info? może bit parzystości jest nie standardowy itp.
A jest jakiś PDF do tego urządzenia ?
Może tam będzie jakieś info? może bit parzystości jest nie standardowy itp.
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: Transmisja danych RS485_RS422
Witam
Przyznaje się bez przyciskania do muru , że nie sprawdzałem , nie mam drugiego konwertera .
Już nad tym pracuje by go mieć
Witam
Pracuje w środowisku w którym takich wiadomości nie uświadczysz . Serwisant to "niewolnik " który ma zamawiać i wymieniać moduły .
Wiedza zdobyta na temat urządzenia jest wyłącznie moją pracą po godzinach . Na szczęści mam szefa który też jest głodny wiedzy i każde nowe urządzenie jest rozbierane w drobny mak w celu jego poznania
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: Transmisja danych RS485_RS422
Skleciłem na szybko układ testowy , konwerter działa poprawnie , będę musiał w pracy sprawdzić czy z portem com jest wszystko ok .
Banalny program do testów , przy okazji skorzystałem z podpowiedzi Bartka
Edit:
Tak szybko pisałem , że nawet nie zwróciłem uwagi na brak wyświetlanej wartości binarnie już poprawione w programie .
Banalny program do testów , przy okazji skorzystałem z podpowiedzi Bartka
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m8def.dat"
- $crystal = 16000000
- $baud = 9600
- 'Config Print0 = Portd.2 , Mode = Set ' https://bart-projects.cba.pl/rs485.html
- 'Config Pind.2 = Output 'ustaw pin jako wyjściowy
- ' ja ustawiłem na "sztywno nadawanie " podjąc stan wysoki na piny 2,3 Max,a 487
- Dim X As Byte
- X = 10
- Do
- Print "Test RS485 " ; X ; " Hex " ; Hex(x) ; " Bin " ; bin(X)
- If X = 250 Then : X = 0 : End If
- Wait 4
- X = X + 10
- Loop
- End
Tak szybko pisałem , że nawet nie zwróciłem uwagi na brak wyświetlanej wartości binarnie już poprawione w programie .
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: Transmisja danych RS485_RS422
Ruszyłem z miejsca przeniosłem terminal na laptopa z systemem XP i bez większego kłopotu złapałem transmisję .
Śmiga tych danych nieco więcej niż się tego spodziewałem , lecą dwie paczki , pierwsza 19 bajtów , przerwa ok. 100ms i leci druga 6 bajtów .
Zidentyfikowałem które bajty należą do wartości zmienianych w urządzeniu
Jeśli dobrze myślę , to teraz powinienem złapać te dane do tablicy i przypisać do właściwych zmiennych
Mam jednak mały kłopot z bajtem na końcu obu paczek , nie pasuje do niczego , czy to może być suma kontrolna
Śmiga tych danych nieco więcej niż się tego spodziewałem , lecą dwie paczki , pierwsza 19 bajtów , przerwa ok. 100ms i leci druga 6 bajtów .
Zidentyfikowałem które bajty należą do wartości zmienianych w urządzeniu
Jeśli dobrze myślę , to teraz powinienem złapać te dane do tablicy i przypisać do właściwych zmiennych
Mam jednak mały kłopot z bajtem na końcu obu paczek , nie pasuje do niczego , czy to może być suma kontrolna
- niveasoft
- Posty: 1221
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Transmisja danych RS485_RS422
Pewnie, że może być
Pozbieraj jakieś ramki i jak nic nie wyczaisz to zapodaj.
Pozbieraj jakieś ramki i jak nic nie wyczaisz to zapodaj.
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: Transmisja danych RS485_RS422
Witam
Przyciąłem " Jarząbka " i wystukałem coś takiego
Pierwsze dwa bajty w obu paczkach to informacja dla slave,a która paczka leci .
Obliczając sumę kontrolną należy je również uwzględnić i co ważniejsze , czy ten programik ma prawo zadziałać
Przyciąłem " Jarząbka " i wystukałem coś takiego
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m8def.dat"
- $crystal = 8000000
- $baud = 4800
- Dim X As Byte , Tab1(19) As Byte , Tab2(6) As Byte
- Tab1(1) = 'xxx wstawię odpowiednie wartości
- Tab1(2) = 'xxx
- Tab1(3) = 'xxx
- Tab1(4) = '
- Tab1(5) = '
- Tab1(6) = '
- Tab1(7) = '
- Tab1(8) = '
- Tab1(9) = 'xxx
- Tab1(10) = '
- Tab1(11) = '
- Tab1(12) = '
- Tab1(13) = '
- Tab1(14) = '
- Tab1(15) = '
- Tab1(16) = '
- Tab1(17) = '
- Tab1(18) = ' xxx
- X = Crc8(tab1(1) , 18)
- Tab1(19) = X
- Tab2(1) = 'xxx
- Tab2(2) = '
- Tab2(3) = '
- Tab2(4) = '
- Tab2(5) = 'xxx
- X = Crc8(tab2(1) , 5)
- Tab2(6) = X
- Do
- Print Tab1 ; Waitms 100 ; Tab2
- Waitms 400
- Loop
- End
Obliczając sumę kontrolną należy je również uwzględnić i co ważniejsze , czy ten programik ma prawo zadziałać
- Pikczu
- Posty: 390
- Rejestracja: 17 sie 2015, 13:46
- Lokalizacja: Dublin, Ireland
- Kontakt:
Re: Transmisja danych RS485_RS422
No dobrzy było dodać bufor wyjściowy i zamiast print użyć print bin bo tak się wysyła całe tablice.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m8def.dat"
- $crystal = 8000000
- $hwstack = 40
- $swstack = 16
- $framesize = 32
- $baud = 4800
- const Timer1Reload = 781
- config timer1=timer,prescale = 1024
- load timer1 , Timer1Reload
- on ovf1 Timer1_isr
- Enable Timer1
- start timer1
- enable interrupts
- 'Timer value explination
- ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
- ' The AVR is running at 8000000Hz, the prescaler is 1024
- ' Each tick is 0.128 ms - (1 / CPUSpeed in KHz ) * Prescaler
- ' The timer needs 781 ticks to reach the required time ( 781 * 0.128 = 99.968ms)
- ' The start value for the timer must be set to 64755 so that it will overflow at 65536 after 781 ticks
- ' NOTE: The load command does the inversion for you (256-value or 65536-value)
- Config Serialout = Buffered , Size = 64
- Dim X As Byte , Tab1(19) As Byte , Tab2(6) As Byte
- Dim Flaga As Byte
- Dim Czas As Byte
- Tab1(1) = &H50 'xxx wstawie odpowiednie wartosci
- Tab1(2) = &H61 'xxx
- Tab1(3) = &H6E 'xxx
- Tab1(4) = &H20 '
- Tab1(5) = &H48 '
- Tab1(6) = &H65 '
- Tab1(7) = &H6E '
- Tab1(8) = &H72 '
- Tab1(9) = &H79 'xxx
- Tab1(10) = &H6B '
- Tab1(11) = &H20 '
- Tab1(12) = &H74 '
- Tab1(13) = &H75 '
- Tab1(14) = &H20 '
- Tab1(15) = &H62 '
- Tab1(16) = &H79 '
- Tab1(17) = &H6C '
- Tab1(18) = &H13 ' xxx
- X = Crc8(tab1(1) , 18)
- Tab1(19) = X
- Tab2(1) = &H10 'xxx
- Tab2(2) = &H68 '
- Tab2(3) = &H65 '
- Tab2(4) = &H6A '
- Tab2(5) = &H21 'xxx
- X = Crc8(tab2(1) , 5)
- Tab2(6) = X
- Do
- Select Case Czas
- Case 5 :
- If Flaga.0 = 0 Then
- Printbin Tab1(1) ; 19
- Flaga.0 = 1
- End If
- Case Is >= 10 : Printbin Tab2(1) ; 6
- Czas = 0
- Flaga.0 = 0
- 'Case Else : Print "czas: " ; Czas
- End Select
- Loop
- End
- Timer1_ISR:
- load timer1, Timer1Reload
- Incr Czas
- Return
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: Transmisja danych RS485_RS422
Witam
Dziękuje Pikaczu za usprawnienie moich wypocin
Jest mały kłopot z użyciem timer1 , jest zajęty generowaniem sygnału PWM w docelowym " kombajnie "/przyrządzie , przepraszam mój błąd .
Zrobię tak , uzupełnię mój pierwotny kod o istotne linijki i sprawdzę czy będzie to działać jeśli nie , to zbuduję osobne urządzenie , czego wolał bym uniknąć .
Plak potrafi ! , coś się wykombinuje jeszcze raz dziękuje .
Dziękuje Pikaczu za usprawnienie moich wypocin
Jest mały kłopot z użyciem timer1 , jest zajęty generowaniem sygnału PWM w docelowym " kombajnie "/przyrządzie , przepraszam mój błąd .
Zrobię tak , uzupełnię mój pierwotny kod o istotne linijki i sprawdzę czy będzie to działać jeśli nie , to zbuduję osobne urządzenie , czego wolał bym uniknąć .
Plak potrafi ! , coś się wykombinuje jeszcze raz dziękuje .
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: Transmisja danych RS485_RS422
Zrobiłem test , moje nie działa Pikaczu program działa , tylko wysyłane dane nie pasują do oryginalnej transmisji .
Wygląda na to , że z tablicy nie mogę tego wysyłać , w terminalu dane oryginalne są odbierane tak:
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka itd. cyklicznie powtarzane .
Jednym ciągiem to chyba tylko sring,a tak można wysłać , brak mi pomysłu .
Wygląda na to , że z tablicy nie mogę tego wysyłać , w terminalu dane oryginalne są odbierane tak:
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka itd. cyklicznie powtarzane .
Jednym ciągiem to chyba tylko sring,a tak można wysłać , brak mi pomysłu .
- niveasoft
- Posty: 1221
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Transmisja danych RS485_RS422
Na drugi raz spróbuj napisać bardziej "po polsku" ahahahaha bo ja nic nie zrozumiałem z tego oprócz "Pikczu program działa a mój nie"
No więc Pikczu użył Printbin
Printbin ma taką właściwość, że można napisać Printbin Tablica(3) i jesli Twoja tablica ma zadeklarowane 20 bajtów to wyśle siedemnaście bo zacznie wysyłać od trzeciego aż do końca. Drugą własciwością Printbin jest to że można mu napisać ile ma wysłać więc Printbin Tablica(3); 5 wyśle Tablica(3) do Tablica(7).
Ci innego jest z Print
Jeśli chcesz to wysłać tak jak sobie napisałeś to powinieneś użyć pomocniczej zmiennej i wysłać to w "tym stylu":
Twój kod nie powinien w ogóle sie skompilować..podejrzewam tu jakąś starą, spolszczoną wersję Bascom typu EDW
Co do sumy kontrolnej to jest tyle odmian że to nie musi być to co Ty ustawiasz na końcu.
Proponowałbym napisanie sobie programu i przetestowanie w symulatorze. Czyli wpisujesz 18 bajtów danych które odczytujesz tam na żywca i Bascomowi/Twojemu programowi policzenie z tego sumy kontrolnej i wyświetlenie 19nastego bajtu . Zdziwiłbym się gdyby to było proste CRC. Pewnie się będzie różnił od tego co widzisz jako bajt nr19.
No więc Pikczu użył Printbin
Printbin ma taką właściwość, że można napisać Printbin Tablica(3) i jesli Twoja tablica ma zadeklarowane 20 bajtów to wyśle siedemnaście bo zacznie wysyłać od trzeciego aż do końca. Drugą własciwością Printbin jest to że można mu napisać ile ma wysłać więc Printbin Tablica(3); 5 wyśle Tablica(3) do Tablica(7).
Ci innego jest z Print
Jeśli chcesz to wysłać tak jak sobie napisałeś to powinieneś użyć pomocniczej zmiennej i wysłać to w "tym stylu":
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- For N = 1 To 19
- Print Tablica(n); 'srednik nie wysyła entera za każdym printem
- Next
- 'Print "" 'jeśli chcesz mieć na końcu Enter
- Waitms 100
- For N = 1 To 6
- Print Tablica2(n);
- Next
- 'Print "" 'jeśli chcesz mieć na końcu Enter
Co do sumy kontrolnej to jest tyle odmian że to nie musi być to co Ty ustawiasz na końcu.
Proponowałbym napisanie sobie programu i przetestowanie w symulatorze. Czyli wpisujesz 18 bajtów danych które odczytujesz tam na żywca i Bascomowi/Twojemu programowi policzenie z tego sumy kontrolnej i wyświetlenie 19nastego bajtu . Zdziwiłbym się gdyby to było proste CRC. Pewnie się będzie różnił od tego co widzisz jako bajt nr19.