Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][Język C] Jak zrealizować transmisję przez UART

17 Cze 2011 16:07 5766 42
  • Poziom 13  
    Szanowni Forumowicze,
    Bardzo proszę o pomoc! Napisałem program realizujący transmisję UART na podstawie książki "Mikrokontrolery AVR Język C Podstawy programowania" (Mirosław Kardaś), ale nie działa on prawidłowo, a w zasadzie nie działa wcale. Od strony sprzętowej projekt zrealizowałem na płytce uruchomieniowej ZL2AVR (MAX232). F_CPU 8MHz (w pliku makefile - AVRStudio5 beta2) - wewnętrzny oscylator - fusy 8MHz. Podłączyłem wyjście TXD (MAX232 pin 11) z RXD (ATmega8 pin PD0), a wyjście RXD (MAX232 pin 12) z TXD (ATmega8 pin PD1) - kabel fabryczny RS232. Na komputerze działa program RealTerm v2.0.0.57. Niestety nie odbiera on danych z mikrokontrolera - świecą się na zielono 2 pola: CTS i DSR jak na obrazku:
    [Atmega8][Język C] Jak zrealizować transmisję przez UART
    Podłączenie innego urządzenia w tej samej konfiguracji daje prawidłową odpowiedź terminala:
    [Atmega8][Język C] Jak zrealizować transmisję przez UART

    Gzie popełniam błąd?

    OTO KOD PROGRAMU:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 28  
    Musisz mieć coś źle w połączeniach.
    Używałem tego samego kodu i wszystko działało
  • Poziom 18  
    A co mówi Ci kompilator :?: Implementację funkcji USART_Init() masz "po" funkcji głównej main. Wg mnie powinieneś wtym układzie predefiniować USART_Init() gdzieś na początku kodu, tak jak to zrobiłeś z funkcją USART_Transmit().

    Pozdrawiam
    Piotrek
  • Poziom 13  
    Dziękuję. Definicję funkcji inicjalizującej przeniosłem na sam początek kodu przed "main"' ale to nic nie zmieniło. Kompilator w obu przypadkach nie pokazuje żadnych błędów, ani ostrzeżeń. Pozdrawiam.
  • Poziom 27  
    No to masz sprzętowy problem. Zapodaj oscyloskop i zobacz czy idą impulsy. Sprawdź czy w przetwornicy MAX232 są napięcia +-9V.
  • Poziom 13  
    Dziękuję FREDY. Powiedz proszę gdzie dokładnie zmierzyć napięcia na MAX232. Jeżeli chodzi o "impulsy" to nie ma ich nigdzie. Na PD0 procesora - stan niski (+1.51V), na PD1 procesora - stan wysoki (+5.05V). Na TXD MAX'a - stan niski (+1.12V), na RXD MAX'a - stan wysoki (+4.92V). Napięcie zbliżone do tego, o którym mówisz jest na pinie 13 MAX'a (-7.89V). Napiszcie proszę jak wg Was wyprowadzenia MAX'a (11,12,13,14) podłączyć z pinami ATmega8 (PD0, PD1) i w którym miejscu badać przebieg oscyloskopem.
  • Poziom 15  
    Zrob zwarcie na max232 pin 11 i 12. Sprawdz w Realtermie czy wraca do ciebie to co napisales. W taki sposob bedizesz mial sprawdzony max232 i kabel czy dziala poprawnie.
  • Poziom 13  
    Napisz proszę co i gdzie wpisać i jak ma wrócić.
  • Poziom 27  
    Jeśli procek ma coś wysyłać to muszą być widoczne impulsy na linii Txd. Podobne impulsy muszą być na wyjściu Maxa , ma być zmieniona polaryzacja i inna amplituda.
    Sprawdz to .
  • Poziom 13  
    Na PD0 i PD1 stan wysoki (ok. +5.0V). Brak jakichkolwiek impulsów. Czyli musi być coś nie tak z programem, który zamieściłem na początku. Proszę przyjrzyjcie się mu jeszcze raz.
  • Poziom 42  
    zbysiusp napisał:
    .... Czyli musi być coś nie tak z programem, .


    Bardzo ciekawe podejście. A to nie jest nawet kod z książki tylko wprost z noty katalogowej PDF od dowolnego procka AVR....

    Dodano po 13 [sekundy]:

    xamrex napisał:
    Musisz mieć coś źle w połączeniach.
    Używałem tego samego kodu i wszystko działało


    Dodano po 3 [minuty]:

    zbysiusp napisał:
    Dziękuję. Definicję funkcji inicjalizującej przeniosłem na sam początek kodu przed "main"' ale to nic nie zmieniło. Kompilator w obu przypadkach nie pokazuje żadnych błędów, ani ostrzeżeń. Pozdrawiam.


    Bardzo jestem ciekaw jak kolega ocenia to, że się nic nie zmieniło? W przykładzie z początku postu powinien być generowany Warning a po takiej poprawce jak tu opisana - warning powinien zniknąć. Więc ja może się nic nie zmieniać ? Coś kolega zbyt nerwowo to wszystko sprawdza, i zamiast szukać błędu to doszukuje się błędu w tym co działa czyli w kodzie.
  • Poziom 13  
    Proszę uprzejmie powiedzieć jak to uruchomić.
  • Poziom 42  
    Proponuję zacząć od pokazania swojego dokładnego schematu połączeń - wtedy będzie łatwiej coś poradzić/podpowiedzieć - bo tak jak wszyscy sugerują - to tam będzie leżał pies pogrzebany.

    Dodano po 1 [minuty]:

    zbysiusp napisał:
    Proszę uprzejmie powiedzieć jak to uruchomić.


    pod drodze błędów może być bardzo dużo :( więc jak nie widząc co tam kolega ma zrobione - można powiedzieć jednym słowem "jak to uruchomić" ?

    Chciałbym pomóc ale nie wiem jak - jeszcze raz powtórzę, schemat albo też jeszcze ew fotki jak to jeszt podłączone wszystko
  • Poziom 13  
    Schemat do układu uruchomieniowego ZL2AVR. W załączeniu link. Podłączyłem tylko wyjścia MAX'a TXD do PD1 i RXD do PD0.
    http://www.cyfronika.com.pl/uruchomieniowe/zl2avr.pdf

    Dodano po 3 [minuty]:

    Błędów może być po drodze niestety dużo, ale jako amator-hobbysta zgodnie z zaleceniami z książki, nie zniechęcam się i walczę. Inaczej cały trud dydaktyczny autora poszedłby na marne, a na pewno nie o to Mu chodzi. Pozdrawiam.
  • Poziom 42  
    To teraz rozłącz MAX232 od procka i zewrzyj najpierw sobie te dwa piny TXD i RXD (przy układzie MAX232). Wtedy zajrzyj do terminala - wszystko co wpiszesz powinno się od razu pokazywać w terminalu (echo). I odpowiedz w końcu - czy widzisz to echo czy nie - bo już też ktoś cię o to pytał.

    Jeśli nie będziesz miał echa to znaczy że kabel jest coś nieteges - albo gniazdka itp

    jeśli będzie działać - to powiedz - pójdziemy wtedy dalej...
  • Poziom 13  
    W mojej dziedzinie standardy i algorytmy to podstawa. Dlatego proszę się nie dziwić, że powielam przykłady i zapamiętuję ich konstrukcję. Bez podstaw brak narzędzi do eksperymentowania na trudniejszej materii.
  • Poziom 42  
    Ja tam się niczemu nie dziwię, już sporo rzeczy w życiu widziałem ;), ale dziwi mnie tylko - usilny tutaj brak odpowiedzi na podstawowe pytania w/s testowania....

    co z echem ?
  • Poziom 13  
    Echa brak. Po naciśnięciu przycisku "send ASCII" na moment zapala się żółte pole TXD, ale w oknie terminala nic się nie pokazuje. Tak jakby interfejs był martwy.

    Dodano po 44 [sekundy]:

    Sprawdziłem to już dawno - sorki.
  • Poziom 42  
    no to jak brak echa - to JAK możesz pisać - że program nie działa ???? hmmm ???

    to teraz sprawdź kabel, gniazdka itd - bo już na 100% można powiedzieć, że na pewno tu masz co najmniej jeden błąd .
  • Poziom 13  
    Kabel sprawdzony. Jak pisałem wyżej (pierwszy post) podłączenie go do innego urządzenia (zegar) powoduje lawinę informacji w oknie terminala (ten sam port, ta sama prędkość). Może MAX nie działa. Jak go sprawdzić?

    Dodano po 5 [minuty]:

    Połączenie też dość solidne.
    [Atmega8][Język C] Jak zrealizować transmisję przez UART
  • Poziom 42  
    Ja bym jednak na twoim miejscu wziął w rękę miernik z brzęczykiem i przedzwonił kabel - czy przypadkiem nie masz kabla ze skrosowanym Rx oraz Tx ????

    Bo to żadne wytłumaczenie tym bardziej tu na forum, że jakieś inne urządzenie ci działa. A czy wiesz i jesteś pewien że ono właśnie nie potrzebuje takiego skrosownageo kabla a ty go akurat masz ??? Takim sposobem to można 3 miesiące dochodzić do błędu. Bo nawet jeśli ty wiesz że nie jest skrosowany - to nie napisałeś tego wyraźnie - a może nie wiesz ???

    MAX'a jak sprawdzić ?

    podłączyć mu zasilanie i zobaczyć czy jest na nóżkach zasilania - po zwarciu Tx z Rx - MUSI dawać echo. Jeśli nie daje to znowu - albo źle osadzony, połączony albo uszkodzony. Ale on ma jeszcze jedną parę nadajnik/odbiornik - tylko musiałbyś mu do tych nóg przełączyć jakoś kable. Albo wyjąć z podstawki scalaka i włożyć drugiego jeśli w ogóle jest w podstawce.

    Takie rzeczy to bez oscyloskopu daje się sprawdzić.

    Dodano po 3 [minuty]:

    o zdjęcie ;) ... czy ten scalak nie jest troszkę przesunięty ? - może po prostu wyjmij go i włóż ponownie w podstawkę - bo może te nogi na końcu w kololicy jumperka nie stykają czy jak ?
  • Poziom 13  
    W podstawce jest. Amator, ale nie partacz. Kabel przedzwonię i dam znać za moment.
  • Poziom 42  
    aha - jeszcze na szybko możesz sprawdzić sam kabel i echo - zwierając w samym kablu 2 i 3 .... po sprawdzeniu oczywiście czy nie jest w środku skrosowany.

    Jeśli nie skrosowany i echo w końcu będzie wracać - to przynajmniej będziesz miał już pewność na 100% że kabel OK

    więc pozostanie MAX do zbadania.

    Dodano po 1 [minuty]:

    zbysiusp napisał:
    W podstawce jest. Amator, ale nie partacz. Kabel przedzwonię i dam znać za moment.


    Nie urażaj się - ja nie zarzucam ci partactwa czy amatorszczyzny - po prostu gdyby nawet mi coś takiego nie działało to bym dokładnie tak samo postępował jak tu opisuję.
  • Poziom 13  
    Efekty moich ustaleń:
    1. Kabel nie jest skrosowany.
    2. MAX wyjęty z podstawki i osadzony ponownie (bez efektu).
    3. Zwarcie 2 i 3 w kablu: ECHO JEST!
  • Poziom 42  
    a no widzisz - to się nazywa testowanie krok po kroku - więc już wiesz na czym stoisz - masz problem w okolicy MAX'a ;)

    to już coś.

    Teraz posprawdzaj sobie ścieżki czy nie ma jakichś zwarć albo pęknięć - też brzęczykiem

    jeśli nie ma - no to niestety - ale może MAX - odszedł do krainy wiecznych łowów :(

    Dodano po 11 [minuty]:

    ok - ja lecę spać ;) .... jak coś to pisz o dalszych postępach.
  • Poziom 13  
    Płytka fabryczna z soldermaską. Wszystko czyste i przewodzi. Rano kupię nowego MAX'a. Niepokoi mnie jeszcze jeden fakt. Kondensatory wokół MAX'a to elektrolity 10uF. W nocie katalogowej mojego konkretnego MAX'a (MAX232CPE) mają po 1uF. Może to jest przyczyną?

    Dodano po 2 [minuty]:

    Jak pomierzyć napięcia na MAX?

    Dodano po 5 [sekundy]:

    Jak pomierzyć napięcia na MAX?

    Dodano po 16 [minuty]:

    Dziękuję za porady i cierpliwość. Życzę dobrej nocy. Pozdrawiam.
  • Poziom 15  
    zakup garsc 10uF, garsc 1uf, garsc 0.1uF...bo pewnie w sklepie dostaniesz inna wersje max232

    zbysiusp napisał:
    W nocie katalogowej mojego konkretnego MAX'a (MAX232CPE) mają po 1uF.
    https://www.elektroda.pl/rtvforum/topic1171161.html
  • Poziom 13  
    Dziękuję NAMLOOC. Kupię nowego MAX'a i kondensatory odpowiednie do jego noty katalogowej. Pozdrawiam.
  • Poziom 27  
    Sprawdź w Maxie czy pracuje przetwornica pojemnościowa. Na nogach gdzie są elektrolity pomierz napięcia. Powinny być dwa piny na których zauważysz napięcie w granicach +9V oraz -9V. Sprawdź to.

    Jeśli nie masz impulsów na wyjściu Txd to już ręce opadają, z opisu widać że Max zawodzi bo jest brak echa, a tu widać jeszcze że coś z programem.
    Na Txd muszą być zauważalne impulsy .
    A może masz coś nie tak z zasilaniem?
  • Poziom 13  
    Witam ponownie. Jest postęp w sprawie. Kupiłem nowego MAX'a i uzyskałem natychmiastowy powrót echa w terminalu po zwarciu TXD i RXD (nóżka 2 "+9V", nóżka 6 "-9V"). Także po podłączeniu TXD i RXD do procesora generuje się zapis w terminalu, ale zupełnie przypadkowy (nijak nieodpowiadający założeniom programowym - litera A - same krzaczki jeden za drugim i tak w nieskończoność). Impulsów nigdzie jednak nie mogę wykryć (może źle to robię)