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

ATmega644PA - Błędy UART przy połączeniu z ESP8266 i konwerterze poziomów

MagnusArias 20 Gru 2016 21:19 2967 40
  • #1 16139977
    MagnusArias
    Poziom 8  
    Witam
    Robię projekt kompetencyjny, a jednym z jego elementów jest podłączenie w/w ATmegi do modułu ESP8266. Problem polega na tym, że pomimo wielu prób i konfiguracji, ciągle na wyjściu z mikrokontrolera otrzymuję śmieci. Sam moduł Wi-Fi jest sprawny, gdyż został sprawdzony. Wiem również, że ATmega pracuje na poziomie logicznym 5V, a ESP8266 na poziomie 3V3, dlatego po drodze jest zastosowany konwerter poziomów. Dodatkowo, znalazłem informację, że zmiana fusebitu CKDIV8 naprawia te błędy, jednak u mnie bez skutków.
    Używam jednocześnie ekranu HD44780 w celu sprawdzenia odbieranych danych.

    Wrzucam listingi moich plików (main.c oraz uart.c)
    Liczę na pomoc oraz szybkie rozwiązanie problemu.

    Pozdrawiam
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 16140020
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16140033
    MagnusArias
    Poziom 8  
    Sam moduł ESP sprawdzałem z terminalem, ale poprzez Arduino i żadnych problemów nie było, wszystko poprawnie. Natomiast po wgraniu tego kodu do ATmegi i podłączeniu jej do terminala przez Arduino, otrzymuję same śmieci. Wysłać mogę cokolwiek, ale nie można tego przeczytać.

    W tej chwili dysponuję jedynie kwarcem 12MHz oraz 26.601712MHz.

    Dodam, że w dyrektywach preprocesora jest dodana linia F_CPU=18432000. Z noty katalogowej producenta, że dla tego wartości błędy są równe 0, w porownaniu do innych wartości.
  • #4 16140056
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16140096
    MagnusArias
    Poziom 8  
    Częstotliwość wzięta z noty katalogowej producenta. ATmega644PA - Błędy UART przy połączeniu z ESP8266 i konwerterze poziomów

    Pytanie może i głupie, ale jak podłączyć oscylator?
  • #6 16140123
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16140129
    dondu
    Moderator na urlopie...
    MagnusArias napisał:
    Pytanie może i głupie, ale jak podłączyć oscylator?

    Czyli nie podłączyłeś jeszcze kwarcu i nie przestawiłeś fusebitów?
    Jeśli tak, to nadal pracujesz na wewnętrznym generatorze.

    http://mikrokontrolery.blogspot.com/2011/03/A...AVR-Oscylatory-kwarcowe-kwarc-ceramiczne.html
  • #8 16140142
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16140146
    MagnusArias
    Poziom 8  
    Aktualnie pracuję na wewnętrznym generatorze, a jedyny fusebit jaki ustawiłem to CKDIV8.
  • #10 16140149
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16140170
    excray
    Poziom 41  
    Piotrus_999 napisał:
    To zmień F_CPU na 8000000UL. Może ruszy.

    MagnusArias napisał:
    Aktualnie pracuję na wewnętrznym generatorze, a jedyny fusebit jaki ustawiłem to CKDIV8.

    Raczej na 1000000UL.
  • #12 16140191
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16140203
    MagnusArias
    Poziom 8  
    Standardowo ten bit jest zaprogramowany, że dzieli przez 8 taktowanie wewnętrznego oscylatora, zatem przełączyłem to, coby nie dzielił.
    Pytanie kolejne - kwarc podpiąłem pod XTAL, które fusebity ustawić, by z niego skorzystać w tym przypadku?
  • #15 16140220
    tmf
    VIP Zasłużony dla elektroda
    MagnusArias napisał:
    Standardowo ten bit jest zaprogramowany, że dzieli przez 8 taktowanie wewnętrznego oscylatora, zatem przełączyłem to, coby nie dzielił.
    Pytanie kolejne - kwarc podpiąłem pod XTAL, które fusebity ustawić, by z niego skorzystać w tym przypadku?


    Odpal sobie w Atmel Studio dialog programowania i wybierz z listy pożądane źródło taktowania. Jeśli masz współpracujący programator to wystarczy, jeśli używasz np. SBAsp to sobie zanotuj podane wartości fusów i nimi zaprogramuj układ.
  • #16 16140498
    dasej
    Poziom 32  
    Witam.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przy zegarze wewnętrznym 8 MHz i wyłączonym dzielniki przez 8 oraz ustawiasz F_CPU=8000000 i musi działać.
  • #17 16140756
    tmf
    VIP Zasłużony dla elektroda
    dasej napisał:


    Przy zegarze wewnętrznym 8 MHz i wyłączonym dzielniki przez 8 oraz ustawiasz F_CPU=8000000 i musi działać.


    No niestety nie musi. Musi jeśli jest podłączony rezonator kwarcowy.
  • #18 16140767
    Konto nie istnieje
    Konto nie istnieje  
  • #19 16140801
    kamyczek
    Poziom 38  
    Według mnie kolega ma problem w tym że nie potrafi jednoznacznie zdiagnozować przyczyny nieprawidłowego działania więc podłączył bym zewnętrzny rezonator wyłączył podział przez 8 i przetestował czy działa poprawnie , nie jest powiedziane że uart na oscylatorze rc nie będzie działał , ale wymaga to 'dopracowania szczegółów i z pewnością problemy będą narastały wraz ze wzrostem prędkości transmisji.
  • Pomocny post
    #20 16140839
    dondu
    Moderator na urlopie...
    @MagnusArias: Przy okazji zastanów się jakie operacje na rejestrze UCSR0C realizuje Twoja funkcja SerialInit() dla takich parametrów:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przeanalizuj i napisz jaka będzie zawartość rejestru UCSR0C.


    kamyczek napisał:
    ... z pewnością problemy będą narastały wraz ze wzrostem prędkości transmisji.

    ... i/lub zmianą temperatury.
  • #21 16140867
    dasej
    Poziom 32  
    @Piotrus_999
    Oczywiście masz rację. Ale jak da 2400 to musiał by mieć wyjątkowego pecha by mu nie ruszyło.
    W firmie robimy kilkadziesiąt tysięcy sztuk miesięcznie bez kwarcu zewnętrznego.
    Tylko 0.001% nie działa poprawnie przy transmisji rs 38400.
  • #22 16140874
    Konto nie istnieje
    Konto nie istnieje  
  • #23 16141231
    kamyczek
    Poziom 38  
    Jeżeli rozrzut oscylatora rc mieści się w zakresie 2% i przyłożymy się do tego żeby w warunkach normalnych być jak najbliżej środka to układ z dużym prawdopodobieństwem będzie działał poprawnie bo błąd generatora przekłada się 1:1 na błąd uarta a ten w zakresie +/- 2% powinien działać prawidłowo i nawet jeśli trafi się sztuka która ma odchyłkę można ją w pewnym zakresie zniwelować zmieniając minimalnie osccal lub prędkość uarta . Budowałem urządzenia które pracują na dworze maja od +40 do -40 C i ani brak rezonatora kwarcowego ani skoki temperatur im nie szkodzą ale to trzeba zrobić biorąc pod uwagę takie parametry i po prostu sprawdzić efekty . Błędy działania uarta zazwyczaj wynikają z przeładowania bufora nadawczego lub zbyt wolnego odbierania danych z bufora odbiorczego . A po podpięciu analizatora wyszło że atmel wysyła tak jak trzeba tylko terminal się gubi przy szybkich i długich pakietach danych i wychodzą śmieci .
  • #24 16141299
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #25 16142456
    dondu
    Moderator na urlopie...
    kamyczek napisał:
    Jeżeli rozrzut oscylatora rc mieści się w zakresie 2% i przyłożymy się do tego żeby w warunkach normalnych być jak najbliżej środka to układ z dużym prawdopodobieństwem będzie działał poprawnie bo błąd generatora przekłada się 1:1 na błąd uarta a ten w zakresie +/- 2% powinien działać prawidłowo i nawet jeśli trafi się sztuka która ma odchyłkę można ją w pewnym zakresie zniwelować zmieniając minimalnie osccal lub prędkość uarta . Budowałem urządzenia które pracują na dworze maja od +40 do -40 C i ani brak rezonatora kwarcowego ani skoki temperatur im nie szkodzą ale to trzeba zrobić biorąc pod uwagę takie parametry i po prostu sprawdzić efekty . Błędy działania uarta zazwyczaj wynikają z przeładowania bufora nadawczego lub zbyt wolnego odbierania danych z bufora odbiorczego . A po podpięciu analizatora wyszło że atmel wysyła tak jak trzeba tylko terminal się gubi przy szybkich i długich pakietach danych i wychodzą śmieci .

    O to duże prawdopodobieństwo (o którym piszesz) właśnie chodzi, czyli o brak pewności działania urządzenia.

    Dobry projektant różni się od kiepskiego tym, że przy założonym koszcie produkcji jego urządzenia działają zawsze i wiecznie, a tego drugiego przez przypadek.

    Niestosowanie kwarcu do urządzeń pracujących w zakresach jakie wspomniałeś, w dodatku kwarców przeznaczonych do takich temperatur jest oczywiście dopuszczalne nawet na poziomie profesjonalnym:
    - jeśli urządzenie nie musi być niezawodne
    - lub dodanie odpowiedniego kwarcu powoduje znaczący wzrost kosztów urządzenia,
    - lub następuje autokalibracja w zależności od temperatury.

    Można oczywiście wykorzystać wbudowane w niektóre mikrokontrolery elementy pomiarowe temperatury wewnętrznej mikrokontrolera lub jeśli go nie ma, zawsze można wykorzystać tani termistor i go dołożyć. Wtedy można opracować program tak, by sam się kalibrował w zależności od temperatury pod warunkiem, że taka programowa możliwość istnieje.

    Dlatego też my uczymy jak projektować poprawnie, ale oczywiście można stosować pewne kompromisy - ważne by być świadomym konsekwencji.

    Problem z takimi wypowiedziami jak Twoje jest taki, że początkujący zapamięta, że przecież na forum Kamyczek pisał że będzie działać, a wykonany projekt, poświęcony czas i pieniądze poszły na marne, bo nie ma jak dodać kwarcu i kondensatorów. Ba, a może nawet pacjent zmarł, bo defibrylator nie działał na mrozie ...

    Dlatego nasze wypowiedzi muszą wyjaśniać wszelkie aspekty z tym związane, by nie tworzyły się mity powtarzane później w sieci.


    To, że opisany przez Ciebie mikrokontroler działał prawidłowo mogło być bowiem spowodowane faktem, że mikrokontroler wcale nie miał temperatury -40°C, ze względu na wydzielane w nim ciepło związane z takim, a nie innym zaprojektowaniem urządzenia. To należałoby indywidualnie przeanalizować, ale nie można podawać tego jako reguły.

    ... osobny aspekt, to sumowanie się błędów niedopasowania częstotliwości po stronie obu "gadających" ze sobą urządzeń. Co z tego bowiem, że oba trzymają swoje parametry w granicach błędu np. 2%, gdy akurat błędy te są z przeciwnym znakiem, co daje łączny błąd 4% ...

    O ile na błąd mikrokontrolera można mieć łatwy wpływ dodając kwarc lub kalibrując, o tyle w drugim urządzeniu możemy nie mieć takiej możliwości. W takiej sytuacji bezwzględnie należy zastosować kwarc, a nawet kwarc tzw. "USART friendly", czyli taki, który daje zerową wartość błędu częstotliwości.

    Dlatego starajmy się podpowiadać tak, by czytelnicy znali konsekwencje niezastosowania właściwego w danej sytuacji rozwiązania i poznali związane z tym zysk, koszty oraz ryzyko.

    W szczególności o ryzyko tutaj chodzi, bo to że Ty je podjąłeś, to była Twoja przemyślana (mam nadzieję) decyzja.
    Swoją drogą dlaczego taką decyzję (czytaj ryzyko) podjąłeś?
  • #26 16142735
    MagnusArias
    Poziom 8  
    Dziękuję za wszystkie odpowiedzi, trochę mnie naprowadziły na odpowiednią drogę.

    @dondu:
    Przeanalizowałem swoja funkcję SerialInit i podejrzewam, że błędem jest, że do całego rejestru zapisuję tylko jedną jedynkę, a nie poprzez maskę (UCSR0C = ... zamiast UCSR0C |= ...), a przez to pozostałe wartości rejestru się zerowały, dobrze rozumiem?

    Myślę, że dołożenie kwarcu 18.432MHz będzie wystarczającym rozwiązaniem. Mam problem jedynie z ustawienie fusebitów: Na pewno muszę CKDIV8 ustawić, by nie dzielił zegara, a CKSEL[0..3] jako External Clock, ale nie wiem który Startup Time wybrać i jaki on ma wpływ na pracę. Dodatkowo: co oznacza wartość CK przy ustawieniach?
  • Pomocny post
    #27 16142840
    dondu
    Moderator na urlopie...
    MagnusArias napisał:
    Przeanalizowałem swoja funkcję SerialInit i podejrzewam, że błędem jest, że do całego rejestru zapisuję tylko jedną jedynkę, a nie poprzez maskę (UCSR0C = ... zamiast UCSR0C |= ...), a przez to pozostałe wartości rejestru się zerowały, dobrze rozumiem?

    Bardzo dobrze :)

    MagnusArias napisał:
    Mam problem jedynie z ustawienie fusebitów: Na pewno muszę CKDIV8 ustawić, by nie dzielił zegara, a CKSEL[0..3] jako External Clock, ale nie wiem który Startup Time wybrać i jaki on ma wpływ na pracę. Dodatkowo: co oznacza wartość CK przy ustawieniach?

    Nie External Clock, tylko Full Swing Crystal Oscillator (Table 10-1. Device Clocking Options Select)

    Przeczytaj rozdział 10.4. Full Swing Crystal Oscillator
    w szczególności note pod tabelą Table 10-5. Full Swing Crystal Oscillator operating modes

    Start up time możesz ustawić najdłuższy chyba, że masz potrzeby super szybkiego startu po włączeniu zasilania.

    Zanim ustawisz fusebity daj je nam do sprawdzenia.
  • #28 16142859
    MagnusArias
    Poziom 8  
    Okej, użyję kwarcu 18.432MHz na pewno.
    Fusebity:
    LOW: 0xF7 (Full Swing Oscillator, Startup time 16CK + 65ms, Crystal Osc.) oraz CKDIV8
    HI: 0x99
    EXT: 0xFF
  • #30 16142892
    MagnusArias
    Poziom 8  
    Dzięki, może jeszcze dzisiaj wieczorem lub chwilę po świętach dam znać co wyszło
REKLAMA