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

Atmega8 - USART nie odbiera danych, jak poprawnie skonfigurować komunikację?

lukas_gab 11 Kwi 2015 13:38 903 8
  • #1 14608295
    lukas_gab
    Poziom 15  
    Cześć. Chce przesyłać dane od jednej do drugiej atmegi. Złożyłem na 2 stykówkach, zasilam je z tego samego źródła. Podłączyłem TX-RX, RX-TX i chciałbym osiągnąć stan taki -

    1 Procesor 1 zmienia stan na diodzie
    2 Wysyła info że zmienił
    3 Procesor 2 odbiera bit
    4 Jeżeli odebrany bajt to '1' to procesor 2 zmieni stan swojej diody

    W związku z tym napisałem dwa programy, bazując na opracowaniach z sieci :

    Nadajnik :
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odbiornik

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Niestety nie wiem dlaczego ale albo nic nie wysyłam, albo nic nie odberam, i nie wiem dlaczego tak jest ... jak mogę zdiagnozować problem ? Może kod jest zły ? Posiadam niestety tylko jakiś zwykły miernik i wiem, że na TX i RX jest non stop 3,3V, nie wiem, czy tak powinno być. Proszę o pomoc i z góry dziękuję.

    Dodam, że procesory pracują na wew oscylatorze 8mhz.
  • #2 14610057
    szczywronek
    Poziom 28  
    Cześć.

    1.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Mam nadzieję, że to przejęzyczenie z tym bitem/bajtem?
    2. Bazuj na dokumentacji mikrokontrolera i używanych narzędzi ;)
    3. "define F_CPU" bezpieczniej jest ustawić w opcjach projektu.
    4. Zamiast ręcznego liczenia UBRR możesz skorzystać z: http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html
    5. Jak jest podłączona dioda?
    6. Na pewno ma być raz PC0 i raz PC5? I co chciałeś uzyskać tą drugą linijką?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    7.
    lukas_gab napisał:
    procesory pracują na wew oscylatorze 8mhz
    Jak zmieniłeś fusebity?
    8. Zakładam, że wszystko kompiluje i wgrywa się bez błędów i ostrzeżeń? Nie napisałeś co się dzieje po włączeniu zasilania. Dioda nadajnika miga?
  • #3 14610470
    lukas_gab
    Poziom 15  
    szczywronek napisał:
    Cześć.

    1.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Mam nadzieję, że to przejęzyczenie z tym bitem/bajtem?


    Dokładnie przejęzyczenie.

    szczywronek napisał:

    2. Bazuj na dokumentacji mikrokontrolera i używanych narzędzi ;)


    Bazuje. Wiem, że jest to nieco trudniejsze niż opierania się na gotowcach, ale daje fajne efekty. Kiedyś miałem problem z ds18b20, prawda, że paru kolegów z elektrody popchnęli mnie do tego, ale jak przeczytałem dokumentacje, wszystko stało się jasne i klarowne i problem rozwiązałem.

    szczywronek napisał:

    3. "define F_CPU" bezpieczniej jest ustawić w opcjach projektu.

    Dlaczego bezpieczniej ? Wybacz, ale nie używam jeszcze tak zaawansowanych narzędzi. Używam gcc i make - napisałem makefile z 3 zadaniami - kompilacja, wgranie, sprzątanie i tyle. W makefile korzystam z gcc oaz avrdude

    szczywronek napisał:

    4. Zamiast ręcznego liczenia UBRR możesz skorzystać z: http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html


    Znów - po co ? Przecież nawet jak chce to zrobić konfigurowalnym to mogę to obliczyć raz i tyle, a informacje o tym ile to jest ( bez liczenia w programie), nie zajmuje aż tak dużo miejsca.


    szczywronek napisał:

    5. Jak jest podłączona dioda?


    Diody sa ok testowałem. Nic specjalnego - pin - dioda- rezystor- masa

    szczywronek napisał:

    6. Na pewno ma być raz PC0 i raz PC5? I co chciałeś uzyskać tą drugą linijką?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Znów literówki - fakt. Chciałem wymusić na start stan niski na diodzie

    szczywronek napisał:

    7.
    lukas_gab napisał:
    procesory pracują na wew oscylatorze 8mhz
    Jak zmieniłeś fusebity?


    avrdude

    szczywronek napisał:

    8. Zakładam, że wszystko kompiluje i wgrywa się bez błędów i ostrzeżeń? Nie napisałeś co się dzieje po włączeniu zasilania. Dioda nadajnika miga?


    Tak jest.


    Dzięki za zainteresowanie. Niestety (nie)rozwiązałem już swój problem. Metodycznie znalazłem tutorial, gdzie ktoś składal coś podobnego na atmegach32 - w końcu nic innego z tym, że maja dwa uarty. Złożyłem i zaprogramowałem - działa ! No to zacząłem robić roll back - czyli zmiana po zmianie je cofałem, w kierunku moich pierwotnych programów żeby zobaczyć gdzie błąd. Suma summarum doprowadziłem programy do tej samej postaci co w poście na początku i nadal działa ... Nie mam pojęcia co jest nie tak. Różnica jest taka, że dziś jeszcze raz podłączyłem linie komunikacyjne, bo wieczorem chowałem zabawki i musiałem rozdzielić płytki stykowe. Jeżeli teraz to działa, to albo jest to strasznie złośliwy przypadek, albo sądze, że problemem był hardware, a po przyłączaniu coś zadziałało. Niemniej martwi mnie, że nie jestem pewny na 100% dlaczego nie działało a działa. Proszę tylko wytłumacz jeszcze kwestie które zawarłem wyżej w pytaniach na twoją odpowiedź.

    No to teraz skoro mam pewność, że bajty wychodzą, to spróbuję skomunikować Raspberry Pi i Atmege ;)
  • #4 14610744
    dondu
    Moderator na urlopie...
    lukas_gab napisał:
    szczywronek napisał:

    3. "define F_CPU" bezpieczniej jest ustawić w opcjach projektu.

    Dlaczego bezpieczniej ? Wybacz, ale nie używam jeszcze tak zaawansowanych narzędzi. Używam gcc i make - napisałem makefile z 3 zadaniami - kompilacja, wgranie, sprzątanie i tyle. W makefile korzystam z gcc oaz avrdude

    Dlatego: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    Dlaczego tak się męczysz zamiast wykorzystać oryginalne Atmel Studio?: http://mikrokontrolery.blogspot.com/2011/04/atmel-studio-spis-tresci.html

    lukas_gab napisał:
    szczywronek napisał:

    4. Zamiast ręcznego liczenia UBRR możesz skorzystać z: http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html


    Znów - po co ? Przecież nawet jak chce to zrobić konfigurowalnym to mogę to obliczyć raz i tyle, a informacje o tym ile to jest ( bez liczenia w programie), nie zajmuje aż tak dużo miejsca.

    Wskazane przez szczywronek niczego w programie nie liczy - robi to kompilator w trakcie kompilacji. Zauważ natomiast, że wskazany algorytm wykorzystuje w pełni właściwości mikrokontrolera w zakresie Double speed (bit U2X) - przykład:
    http://mikrokontrolery.blogspot.com/2011/03/rs-232-atmega8-komputer-terminal.html

    Taktujesz ATmegę kwarcem zewnętrznym, czy wewnętrznym generatorem 8MHz? Jeśli tym drugim, to pamiętaj o tym, że nie gwarantuje on poprawnej transmisji.
  • #5 14610929
    szczywronek
    Poziom 28  
    To jeszcze dorzucę na koniec:

    - F_CPU (czy jakąkolwiek inną makrodefinicję) możesz zapodać w makefile'u jako dodatkowy parametr dla gcc (-D).
    - Moim głównym faworytem jeśli chodzi o przyczynę nie działania było to, że ustawiałeś wyjście na innym pinie niż potem togglowałeś (ten błąd z PC0/PC5).
    - Przy problemach z komunikacją przydaje się analizator logiczny - takim klonem Saleae za ~40zł można całkiem sporo zdziałać.
  • #6 14610947
    dondu
    Moderator na urlopie...
    szczywronek napisał:
    - F_CPU (czy jakąkolwiek inną makrodefinicję) możesz zapodać w makefile'u jako dodatkowy parametr dla gcc (-D).

    co jest opisane we wskazanym artykule.

    szczywronek napisał:
    - Przy problemach z komunikacją przydaje się analizator logiczny - takim klonem Saleae za ~40zł można całkiem sporo zdziałać.

    lub za 7$ z darmową dostawą na aliexpress, czy ebay,
  • #7 14612160
    lukas_gab
    Poziom 15  
    Dzięki za zainteresowanie. Zapomniałem o selektywnej kompilacji, bo mam w zwyczaju sprzątanie przed kompilacją, i całość się builduje (nawyk z pracy zawodowej w borland c++). Stosowanie dodatkowego parametru kompilacji zamiast dyrektywy i tak, mimo wszystko jest lepsze i w razie co zabezpiecza przed błędami i będę (już)to stosował. Faktycznie, wyczytałem to wcześniej w zalinkowanym wyżej arcie - umiem czytać. Co do makr które są obliczane w trakcie kompilacji - prócz lenistwa lub braku umiejętności nie widzę sensu - technicznie po kompilacji nie ma się zysku, ani w wydajności ani w pamięci, tylko oszczędza się wysiłek w policzeniu tego - póki co w celach edukacyjnych wole sam wyprowadzać wzory, czy obliczać nawet całą wartość. Nie mówię, ze to absolutnie poprawne i konieczne ale wpaja pewne rzeczy.


    Co do powodu niedziałania - wątpię w to co podaliście - nadal mam przemieszanie pinów w kodzie i działa. Sądzę, że to złośliwy random.

    Nie używam atmel studio, bo nie mam programatora. Do programowania używam gołego raspberry pi, więc dla wygody programuje w vim, make i gcc przez ssh (via putty) - przez rdp lekko się ścina mimo 100Mbps.

    Kiedyś zrobiłem usbasp na stykówce, ale jak przeniosłem na uniwersalną, to coś mi nie wyszło i spaliłem atmege - a że moim celem nie jest zrobienie programatora a systemu pomiarowego, to stwierdziłem, że nie ma sensu poświęcać czasu i kasy na programator jak rpi daje mi to samo. Niemniej, jak pisałem prototypy na arduino, dzie obsługa jest przez atmel studio - nie robiłem tego wolniej ani nic - bo pisanie to 10%, 50% projektowanie i 40% debug. Jak na razie mam mało czasu na pracę, więc nie robię czego nie potrzebuje.

    Analizator logiczny - już o tym myślałem, chyba faktycznie kupie ten tani klon na ali, już kupowałem tam, jednak kusi mnie w przyszłości zrobienie takiego analizatora, z ekranem lcd, żeby nie było konieczne podpinanie pod pc, żeby odczytać wartości.

    Dzięki za pomoc, i ciekawe info, jednak jakby ktoś miał iną hipotezę niedziałania to z chęcią wysłucham.
  • #9 14612672
    lukas_gab
    Poziom 15  
    Jak wspomniałem w postach wyżej z kodem wróciłem do postaci macierzystej i teraz działa - nie wiem dlaczego. Oscylator wewnętrzny 8 MHz - również wspominałem, niemniej tylko na potrzeby prototypowe - weekend a nie miałem pod ręką wolnego kryształu, a zapomniałem kupić - docelowo będę procesory zaopatrzone w kryształ.

    Dioda na początku już migała w nadajniku - na rx odbiornika miałem 3,3v, natomiast na tx 3,3 i skakało na 3,25 rytm migania diody - nie wiem dlaczego. Mówię teraz posłkładałem i działa. wieczorem, jub jutro (niestety już tydzień pracy), postaram się odtworzyć błąd, żeby dojść do jego powodu ...
REKLAMA