Strona 1 z 3
ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 0:33
autor: pimowo
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
.
$regfile = "m2560def.dat"
$crystal = 16000000
$hwstack = 256
$swstack = 128
$framesize = 256
'--- UART 1 PC ---
$baud = 115200
Open "COM1:" For Binary As #1 : Const Pc = 1
Config Serialin0 = Buffered , Size = 100 , Bytematch = 13
Clear Serialin0
Config Input1 = Crlf , Echo = Cr : Echo Off
Dim Com1_str As String * 100
'--- UART 2 ESP ---
$baud1 = 115200
Open "COM2:" For Binary As #2 : Const Esp = 2
Config Serialin1 = Buffered , Size = 250 , Bytematch = 10
Clear Serialin1
Config Input2 = Crlf , Echo = Cr : Echo Off
Dim Com2_str As String * 250
(...)
'--- włącz globalne przerwania ---
Enable Interrupts
do
(...)
If Esp_nadaje = 1 Then
Esp_nadaje = 0
Call Esp8266
End If
If Pc_nadaje = 1 Then
Pc_nadaje = 0
Call Pc_uart
End If
loop
end
'--- przerwanie UART PC ---
Serial0charmatch:
$asm
!PUSH R6
!PUSH R16
!PUSH R17
!PUSH R18
!PUSH R19
!PUSH R22
!PUSH R24
!PUSH R25
!PUSH R26
!PUSH R27
!PUSH R30
!IN R24, SREG
!PUSH R24
$end asm
'# PUT YOUR ISR ROUTINES HERE #
' Tuned with NoSave Tool 1.10
$timeout = 3000
Input #pc , Com1_str
Clear Serialin0
Pc_nadaje = 1
$asm
!POP R24
!OUT SREG, R24
!POP R30
!POP R27
!POP R26
!POP R25
!POP R24
!POP R22
!POP R19
!POP R18
!POP R17
!POP R16
!POP R6
$end Asm
Return
'--- przerwanie UART ESP ---
Serial1charmatch:
$asm
!PUSH R6
!PUSH R16
!PUSH R17
!PUSH R18
!PUSH R19
!PUSH R22
!PUSH R24
!PUSH R25
!PUSH R26
!PUSH R27
!PUSH R30
!IN R24, SREG
!PUSH R24
$end Asm
'# PUT YOUR ISR ROUTINES HERE #
' Tuned with NoSave Tool 1.10
$timeout = 3000
Input #esp , Com2_str
Clear Serialin1
Esp_nadaje = 1
$asm
!POP R24
!OUT SREG, R24
!POP R30
!POP R27
!POP R26
!POP R25
!POP R24
!POP R22
!POP R19
!POP R18
!POP R17
!POP R16
!POP R6
$end asm
Return
.
*oczywiście to tylko wycinek z większego kodu
Z góry dziękuję za pomoc.
Piotrek
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 8:15
autor: niveasoft
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.
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 16:01
autor: pimowo
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ę
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?
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 19:45
autor: grzeniu 73
Enable Urxc1
On Urxc1 Odbierz1
Echo Off
Enable Urxc
On Urxc Odbierz
Echo Off
Enable Interrupts
Odbierz:
Disable Urxc
Znak = Inkey()
Select Case Znak
Case 10:
Case 13 : Gosub Uartrx
Case 79:
Case 75:
Case Else
Text = Text + Chr(znak)
End Select
Enable Urxc
Return
Uartrx:
Ile_elementow = Split(text , Getcommands(1) , ":") ' Dzielenie Na Czesci Wiadomosci Znak :
Select Case Getcommands(1)
' tu sobie wpisujesz w case co chesz przetwarzac i odbierac
Case "A"
Disable Interrupts
Config Watchdog = 16
Start Watchdog
Wait 1
End Select
Getcommands(1) = "" 'czysczenie bufora
Getcommands(2) = "" 'czysczenie bufora
Getcommands(3) = "" 'czysczenie bufora
Getcommands(4) = "" 'czysczenie bufora
Getcommands(5) = ""
Getcommands(6) = "" 'czysczenie bufora
Getcommands(7) = ""
' Getcommands(8) = "" 'czysczenie bufora
' Getcommands(9) = ""
Text = ""
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
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 19:53
autor: pimowo
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.
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 20:12
autor: niveasoft
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ę.
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 20:28
autor: pimowo
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.
.
'--- obsługa ESP8266 ---
Sub Esp_uart
Select Case State
Case Startup
If Instr(com2_str , "WIFI GOT IP") > 0 Then
Cmd = "AT+CIPSTART={034}TCP{034},{034}"
Cmd = Cmd + "192.168.1.2" 'IP serwera
Cmd = Cmd + "{034},80"
Print #esp , Cmd
Cmd = "GET /receiver.php?"
Cmd = Cmd + "key="
Cmd = Cmd + "1234"
Cmd = Cmd + "&id=1;11;2;22;3;33"
Cmd = Cmd + "&type="
Cmd = Cmd + "water"
Cmd = Cmd + ";"
Cmd = Cmd + "volt"
Cmd = Cmd + ";"
Cmd = Cmd + "gas"
Cmd = Cmd + ";"
Cmd = Cmd + "volt"
Cmd = Cmd + ";"
Cmd = Cmd + "elec"
Cmd = Cmd + ";"
Cmd = Cmd + "volt"
Cmd = Cmd + "&value="
Cmd = Cmd + "0.001"
Cmd = Cmd + ";"
Cmd = Cmd + "1.11"
Cmd = Cmd + ";"
Cmd = Cmd + "0.01"
Cmd = Cmd + ";"
Cmd = Cmd + "2.22"
Cmd = Cmd + ";"
Cmd = Cmd + "0.0005"
Cmd = Cmd + ";"
Cmd = Cmd + "3.33"
Cmd = Cmd + "¤t="
Cmd = Cmd + "11"
Cmd = Cmd + ";---;"
Cmd = Cmd + "22"
Cmd = Cmd + ";---;"
Cmd = Cmd + "33"
Cmd = Cmd + ";---"
Cmd = Cmd + "&device=ip"
Cmd = Cmd + "&name=CountNNT_"
Cmd = Cmd + "{032}HTTP/1.1{013}{010}"
Cmd = Cmd + "Host:{032}"
Cmd = Cmd + "192.168.1.2"
Cmd = Cmd + "{013}{010}{013}{010}"
Mem_state = State 'zapamiętaj, że zaczynamy
State = Waiting
End If
Case Waiting 'jeśli czekamy na odpowiedź
Select Case Com2_str
Case "OK" 'jeśli zobaczymy OK
Select Case Mem_state
Case Startup 'Poprzedni był autostart, więc to pierwszy "OK"
Mem_state = Send_len
Lenght = Len(cmd) : Cmd_len = Str(lenght)
Cmd_len = "AT+CIPSEND=" + Cmd_len
Print #esp , Cmd_len
Case Send_len 'drugie „OK”, więc wysyłamy Len danych, które chcemy wysłać
Print #esp , Cmd
State = Sending
Mem_state = Sending 'zapamiętaj, że wysyłamy dane do serwera
'do obsługi bledow
End Select
Case "ERROR" 'błąd połaczenia
State = Startup : Send_time = 0
Case "CLOSED" 'połączenie zamknięte
State = Startup : Send_time = 0
End Select
Case Sending 'wysyłka danych
Select Case Com2_str
Case "SEND OK" 'wysyłanie powiodło się
State = Startup : Send_time = 0
Case "CLOSED" 'połączenie zamknięte
State = Startup : Send_time = 0
Case "SEND FAIL" 'wysyłanie nie powiodło się
State = Startup : Send_time = 0
End Select
End Select
End Sub
.
W pętli głównej odliczam sobie minutę i:
.
Print #esp , "AT+RST" 'budź ESP i ślij dane na serwer
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 20:39
autor: niveasoft
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.
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 20:44
autor: pimowo
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.
Re: ATmega2560 - Konfiguracja 2x UART
: 12 paź 2020, 20:47
autor: niveasoft
Raczej to nie to. W sterowniku dzwonów używam wszystkich czterech USARTów w ten sposób i śmigają
'*****************************************************************
'* CONFIG BUFFERED USART FOR DEBUG via USB *
'*****************************************************************
Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Echo Off
Config Serialin0 = Buffered , Size = Max_usb_in_command_len 'RX from Terminal
Dim Char As Byte , Cmd_timeout1 As Byte , Got_str1 As Byte
Dim Command1 As String * Max_usb_in_command_len
Config Serialout0 = Buffered , Size = Max_usb_out_command_len 'TX to the Terminal
Open "COM1:" For Binary As #1
Const Usb = 1
'*****************************************************************
'* CONFIG BUFFERED USART FOR BLUETOOTH *
'*****************************************************************
Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin1 = Buffered , Size = Max_bluetooth_command_len 'RX from Android app
Dim Cmd_timeout As Byte , Got_str As Byte
Dim Command As String * Max_bluetooth_command_len
'Config Serialout1 = Buffered , Size = Max_bluetooth_command_len 'TX to the Android app
Open "COM2:" For Binary As #2
Const Blue = 2
Dim Bt_conn As Byte , Outstr As String * Max_bluetooth_command_len
'*****************************************************************
'* CONFIG BUFFERED USART FOR ESP8266 WiFi *
'*****************************************************************
Config Com3 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin2 = Buffered , Size = 250 'RX from ESP8266
Dim Cmd_timeout3 As Byte , Got_str3 As Byte
Const Max_lenght3 = Max_wifi_command_len - 1
Dim Command3len As Byte , Czekaj_z_komendami As Byte
Dim Command3 As String * Max_lenght3
Dim Comm_buff(max_wifi_command_len) As Byte At Command3 Overlay
Config Serialout2 = Buffered , Size = Max_wifi_command_len 'TX to ESP8266
Open "COM3:" For Binary As #3
Const Esp = 3