ATmega2560 - Konfiguracja 2x UART

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

ATmega2560 - Konfiguracja 2x UART

Post autor: pimowo » 12 paź 2020, 0:33

Hej,
Panowie, pomóżcie bo coś się zamotałem i zablokowałem na konfiguracji 2x UART
Bawię się płytką Arduino MEGA i chcę skonfigurować uC tak, że pierwszy UART ma służyć do komunikacji z PC (chcę mieć możliwość komunikacji przez USB) a drugi do komunikacji z ESP8266

Co robię źle?
Kombinuję na różne sposoby, ale coś mi to nie idzie :(
.
  1. $regfile = "m2560def.dat"
  2. $crystal = 16000000
  3.  
  4. $hwstack = 256
  5. $swstack = 128
  6. $framesize = 256
  7.  
  8. '--- UART 1 PC ---
  9.  
  10. $baud = 115200
  11. Open "COM1:" For Binary As #1 : Const Pc = 1
  12. Config Serialin0 = Buffered , Size = 100 , Bytematch = 13
  13. Clear Serialin0
  14. Config Input1 = Crlf , Echo = Cr : Echo Off
  15.  
  16. Dim Com1_str As String * 100
  17.  
  18. '--- UART 2 ESP ---
  19.  
  20. $baud1 = 115200
  21. Open "COM2:" For Binary As #2 : Const Esp = 2
  22. Config Serialin1 = Buffered , Size = 250 , Bytematch = 10
  23. Clear Serialin1
  24. Config Input2 = Crlf , Echo = Cr : Echo Off
  25.  
  26. Dim Com2_str As String * 250
  27.  
  28. (...)
  29.  
  30. '--- włącz globalne przerwania ---
  31.  
  32. Enable Interrupts
  33.  
  34. do
  35.  
  36. (...)
  37.  
  38.    If Esp_nadaje = 1 Then
  39.  
  40.       Esp_nadaje = 0
  41.  
  42.       Call Esp8266
  43.  
  44.    End If
  45.  
  46.    If Pc_nadaje = 1 Then
  47.  
  48.       Pc_nadaje = 0
  49.  
  50.       Call Pc_uart
  51.  
  52.    End If
  53.  
  54. loop
  55. end
  56.  
  57. '--- przerwanie UART PC ---
  58.  
  59. Serial0charmatch:
  60.  
  61.    $asm
  62.    !PUSH R6
  63.    !PUSH R16
  64.    !PUSH R17
  65.    !PUSH R18
  66.    !PUSH R19
  67.    !PUSH R22
  68.    !PUSH R24
  69.    !PUSH R25
  70.    !PUSH R26
  71.    !PUSH R27
  72.    !PUSH R30
  73.    !IN R24, SREG
  74.    !PUSH  R24
  75.    $end asm
  76.  
  77.    '#  PUT YOUR ISR ROUTINES HERE   #
  78.    '          Tuned with NoSave Tool 1.10
  79.  
  80.    $timeout = 3000
  81.    Input #pc , Com1_str
  82.    Clear Serialin0
  83.  
  84.    Pc_nadaje = 1
  85.  
  86.    $asm
  87.    !POP  R24
  88.    !OUT SREG, R24
  89.    !POP R30
  90.    !POP R27
  91.    !POP R26
  92.    !POP R25
  93.    !POP R24
  94.    !POP R22
  95.    !POP R19
  96.    !POP R18
  97.    !POP R17
  98.    !POP R16
  99.    !POP R6
  100.    $end Asm
  101.  
  102. Return
  103.  
  104. '--- przerwanie UART ESP ---
  105.  
  106. Serial1charmatch:
  107.  
  108.    $asm
  109.    !PUSH R6
  110.    !PUSH R16
  111.    !PUSH R17
  112.    !PUSH R18
  113.    !PUSH R19
  114.    !PUSH R22
  115.    !PUSH R24
  116.    !PUSH R25
  117.    !PUSH R26
  118.    !PUSH R27
  119.    !PUSH R30
  120.    !IN R24, SREG
  121.    !PUSH  R24
  122.    $end Asm
  123.  
  124.    '#  PUT YOUR ISR ROUTINES HERE   #
  125.    '          Tuned with NoSave Tool 1.10
  126.  
  127.    $timeout = 3000
  128.    Input #esp , Com2_str
  129.    Clear Serialin1
  130.  
  131.    Esp_nadaje = 1
  132.  
  133.    $asm
  134.    !POP  R24
  135.    !OUT SREG, R24
  136.    !POP R30
  137.    !POP R27
  138.    !POP R26
  139.    !POP R25
  140.    !POP R24
  141.    !POP R22
  142.    !POP R19
  143.    !POP R18
  144.    !POP R17
  145.    !POP R16
  146.    !POP R6
  147.    $end asm
  148.  
  149. Return
.
*oczywiście to tylko wycinek z większego kodu

Z góry dziękuję za pomoc.
Piotrek
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: niveasoft » 12 paź 2020, 8:15

A co tam nie działa?
Nie jest czasem tak, że skonfigurowałeś Input1 by czekał na CRLF czyli znaki 13 i 10 a Serial0charmatch tak by reagował zaraz po otrzymaniu 13. Wtedy na pewno w buforze nie będzie znaku 10.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: pimowo » 12 paź 2020, 16:01

Wszytko się zawieszało, raz uC gadał z PC, a raz nie - loteria normalnie. Poprawiłem jak mówisz, ale to nie było to.
Moim problemem okazał się ESP-01 - mam stary, niebieski który chciałem wykorzystać, ale nie wyszło. Gdy zmieniłem ESP-01 na ten nowszy, czarny to zaczęło coś się dziać - uC gada z ESP i ja mogę gadać z uC, ale teraz znów mam problem taki, że wszytko działa dopóki ESP-01 nie posyła danych (ma to robić raz na minutę) i gdy ESP rusza to MEGA zamiera i pomaga tylko restart.

Co ciekawe, to gdy wcześniej robiłem takie próby na Arduino UNO z ATmega328 to nie miałem problemów - UNO + ESP wszytko OK, UNO + PC wszytko OK, a teraz gdy chcę wykorzystać 2x UART na MEGA to zaczęły się schody. No nic, trzeba dalej toczyć tą nierówną walkę :P

Tak przy okazji...
Teraz robię próby aby "gadać" z MEGĄ poprzez USB, a raz na minutę MEGA ma słać dane na serwer poprzez ESP i teraz tak się zastanawiam... można jakoś "ożenić" ESP z ATmegą aby raz na minutę posyłać dane na serwer, a zamiast "gadać" z nią poprzez USB można było to robić poprzez WiFi?
grzeniu 73
Posty: 26
Rejestracja: 07 lip 2019, 0:32

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: grzeniu 73 » 12 paź 2020, 19:45

  1. Enable Urxc1
  2. On Urxc1 Odbierz1
  3. Echo Off
  4.  
  5. Enable Urxc
  6. On Urxc Odbierz
  7. Echo Off
  8.  
  9. Enable Interrupts
  1.            Odbierz:
  2.  
  3.   Disable Urxc
  4.      Znak = Inkey()
  5.  
  6.      Select Case Znak
  7.       Case 10:
  8.       Case 13 : Gosub Uartrx
  9.       Case 79:
  10.       Case 75:
  11.       Case Else
  12.         Text = Text + Chr(znak)
  13.  
  14.         End Select
  15.           Enable Urxc
  16.      Return
  1.         Uartrx:
  2.  
  3.  
  4.    Ile_elementow = Split(text , Getcommands(1) , ":")       ' Dzielenie Na Czesci Wiadomosci Znak :
  5.  
  6.  
  7.    Select Case Getcommands(1)
  8. ' tu sobie wpisujesz w case co chesz przetwarzac i odbierac
  9.     Case "A"
  10.         Disable Interrupts
  11.         Config Watchdog = 16
  12.         Start Watchdog
  13.            Wait 1
  14.  
  15.         End Select
  16.  
  17.  
  18.  
  19.          Getcommands(1) = ""                                'czysczenie bufora
  20.          Getcommands(2) = ""                                'czysczenie bufora
  21.          Getcommands(3) = ""                                'czysczenie bufora
  22.          Getcommands(4) = ""                                'czysczenie bufora
  23.          Getcommands(5) = ""
  24.          Getcommands(6) = ""                                'czysczenie bufora
  25.          Getcommands(7) = ""
  26.       '   Getcommands(8) = ""                                'czysczenie bufora
  27.      '    Getcommands(9) = ""
  28.          
  29.           Text = ""
  30. Return
Dopisz to samo do drugiego UART tylko zmienne inaczej ponazywaj. W ten sposób dogadasz sie i esp i bt i drugim prockiem.
edit: Uart drugi musisz zamykac
  1. Loop
  2. Close #1
  3. End
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: pimowo » 12 paź 2020, 19:53

Sortowanie i reagowanie na wiadomości działa mi OK, ale nie wiem dlaczego, ale wszytko działa do momentu aż ESP wyśle dane na serwer - tu się zatrzymuje uC.
Wszytko działało gdy używałem ATmega328 i był ESP lub PC, a teraz gdy chcę używać 2x UART to coś się chrzani :(
Mam wrażenie, że źle coś konfiguruję, ale nie wiem gdzie robię błąd. To tak wygląda jakby jeden UART mieszał w drugim.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: niveasoft » 12 paź 2020, 20:12

Może pokaz ten kawałek który wysyła dane. Dawno nie używałem ESP na komendach AT (pisze sobie zawsze swój soft na niego w B4R), ale było tam chyba coś takiego, że chciałeś się połączyć i potem ESP wystawiał znak zachęty ">" tylko, że tam nie ma entera...i tam możesz utknąć z tym jak to oprogramowałeś tutaj.

Jak zachodzi podejrzenie że coś się miesza na rejestrach to zawsze możesz użyć "$pushall" i "$popall" dla Serialcharmatch.
Ogólnie to w ogóle nie używam Charmatch. Ściągam dane na bieżąco i ewentualnie parsuję.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: pimowo » 12 paź 2020, 20:28

Bartek, kod jest Twój tylko Ty wysyłałeś dane na ThingSpeak, a ja wysyłam na swój serwer.
Może i coś poknociłem z ESP, ale na ATmega328 działa wszytko OK.
.
  1. '--- obsługa ESP8266 ---
  2.  
  3. Sub Esp_uart
  4.  
  5.    Select Case State
  6.  
  7.       Case Startup
  8.  
  9.          If Instr(com2_str , "WIFI GOT IP") > 0 Then
  10.  
  11.             Cmd = "AT+CIPSTART={034}TCP{034},{034}"
  12.             Cmd = Cmd + "192.168.1.2"                       'IP serwera
  13.             Cmd = Cmd + "{034},80"
  14.  
  15.             Print #esp , Cmd
  16.  
  17.             Cmd = "GET /receiver.php?"
  18.             Cmd = Cmd + "key="
  19.             Cmd = Cmd + "1234"
  20.             Cmd = Cmd + "&id=1;11;2;22;3;33"
  21.             Cmd = Cmd + "&type="
  22.             Cmd = Cmd + "water"
  23.             Cmd = Cmd + ";"
  24.             Cmd = Cmd + "volt"
  25.             Cmd = Cmd + ";"
  26.             Cmd = Cmd + "gas"
  27.             Cmd = Cmd + ";"
  28.             Cmd = Cmd + "volt"
  29.             Cmd = Cmd + ";"
  30.             Cmd = Cmd + "elec"
  31.             Cmd = Cmd + ";"
  32.             Cmd = Cmd + "volt"
  33.             Cmd = Cmd + "&value="
  34.             Cmd = Cmd + "0.001"
  35.             Cmd = Cmd + ";"
  36.             Cmd = Cmd + "1.11"
  37.             Cmd = Cmd + ";"
  38.             Cmd = Cmd + "0.01"
  39.             Cmd = Cmd + ";"
  40.             Cmd = Cmd + "2.22"
  41.             Cmd = Cmd + ";"
  42.             Cmd = Cmd + "0.0005"
  43.             Cmd = Cmd + ";"
  44.             Cmd = Cmd + "3.33"
  45.             Cmd = Cmd + "&current="
  46.             Cmd = Cmd + "11"
  47.             Cmd = Cmd + ";---;"
  48.             Cmd = Cmd + "22"
  49.             Cmd = Cmd + ";---;"
  50.             Cmd = Cmd + "33"
  51.             Cmd = Cmd + ";---"
  52.             Cmd = Cmd + "&device=ip"
  53.             Cmd = Cmd + "&name=CountNNT_"
  54.             Cmd = Cmd + "{032}HTTP/1.1{013}{010}"
  55.             Cmd = Cmd + "Host:{032}"
  56.             Cmd = Cmd + "192.168.1.2"
  57.             Cmd = Cmd + "{013}{010}{013}{010}"
  58.  
  59.             Mem_state = State                               'zapamiętaj, że zaczynamy
  60.             State = Waiting
  61.  
  62.          End If
  63.  
  64.       Case Waiting                                          'jeśli czekamy na odpowiedź
  65.  
  66.          Select Case Com2_str
  67.  
  68.             Case "OK"                                       'jeśli zobaczymy OK
  69.  
  70.                Select Case Mem_state
  71.  
  72.                   Case Startup                              'Poprzedni był autostart, więc to pierwszy "OK"
  73.  
  74.                      Mem_state = Send_len
  75.  
  76.                      Lenght = Len(cmd) : Cmd_len = Str(lenght)
  77.                      Cmd_len = "AT+CIPSEND=" + Cmd_len
  78.  
  79.                      Print #esp , Cmd_len
  80.  
  81.                   Case Send_len                             'drugie „OK”, więc wysyłamy Len danych, które chcemy wysłać
  82.  
  83.                      Print #esp , Cmd
  84.  
  85.                      State = Sending
  86.                      Mem_state = Sending                    'zapamiętaj, że wysyłamy dane do serwera
  87.                                                             'do obsługi bledow
  88.                End Select
  89.  
  90.             Case "ERROR"                                    'błąd połaczenia
  91.  
  92.                State = Startup : Send_time = 0
  93.  
  94.             Case "CLOSED"                                   'połączenie zamknięte
  95.  
  96.                State = Startup : Send_time = 0
  97.  
  98.          End Select
  99.  
  100.       Case Sending                                          'wysyłka danych
  101.  
  102.          Select Case Com2_str
  103.  
  104.             Case "SEND OK"                                  'wysyłanie powiodło się
  105.  
  106.                State = Startup : Send_time = 0
  107.  
  108.             Case "CLOSED"                                   'połączenie zamknięte
  109.  
  110.                State = Startup : Send_time = 0
  111.  
  112.             Case "SEND FAIL"                                'wysyłanie nie powiodło się
  113.  
  114.                State = Startup : Send_time = 0
  115.  
  116.          End Select
  117.  
  118.    End Select
  119.  
  120. End Sub
.
W pętli głównej odliczam sobie minutę i:
.
  1. Print #esp , "AT+RST"                     'budź ESP i ślij dane na serwer
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: niveasoft » 12 paź 2020, 20:39

No to stary kod już i robię to wszystko inaczej. Nie mówię, że nie może działać, ale pamiętam że nowszy dopracowałem tak, że podsłuchiwałem całą transmisję pomiędzy AVR i ESP łącząc dwie diody Schottkky i doprowadzając do RX przejściówki USB<>UART.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: pimowo » 12 paź 2020, 20:44

Tak jak pisałem wcześniej, Twój kod dla ESP działa bo cały czas go używam w innym projekcie, ale tam mam ATmega328 i nic więcej. Znów w innym projekcie używam komunikację PC-ATmega328 i też działa wyśmienicie. Problem się pojawił gdy zachciało mi się użyć uC gdzie chcę wykorzystać 2x UART - tu poległem całkowicie bo nie potrafię sobie tego skonfigurować, a wydaje mi się, że to właśnie problem z konfiguracją UART jest i nic więcej.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ATmega2560 - Konfiguracja 2x UART

Post autor: niveasoft » 12 paź 2020, 20:47

Raczej to nie to. W sterowniku dzwonów używam wszystkich czterech USARTów w ten sposób i śmigają :D
  1. '*****************************************************************
  2. '*         CONFIG BUFFERED USART FOR DEBUG via USB               *
  3. '*****************************************************************
  4.  
  5. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  6.  Echo Off
  7.  
  8.  Config Serialin0 = Buffered , Size = Max_usb_in_command_len       'RX from Terminal
  9.   Dim Char As Byte , Cmd_timeout1 As Byte , Got_str1 As Byte
  10.   Dim Command1 As String * Max_usb_in_command_len
  11.  
  12.  Config Serialout0 = Buffered , Size = Max_usb_out_command_len       'TX to the Terminal
  13.   Open "COM1:" For Binary As #1
  14.    Const Usb = 1
  15.  
  16. '*****************************************************************
  17. '*           CONFIG BUFFERED USART FOR BLUETOOTH                 *
  18. '*****************************************************************
  19.  
  20. Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  21.  
  22.  Config Serialin1 = Buffered , Size = Max_bluetooth_command_len       'RX from Android app
  23.   Dim Cmd_timeout As Byte , Got_str As Byte
  24.  
  25.  
  26.   Dim Command As String * Max_bluetooth_command_len
  27.  
  28.  'Config Serialout1 = Buffered , Size = Max_bluetooth_command_len       'TX to the Android app
  29.   Open "COM2:" For Binary As #2
  30.    Const Blue = 2
  31.  
  32.   Dim Bt_conn As Byte , Outstr As String * Max_bluetooth_command_len
  33.  
  34. '*****************************************************************
  35. '*         CONFIG BUFFERED USART FOR ESP8266 WiFi                *
  36. '*****************************************************************
  37.  
  38. Config Com3 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  39.  
  40.  Config Serialin2 = Buffered , Size = 250                   'RX from ESP8266
  41.   Dim Cmd_timeout3 As Byte , Got_str3 As Byte
  42.  
  43.   Const Max_lenght3 = Max_wifi_command_len - 1
  44.  
  45.   Dim Command3len As Byte , Czekaj_z_komendami As Byte
  46.   Dim Command3 As String * Max_lenght3
  47.   Dim Comm_buff(max_wifi_command_len) As Byte At Command3 Overlay
  48.  
  49.  Config Serialout2 = Buffered , Size = Max_wifi_command_len 'TX to ESP8266
  50.   Open "COM3:" For Binary As #3
  51.    Const Esp = 3
ODPOWIEDZ