logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Brak komunikacji AVR z SIM800 - sprawdzanie UART i PCB

neo_84 30 Gru 2019 18:35 519 11
  • #1 18370078
    neo_84
    Poziom 15  
    Witam, chciałbym się doradzić szanownych kolegów gdzie może być problem z odbiorem. Siedzę już nad tym kilka dni, włosy siwieją a mi już pomysły się skończyły :( i co najgorsze nie wiem co może być przyczyną. Beznadziejny problem :( . Wcześniej bawiłem się modułami A6 GSM. Postanowiłem się przerzucić na "lepszy" model czyli SIM800. Wykonałem PCB, napięcie zasilania 3,8 V dla SIM i AVR. Konwerter napięć na rezystorach zgodnie z notą. 1k między TX(SIM)<->RX(AVR). Biblioteka do obsługi UART pana Mirka36 wiec 99% nie ma co tam szukać.
    Problem jest taki, że atmega nie odbiera wiadomości od modułu i nie mogę zlokalizować dlaczego ;(
    Napisałem krótki programik, który wysyła komendę AT+CCALR? Moduł ma odpowiedzieć +CCALR: 0 i odpowiada. Sprawdzałem przez serial monitor podłączony bezpośrednio do nóżki RXD, później przez analizator stanów logicznych i też pięknie odczytuje. Napisałem kolejny króciutki programik, który wysyła odpowiedź +CCALR:0, podmieniłem SIM na płytę prototypową, aby sprawdzić czy na pewno nie skopałem coś w programiku do odbioru. AVR ożył i zaczął radośnie migać diodką. Myślę może coś z napięciami stanów. Postanowiłem sprawdzić przy jakim poziomie napięć TX AVR przestanie reagować na odbierane dane. Wyszło coś około 2 V, a napięcie SIM TX to 2,8 V, wiec z dużym zapasem. W ramach desperacji podłączyłem konwerter napięć. Też nic nie pomogło.

    W skrócie, podłączając do pinu AVR RXD, serial monitor, analizator, arduino uno z włączonym serial monitor, wszystkie te sprzęty odczytują dane czyli wspomniane +CCALR: 0.
    AVR na PCB z SIM nie widzi tych danych. Na płycie prototypowej EVB5 skleciłem serial monitor, aby wyświetlał co odbiera na LCD i też nie odczytuje. Tak jak mówiłem beznadziejny przypadek, nie ma się czego czepić? Proszę o poradę i stawiam DUŻE PIWO dla tego kto rozwiąże tę zagadkę. No chyba, że ten 1% ale chyba nie pan Mirek...
  • #2 18370211
    excray
    Poziom 41  
    Pokaż schemat, pcb, kod.
  • #3 18370909
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeśli chodzi o bibliotekę Petera Fleury, w kręgach miłośników Atnel znaną jako "biblioteka PANA Mirka", to rzeczywiście nie posądzałbym jej o błędy. Pozostaje więc elektryka. Moduły GSM pracują na niskich napięciach logiki i w dodatku są wrażliwe na latchup, więc łatwo o błąd.
  • #4 18371380
    neo_84
    Poziom 15  
    Schemat PCB nr2 na tej płycie robię próby. PCB 1 jest praktycznie taka sama tyko dodana jest dioda prostownicza aby procesor był zasilany 3.3V . Do punktów TP podłączona jest przetwornica 3A nap 3.8V zasilanie modułu i avr.
    Brak komunikacji AVR z SIM800 - sprawdzanie UART i PCB

    Wybrane fragmenty programu po wciśnięciu przycisku wysyłam komende AT+CCALR?\r moduł ma odpowiedzieć +CCALR: 0 (nie ma karty SIM wiec ma być 0). A dokładnie jak już wchodzimy w szczegóły <CR><LF>+CCALR: 0<CR><LF><CR><LF>OK<CR><LF>
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wciskam przycisk i nic... diodki nie zamigają wiec odpalam serial monitor USB<->RS232 lutuje kabelek pod pin 2 czy RXD ,wciskam przycisk i pieknie dostaje odpowiedz a procesor dalej nic . To samo z analizatorem stanów logicznych oraz arduino wszystkie te urządzenia odbierają dane prócz AVR . Na szybko pisze prosty programik na innym pcb
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ma on za zadanie co sekunde wysyłać tylko odpowiedz +ccalr. Wyjmuje SIM podłączam płytke i pięknie wszystko działa .
    Sprawdzam przy jakim napięciu moduł przestanie odczytywać dane. Dzielnik napięcia na pot i skręcam , 2V min wiec tak jak pisałem wcześniej
    jeszcze dużo zapasu moduł daje 2.8V . Czasy na analizatorze sa takie same miedzy ramka wysłana z sim a z avr . i moze faktycznie coś nie tak z ta biblioteka do uart ? bo skoro arduino zasilane 5V bez problemu odczytuje.
    Jednym słowem nie wiem . Jest jedno wyjscie zrobić na ARDUINO ale powiem szczerze jakoś nie lubię tych modułów no i od nowa by trzeba robić pcb . Poczekam chwile jeszcze moze ktoś cos podpowie co mam zrobic gdzie mam sprawdzic... [/code]
  • #5 18371415
    excray
    Poziom 41  
    neo_84 napisał:
    c = uart_getc();
    if (c) {

    if (c == '\n') {


    if (!strcmp(INITSIM, bufer)) {

    Coś chyba nie bardzo. Dlaczego zakładasz, że pierwszy odebrany znak będzie '\n'? Gdzie wypełniasz "bufer" danymi? Nie wiem jak wygląda ta biblioteka z której korzystasz, ale na mój gust to nie ma prawa działać.
  • #6 18371465
    neo_84
    Poziom 15  
    excray napisał:
    Dlaczego zakładasz, że pierwszy odebrany znak będzie '\n'?
    nie zakładam po \n następuje obróbka danych i powrót na początek bufora num=0 .
    excray napisał:
    Gdzie wypełniasz "bufer" danymi?
    Zaraz po else... i dodaje "0" na koncu. W razie przepełnienia powrót na początek.
    excray napisał:
    ale na mój gust to nie ma prawa działać
    Akurat kodu bym sie nie czepiał działa w innych urządzeniach.
    ale tak w skrócie działa to tak.
    - sprawdzam czy uart coś odebrał c = uart_getc(); jesli c różne od 0 to znaczy że tak w if zamiast \n można podstawić \r
    - sprawdzam czy koniec komendy moduł zawsze po odpowiedzi wysyła znak <CR><LF> zresztą my tez pisząc na kompie zawsze po rozkazie wciska sie ENTER lub jak kto woli <CR>
    Jeśli wystąpi znak \n obróbka danych np. if (!memcmp(INITSIM, bufer, 6)) jesli pierwsze 6 znaków pokrywa sie z buforem zamigaj LED (out6 podłaczone do led) po czym powrót na początek buforu i odebranie kolejnych danych.
  • #7 18371564
    excray
    Poziom 41  
    Ok, już rozumiem. To co pisałem powyżej jest nieważne.
    Czy jesteś pewien, że funkcja: uart_puts("AT+CCALR?\r"); działa tak jak Ci się wydaje? Moim zdaniem nie. Zostanie wysłany tekst "AT+CCALR?\r" a chyba nie o to Ci chodziło. A dokładniej o to, że "AT+CCALR?\r" to nie jest to samo co "AT+CCALR?"<CR>
  • #8 18371637
    neo_84
    Poziom 15  
    excray napisał:
    "AT+CCALR?\r" to nie jest to samo co "AT+CCALR?"<CR>
    a czego niby nie ? \r = <CR> czyli inaczej (13) . Problem nie tkwi w nadawaniu tylko w odbieraniu , sam moduł pracuje prawidłowo.
    Ramka wysyłana przez SIM800
    Brak komunikacji AVR z SIM800 - sprawdzanie UART i PCB

    Ramka wysyłana przez zestaw uruchomieniowy EVB5 (symulacja sim800)
    Brak komunikacji AVR z SIM800 - sprawdzanie UART i PCB
    Według mnie jest identyczna a jednak z evb5 działa a z sim nie . Jeśli chodzi o prędkość próbowałem na 115200 oraz 9600 efekt taki sam.
  • #9 18371644
    Miziolek
    Poziom 10  
    @excray No akurat "AT+CCALR?\r" jest tożsame z dokumentacyjnym AT+CCALR?<CR>
  • #10 18371730
    neo_84
    Poziom 15  
    Wrecie widać jakieś światełko w tunelu :D jednak obstawiłem ten 1 % i coś jest nie tak z ta biblioteka pana mirka36. Tylko jak to naprawić ? a wiec do rzeczy. Winowajca jest ten fragment kodu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zmieniłem na :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I wszystko pięknie działa . Po to są przerwania w UART aby nawet jak uC robi coś innego w tym przypadku "delay" i tak dane trafiły do bufora cyklicznego. Co radzicie? Kodów UART prawdopodobnie nie mogę opublikować bo jest chroniony prawem autorskim ?
  • #11 18371820
    BlueDraco
    Specjalista - Mikrokontrolery
    Nic mi nie wiadomo o zakazie publikacji kodu P. Fleury. Być może zakaz dotyczy informacji o autorstwie kodu, tych, które zostały umieszczone w miejscu usuniętych sygnatur oryginalnego autora.

    Co do komunikacji z modemem: temat był poruszany wielokrotnie. Ogólnie: nie możesz czekać na konkretną odpowiedź modemu, bo ten może Ci odesłać coś zupełnie innego - i musisz być na to gotowy. Trzeba napisać parser odpowiedzi rozpoznający wszystkie użyteczne w danej aplikacji odpowiedzi i ignorujący wszystkie inne - najlepiej w przerwaniu UART. Rozpoznanie danej odpowiedzi powinno ustawiać znacznik. Po wysłaniu polecenia czekasz przez jakiś czas na znacznik rozpoznania spodziewanej odpowiedzi i odpowiednio na nią reagujesz.
  • #12 18372082
    neo_84
    Poziom 15  
    BlueDraco i tak właśnie zrobię jak mówisz wyrzucę delay. Opóźnienia zrobię na flagach i timerze . Po prostu coś delay nie służy przy obsłudze uart choć nie wiem dla czego teoretycznie powinno śmigać bez problemu.
REKLAMA