Strona 1 z 3

RS485 + atmega32 (EvB 5.1)

: 07 wrz 2017, 15:31
autor: pirzol
Witam

Znalazłem opis komunikacji z RS485 na stronie http://bart-projects.cba.pl/rs485.html , jeden z wielu. Jednak żaden sposób nie działa.
Od kilku nocy walczę z płytką EvB 5.1 starając się odpytać czujniki temperatury AVT1705 https://sklep.avt.pl/avt1705.html po magistrali RS485.

Przerabiam własny sterownik uruchomiony lata temu :) http://fpvdrones.pl/?q=node/3

Adres modułu slave - pomiaru temperatury jest ustawiony na 23, odpowiada pomiarem na wywołanie ASCI: T23(CR) czyli : 54 32 33 0D.
EvB 5.1 http://and-tech.pl/zestaw-evb-5-1/ , wyjscie RS PortD.0, PortD.1, sterowanie kierunkiem transmisji max485 na PortD.2

Kod testowego programu do wyslania zapytania z Atmega32 do AVT1705 w załączeniu (hex + bas)


W czym problem.

Prawdopodobnie w obsłudze programowej komunikacji po rs485 od strony Atmega32.

1. Atmega32 Generuje polecenie T23(CR) czyli : 54 32 33 0D

a. odsłuchuje transmisje na terminalu wpietym w rs485 i otrzymuje to co wysyłam z ATmega32 czyli 54 32 33 0D

- układ slave AVT1705 nie reaguje

b. odsłuchuje transmisje na terminalu wpietym w port rs323TTL Atmega32 (pomiedyz Atmega a MAX485) i otrzymuje to co wysyłam z ATmega32 czyli 54 32 33 0D

- układ slave AVT1705 nie reaguje


2. Z terminala wpietego w rs485 wysyłam polecenie T23(CR) czyli : 54 32 33 0D

a. układ AVT1705 odpowiada odczytem Temperatury, tak jak gdyby nie rozpoznawał komendy.


3. Wpinam interfejs USB/RS TTL na wejscie układu MAX485 i generuje z terminala polecenie ASCI: T23(CR) czyli : 54 32 33 0D

a. układ AVT1705 odpowiada odczytem Temperatury.


4. Wypinam pin sterujący kierunkiem transmisji z MAX485 (wisi w powietrzu)

- układ AVT1705 ustawiony zworką 3, automatycznie generuje pomiary i wysyla na rs485, wpięcie pinu kierunku do portuD.2 zatrzymuje automatyczne generowanie pomiaru przez AVT1705.


5. pin sterujący kierunkiem transmisji z MAX485 (podpinam do VCC, a potem do GND)

- układ AVT1705 ustawiony zworką 3, automatycznie generuje pomiary i wysyla na rs485,


Sprawdzałem już kilka kombinacji z oprogramowaniem w BASCOM, jednak bez skutku. Tzn. z terminala rs232/485 jestem w stanie zapytać AVT1705 o pomiar i otrzymuje odpowiedź. Natomiast to samo pytanie kod ASCII wysyłany z Atmega32 nie powoduje reakcji AVT1705.

Podejrzewam albo błąd w kodzie w bascom albo błąd kompilatora...

Czy możecie spojrzeć na załaczony krótki kod w Bascom ? Lub podesłać skompilowany wsad HEX napisany w C (wykluczam kompilator), który załaduje na Atmege32 i sprawdze czy układ odpowie na wysyłany ciąg ASCII z poleceniem odczytu tj. T23(CR) czyli : 54 32 33 0D

pozdrawiam
Piotr

  1. $regfile = "m32def.dat"
  2. $crystal = 16000000
  3. $hwstack=40
  4. $swstack=40
  5. $framesize=32
  6. $baud = 9600
  7.  
  8. Enable Interrupts
  9.  
  10. Config Print0=Portd.2,Mode=Set ' specify RS-485 and direction pin
  11. ' Config Pind.2 = Output
  12. Config PORTD.2 = Output 'sprawdzalem tez Pind.2
  13. 'linia pd.2 jako wyjscie
  14. Config Serialin = Buffered , Size = 23
  15.  
  16. 'konfigurujemy LCD
  17. Config Lcd = 20 * 4
  18. Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
  19. Cursor Off Noblink
  20. Cls
  21. Set Porta.2
  22. ' ------------------------
  23.  
  24. Declare Sub Odczyt_zn
  25. Dim Zn As String * 1
  26. Dim Zm_lan As String * 23
  27. Dim Czekaj As Word
  28. Cursor Off
  29. Cls
  30.  
  31. Do
  32.  
  33.   Print "T23{013}{010}" ;
  34. 'zapisuje do slave T23$0d pytanie o pomiar T
  35.   cls
  36.   Locate 2 , 1
  37.   lcd "1 T23 poszedl"
  38. 'wywolanie procedury odczytu znakow od slave
  39.   Call Odczyt_zn
  40.   Locate 1 , 1
  41.   lcd Zm_lan
  42.   wait 2
  43.  
  44.   lcd "2 T23 poszedl"
  45.   'Print "T04"     ' 54 30 34 0D 0A
  46.   Print "T23"      ' 54 32 33 0D 0A
  47.   Call Odczyt_zn
  48. 'wywolanie procedury odczytu znakow od slave
  49.   Locate 1 , 1
  50.   lcd Zm_lan
  51.  
  52.   Locate 3 , 1
  53.   lcd "czekam 3s"
  54.   Wait 3
  55.   cls
  56.  
  57.   Loop
  58. End
  59. 'koniec programu
  60.  
  61. Sub Odczyt_zn
  62.   Czekaj = 0
  63.   Zm_lan = ""
  64.   Do
  65.     Incr Czekaj
  66.     Zn = Inkey()
  67.     If Zn >= "0" And Zn <= "9" Then
  68.       Zm_lan = Zm_lan + Zn
  69.     End If
  70.     Waitms 1
  71.   Loop Until Zn = Chr(13) Or Czekaj > 100    'petla wykonywana az otrzymano znak CR (ascii 13)
  72. End Sub

Re: RS485 + atmega32 (EvB 5.1)

: 07 wrz 2017, 16:01
autor: niveasoft
Z długoletniej praktyki wynika, że zawsze gdy myślałem, że to winny Bascom to za chwile znalazłem swój błąd.
Mogę powiedzieć że w przeciągu tego czasu jak pisze w Bascom to tylko raz zagadką stał się kod pana Mirleya a po mailu do Supportu Bascom stało się jasne że nie można dłużej używać nazwy Hbyte dla zmiennej ponieważ jest to już zarezerwowana zmienna "wewnętrzna".
Od czasu mojego maila dodano ostrzeżenie i jest ono generowane przy kompilacji.

Proszę. Poniżej program który powinien odpowiedzieć na zapytanie poprzez RS485 ;)
Jest to "szybka przeklejka" niektórych gotowych funkcji jakiegoś mojego programu.

Co do Bascom to raczej wykluczam błąd aktualnych wersji. Mam program który w Mega2560 komunikuje się wszystkimi czterema USARTami na raz bez problemu.

Prosze skompilować poniższy i ewentualnie zdać relacje :D
  1. $regfile = "m32def.dat"
  2. $crystal = 16000000
  3. $hwstack=40
  4. $swstack=40
  5. $framesize=32
  6. $baud = 9600
  7.  
  8.  
  9. '*****************************************************************
  10. '*         CONFIG BUFFERED USART FOR DEBUG via USB               *
  11. '*****************************************************************
  12.  
  13. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  14.  Echo Off
  15.  
  16.  Config Serialin0 = Buffered , Size = 50               'RX from Terminal
  17.   Dim Char As Byte , Cmd_timeout1 As Byte , Got_str1 As Byte
  18.   Dim Command1 As String * 25
  19.  
  20.  Config Serialout0 = Buffered , Size = 50              'TX to the Terminal
  21.   Open "COM1:" For Binary As #1
  22.  
  23. Config Print0 = Portd.2 , Mode = Set                   ' specify RS-485 and direction pin
  24. Config Portd.2 = Output
  25.  
  26. '*****************************************************************
  27. '*                TIMER2 FOR TIME BASE                           *
  28. '*****************************************************************
  29. Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1
  30.  Compare2 = 155                                        '10ms @16MHz/1024
  31.  
  32.  
  33.  
  34.   Enable Interrupts
  35.  
  36.  
  37.  
  38. Do
  39.  
  40.  '--[ TIMER2 10ms ]----------------------------
  41.  If Tifr.ocf2 = 1 Then
  42.   Tifr.ocf2 = 1
  43.  
  44.    'COM1 USB
  45.      If Cmd_timeout1 > 0 Then
  46.       Decr Cmd_timeout1
  47.        If Cmd_timeout1 = 0 Then
  48.         'Got_str1 = 1
  49.          Command1 = ""
  50.        End If
  51.      End If
  52.  
  53.  
  54.  End If
  55.  
  56.  
  57. '--[ USART0 COM1 USB ]------------------------
  58.  If 0 < Ischarwaiting(#1) Then
  59.  
  60.    Char = Inkey(#1)
  61.  
  62.    Select Case Char
  63.     Case 10
  64.     Case 13 : Got_str1 = 1
  65.     Case Else
  66.      Command1 = Command1 + Chr(char)
  67.  
  68.    End Select
  69.  
  70.    If Len(command1) > 49 Then Got_str1 = 1
  71.  
  72.    If Got_str1 = 0 Then Cmd_timeout1 = 50              '50x10ms
  73.  
  74.    'end if Ischarwaiting
  75.  End If
  76.  
  77.  '--[ PARSE COM1 USB ]-------------------------
  78.  If Got_str1 = 1 Then
  79.  
  80.    '-----------------------------------
  81.  
  82.      If 0 < Instr(command1 , "T23") Then
  83.  
  84.       Print #1 , "T23 znowu nadaje :D"
  85.  
  86.       Goto Skip_the_rest3_label                        'dont test then rest because we have match
  87.  
  88.      End If
  89.  
  90.  
  91.  
  92.      Skip_the_rest3_label:
  93.  
  94.       Got_str1 = 0
  95.     Command1 = ""
  96.   Cmd_timeout1 = 0
  97.  
  98.  
  99.  End If
  100.  
  101.  
  102. Loop
  103.  
  104.  
  105.  

Re: RS485 + atmega32 (EvB 5.1)

: 07 wrz 2017, 19:14
autor: pirzol
Witam

podczas kompilacji wywala błąd:
Error : 40 Line : 13 Variable can not be used with RESET [UCSR0A] , in File : C:\Users\HP\Desktop\BASCOM AVR\and-tech.pl\and-load v3\bartek.bas

powoduje to ustawienie prędkości jak niżej:
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

po zmianie na "dummy" kompilacja przechodzi kompilacje
Config Com1 = dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

po wgraniu do Atmegi32 na lini rs485 panuje cisza , atmega nic nie wysyla.
jeszcze sprawdze połączenia

Re: RS485 + atmega32 (EvB 5.1)

: 07 wrz 2017, 19:22
autor: niveasoft
O jakiej wersji Bascom piszemy?
Atmega nie wyśle niczego bo czeka na zapytanie "T23"+Enter
Po otrzymaniu takiego ciagu odpowie ;)

Re: RS485 + atmega32 (EvB 5.1)

: 07 wrz 2017, 20:56
autor: pirzol
wersja bascom 2.0.7.8
system windows 10, sprawdze jeszcze na starszej wersji pod windows xp na wirtualce.

kompilacja na 2.0.7.8 z ustawieniem "dummy"
- wysyłam T23 od strony RS485, atmega odpowiada "T23 znowu nadaje :D" - dane nie przechodzą na magistrale rs485
ewidentnie nie dziala przelaczanie kierunku transmisji

- gdy zepne na sztywno RE/DE do VCC i wysle z rs232 (pomiedzy atmega32 a max485) kod w ascii T23
otrzymuje odpowiedz atmegi "T23 znowu...." oraz widze to na rs485 czyli "T23 znowu ..."

przelaczanie portd.2 nie dziala prawidlowo, moze to wina kompilatora bo sprawdzalem juz wiele przykladow i dwie plytki testowe z max48

Re: RS485 + atmega32 (EvB 5.1)

: 08 wrz 2017, 0:20
autor: niveasoft
Zakomentuj lub usuń linię " Config Serialout0 = Buffered , Size = 50 " bo tu się chyba za bardzo rozpędziłem.
Tak jak pisałem kod jest na szybko poskładany z innych. Taki Serialout "buffered" odbywa się po jednym znaku i to w przerwaniu.

Re: RS485 + atmega32 (EvB 5.1)

: 12 wrz 2017, 19:45
autor: pirzol
Sprawdzałem rózne kombinacje kodu do obsługi rs485 na atmega32.
Generalnie problem lezy raczej po stronie przelaczania MAX485 oraz ukladu AVT1705.

Podpielem sie dwoma konwerterami RS232/RS485,
1. jest na MAX485,
Obrazek
2. drugi na jakims innym ukladzie (?)
Obrazek

podłączenie:
PC-<=>konwerter(1) <-ABGnd-> AVT1705 <-ABGnd-> AVT1705 <-ABGnd-> konwerter(2) <=> PC

Terminal: Konwerter (1) wysylam komende T23$0d ktora jest odbierana przez konwerter(2), uklad AVT1705 nie reaguje.
Terminal: Konwerter (2) wysylam komende T23$0d ktora jest odbierana przez konwerter(1), uklad AVT1705 reaguje T23=25.5C".....

wygląda na to, że albo AVt1705 z jakiegoś powodu nie dogaduje sie z ukladami MAX485 albo kuleje przelaczanie MAX485.

moge podeslac do testow AVT1705 :/

pzdr
Piotr

Re: RS485 + atmega32 (EvB 5.1)

: 12 wrz 2017, 21:49
autor: Pikczu
A czemu nie zrobisz tego na full duplex wtedy odpadnie problem przełączania.
Same zalety.

Re: RS485 + atmega32 (EvB 5.1)

: 12 wrz 2017, 22:02
autor: niveasoft
Kiedyś ściągnąłbym notę tego KITU AVT, ale nie mam teraz czasu.
Pamiętam jak przez mgłę, że był też inny KIT AVT na RS485 a przełączanie linii było rozwiązane "jakoś tak partyzancko"
Podepnij PDF`a, to się może rzuci okiem. Może tam Tobie są potrzebne jakieś zależności czasowe.

Ze swojej strony mogę dodać/rzucić inne światło na to wszystko. Obecnie gadam sobie z 15 nastoma satelitkami po RS485 na raz z prędkością 115200 i nie mam problemów.

Uważam że te stare projekty/kity AVT mogły by byc lepiej napisane.

Re: RS485 + atmega32 (EvB 5.1)

: 12 wrz 2017, 22:18
autor: pirzol
Opis projektu AVT1705 http://serwis.avt.pl/manuals/AVT1705.pdf nie wyjasnia zbyt wiele.
Ma być wywołanie w postaci T[adres 00-xx]$0d czyli dla adresu 04 wywolanie odczytu bedzie mialo postac T04$0d