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

Atmega16 + USART + MAX232

26 Kwi 2010 22:57 3139 18
  • Poziom 9  
    Witam mam pytanie.

    Pracuję na Atmedze 16 chciałem połaczyc ją z komuterem za pomoca portu COM układ wykonany według schematu poruszanego na forum, identyczny w ksiazce Programowanie mikrokontrolerów w Bascomie.
    Sam układ zrobiony jest dobrze sprawdzony kilkaktornie.

    Ale jednak brak komuniakcji raz są jakies literki Ć i tylko takie a raz nie ma nic. ustawiony jeste wewnetrzny oscylator na 8000000 oraz baud na 9600 w komputerze tak samo. jednak komunikacja jest niemozliwa.

    Czy moze miec na to wplyw wewnetrzny oscylator? Lub czy jest mozliwe ze nie dziala bo uklad max jest uszkoszony?

    Z góry przepraszam to pierwszy post. Przejzalem forum ale nie znalazłem zadowolajacej odpowiedzi.
  • Multimetr FlukeMultimetr Fluke
  • Poziom 15  
    Jak używasz wewnętrznego oscylatora to ustaw baudy na max 600,300. Wewnętrzny oscylator nie stabilny i komunikacja na nim musi być bardzo wolna aby nie było żadnych błędów.

    W terminalu by Bray możesz bez problemu ustawić taka prędkość.

    Najlepiej porostu dodaj zewnętrzny kwarc 8Mhz (38400, 9600 na pewno wtedy zadziała).
  • Multimetr FlukeMultimetr Fluke
  • Poziom 38  
    a najlepiej 11,0592Mhz. Zero błędów przy dowolnej prędkości RSa
  • Poziom 42  
    sorex86 napisał:
    Jak używasz wewnętrznego oscylatora to ustaw baudy na max 600,300. Wewnętrzny oscylator nie stabilny i komunikacja na nim musi być bardzo wolna aby nie było żadnych błędów.

    W terminalu by Bray możesz bez problemu ustawić taka prędkość.

    Najlepiej porostu dodaj zewnętrzny kwarc 8Mhz (38400, 9600 na pewno wtedy zadziała).


    Panie kolego scorex86 bajki opowiadacie, że aż strach ;) Żeby aż tak był niedokładny wewnętrzny oscylator to musiałby być chyba "z desek zbity"

    Na wewnętrznym oscylatorze najspokojniej w świecie można działać na prędkościach 9600 , 19200 czy 38400.

    Zdarzają się wprawdzie procki, (mi też się to najczęściej na ATmegach16 działo), że po wyjściu z fabryki może słabiej skalibrowany dla 8MHz. Ale to żaden, nawet najmniejszy problem.

    Masz panie autor do dyspozycji od strony programisty taki rejestr w procku co się zwie OSCCAL. Zmieniając jego wartość dokonujesz płynnej kalibracji wewn. oscylatora.

    Wystarczy napisać prostą pętelkę programową która np co pół sekundy zwiększa wcześjniej raz odczytaną wartość tego rejestru, o JEDEN zapisując ją cyklicznie do tego rejestru i także co pół sekundy wypuszczać z procka na terminal jakiś napis oraz wartość tego rejestru.

    W efekcie końcowym na terminalu w pewnym momencie przestaną lecieć ci krzaki tylko zobaczysz swój tekst a obok niego te liczby. Będzie ich kilka linijek np:

    test - 126
    test - 127
    test - 128
    test - 129
    test - 130

    a wcześniej i później będą krzaki. Wtedy wybierasz tę liczbę ze środka np 128 z tego przykładowego tylko wyniku i przy starcie procka wpisujesz ją zawsze do OSCCAL na stałe.

    Wtedy okaże się, że ATmega16 śmiga po RS'ie aż miło i bez żadnych błędów.

    Zatem odpuść sobie bajki o niestablilnych wewnętrznych oscylatorach. Ludzie po prostu nie mają pojęcia o kalibracji i bajki piszą.

    Oczywiście w innych prockach fabrycznie bywa od razu dobrze skalibrowany wewn. oscylator i nie trzeba używać OSCCAL. Ale to także nie oznacza, że jest to jakieś niedokładne i złe taktowanie.

    Ja osobiście popełniłem już dziesiątki hmmm setki układów i w większości gdy tylko można to zawsze korzystam z dobrodziejstwa jakim jest wewn. oscylator 8MHz. Rzadko kiedy i w specyficznych sytuacjach stosuję rezonatory ale to przeważnie już duże od 11,0592MHz do 20MHz.

    Z tym że podstawą wyboru w ogóle zewn kwarcu nie są żadne bzdurne przesłanki o niedokładności wewn oscylatora

    Dodano po 2 [minuty]:

    oooo masz tu w Bascomie prostą gotową procedurkę do sprawdzenia jaka powinna być wartość OSCCAL żeby skalibrować równiutko 8MHz ;)


    Code:
    Do
    
      Osccal = Osccal + 1
      Print "test - " ; Osccal
      Waitms 500
    Loop
  • Poziom 9  
    Probowałem zmian predkośći niestety nie pomogło.
    Dodam zewnętrzny kwarc i 8Mhz i zobaczę. Unikałem kwarcu ze względu na strach przed fuse bitami.

    Poprawka:

    Dziekuję za odpowiedz zaraz spróbóje z ta kalibracja.
  • Moderator Mikrokontrolery Projektowanie
  • Poziom 9  
    Prosze Kolegi mirekk36,
    Zrobilem Tak jak miałem. Kod programu
    Code:

    $regfile = "m16def.dat"
    $crystal = 8000000
    $baud = 9600

    Do
    Osccal = Osccal +1
    Print "test - " ; Osccal
    Waitms 200
    Loop



    Schemat połączenia https://obrazki.elektroda.pl/48_1214985943.jpg

    Po 3 minutach działania zatrzymał sie i nic więcej sie nie dzieje.. same krzaki.
    Sprawdziłem układ 3 krotnie miernikiem kazde połączenie. Nie mam juz pomysłów.
    Moze zewrze nózki 14,15 procesora TXD RXD i sprawdze czy następuje echo?

    Update:
    Po zwarciu przewodów w kablu wychodzacych do txd z rxd i wlaczonej masie nie ma echa.

    ogolnie: gnd idzie do 5 pina w wtyczce bezposrednio do komputera,, z nozki 14 ukladu max232 wychodze na 2 pin d-suba, a z 13 na 3 pin. wiec wyglada dobrze. (oraz mosrki miedzy 7-8 i 6-4)

    Sprawdziłem tez napiecia na nozkach i zastanawia mnie poniwaz na miedzy 12 a 15 nozka w ukladzie max mam ciagle napiecie 5v miedzy 11 natomias amplipuda jest miedzy 3 a 5v.

    Ustawienia portu szeregowego w procesorze jak i komputerze sa jednakowe.\

    Sprawdziłem juz poraz 10 wszszkie polączenia. Moze problem lezy w kablu moze uzywam zlych pinów.

    Prosze o pomoc
  • Poziom 42  
    Tak właśnie chciałem powiedzieć, że jak nie odpalisz tego na zwykłym oscylatorze wewnętrznym to i żaden kwarc ci nie pomoże i miałem rację.

    Idziesz w dobrym kierunku, najpierw doprowadź do tego żeby ci echo działało.

    Ale nie wiem co ty kombinujesz ze zwieraniem pinów procesora - to lekka masakra - co ty wymyślasz ??? ;)

    Odłącz procesor , wyjmij go z płytki czy jak - i wtedy zewrzyj te dwa piny T1In (noga 11) oraz R1OUT (noga 12) na scalaku MAX232 - i obserwuj echo

    jeśli nie zadziała to zewrzyj piny Rx i Tx (noga 14 i noga 13 tylko wyjmij z płytki MAX232) na samym kablu RS232 nawet bez udziału MAX232 - wtedy będziesz wiedział czy masz w ogóle dobry kabel

    No trzeba troszkę po kolei i racjonalnie działać

    Jeśli nadal nie będziesz miał echa to zewrzyj piny Rx oraz Tx w samym gniazdku DB9 w kompie - wtedy MUSI być ECHO - od czegoś trzeba zacząć. A jak i tu nie będziesz miał echa to masz coś z portem nie tak

    Jeśli po kolei zacznie ci ruszać echo to będzie dobrze

    Poza tym to mam nadzieję, że dolutowałeś kondensatory 1uF w odpowiedni sposób do MAX232 ??????????? czy dałeś może go "gołego" jak na tym schemacie??? to by była kolejna masakra ;)

    I nie mierz napięcia ani żadnych wymyślonych amplitud na wyjściach cyfrowych bo to już w ogóle do niczego niepodobne. Stany na pinach 14, 13, 11, czy 12 to możesz sobie oscylem podglądać jak masz a jak nie to odłóż woltomierz na bok i nie kombinuj w ten sposób ;)

    Jak widać na końcu - masz poważny problem z tak prostym układem jak MAX232 - pokaż więc w ogóle fotkę jak ty to fizycznie połączyłeś może tak uda się coś pomóc

    Dodano po 4 [minuty]:

    Nie wspomnę już o tym, że nie wiadomo czy wogóle podłączyłeś wszystkie zasilania do procka, bo często tak pomysłowi ludzie podłączają tylko VCC i GND natomiast AVCC i AGND pozostawiają wiszące w powietrzu
  • Poziom 9  
    Zaraz sprawdzę z tym portem. Jesli chodzi o kondensatory dolutowałem elektrolity 10uF i dolutowane sa napewno dobrze. sprawdzalem kilkakrotnie.

    Dodano po 14 [minuty]:

    Zwarłem nózki pierw po wyjęciu Atmegi nie bylo echa, takze po wyjeciu ukladu Max tez nie bylo echa. Przy zwiarciu pinów 2-3 oraz mostkach na pozostałych 7-8 6-4 nadal nie mam echa.
    Wziąłem kabel NullModem i Podlaczylem w 2 porty com do tego otwarłem 2 sesje w TeraTermPro i co wpisalem na jednym było widoczne na drugim i odwrotnie.

    Plytke wysle za jakas chwilke. ale skoro nie ma echa przy zwarciu pinow 2-3 które miałby byc zwarte jak rozumiem nie wystepuje echo musi byc cos nie tak.


    Kurcze przy uzyciu innego programu terminala jest inaczej. same zwarcie pinow działa. Potrzebuje chwilki

    Dodano po 16 [minuty]:

    Odłączyłem procesor zwarłem piny T1IN i R1OUT i mam echo.(uzyłem programu Braya) Przy uzytym programie dotyczacym Rejestru Osccal nadal nic program chodzi i wysyla mi na com rozne krzaki a teraz same zera.

    Co moge zrobic teraz?

    Dodano po 1 [godziny] 8 [minuty]:

    Mógłby ktoś mi pomoc bardzo prosze. Siedze nad tym juz od wczoraj rana nie umiąc ruszyć z miejsca.
  • Poziom 42  
    szymonrsl napisał:
    Odłączyłem procesor zwarłem piny T1IN i R1OUT i mam echo.(uzyłem programu Braya) Przy uzytym programie dotyczacym Rejestru Osccal nadal nic program chodzi i wysyla mi na com rozne krzaki a teraz same zera.

    Co moge zrobic teraz?


    Jak masz echo za MAX232 to już jesteś coraz bliżej ;)

    Teraz oznacza to, że możesz mieć problem w procku tzn w programie i już się zaczynam domyślać kolejnej rzeczy po tym jak napisałeś że boisz się przestawiać fusebitów. Oznacza to, że twój procek jest ustawiony domyślnie na wewnętrzny oscylator ale 1MHz a nie 8MHz o których tu piszemy.

    W związku z tym zajrzyj se pan do noty PDF procka, rozdział UASRT a w nim ostatni podrozdział "Examples of Baud Rate Setting" i spójrz na pierwszą tabelę błędów dla różnych prędkości przy taktowaniu 1MHz. Obejrzyj też sobie inne tabelki to wyciągniesz wnioski że są pewne tzw przyjazne częstotliwości kwarców dla RS232 gdzie na każdej prędkości jest 0% błędu.

    Jednak spokojnie wszystko bardzo dobrze działa jeśli % błędu jest pomiędzy 0 a 2% lub -2%

    A tak na prawdę to działa także i przy większych procentach błędu ale to już inny temat

    OK ..... z tej pierwszej tabeli widzisz, że powinieneś działać tylko na prędkości 2400 albo 4800 max

    Jeśli więc działasz może na 9600 albo wyższej to i tak pomimo ustawiania OSCCAL będziesz miał cały czas krzaczory

    Tymczasem dla prędkości z tabeli 2400 lub 4800 może się okazać że nawet nie będziesz musiał korygować wartości rejestru OSCCAL

    pobróbuj , sprawdź i uruchom ;)
  • Poziom 9  
    Juz sprawdzam. tu jak mowilem przesyłam zdjecia plytki

    Atmega16 + USART + MAX232

    Atmega16 + USART + MAX232
  • Poziom 15  
    mirekk36 napisał:


    OK ..... z tej pierwszej tabeli widzisz, że powinieneś działać tylko na prędkości 2400 albo 4800 max



    O tym przecież pisałem ... najłatwiej zmniejszyć prędkość aby sprawdzić czy działa układ. Natomiast co do kalibrowania to zaraz sam spróbuje jak to dokładnie wygląda,. to zawsze 1zł do przodu (15% ceny procka).


    Jednego nie rozumiem

    Code:
    Do
    
      Osccal = Osccal + 1
      Print "test - " ; Osccal
      Waitms 500
    Loop


    Ten waitms jest potrzebny? Przecież to strasznie zwalnia odbiór danych jeżeli chce się przesyłać duża liczbę pomiarów.


    Zamiast się bawić 2 dni nad tym dołożył by zewnętrzny kwarc i po sprawie. Nie każdy dysponuje taka wiedzą i czasem jak mirekk36.
  • Poziom 25  
    szymonrsl napisał:
    Kurcze przy uzyciu innego programu terminala jest inaczej. same zwarcie pinow działa.


    To sprawdź w tym "innym programie", czy nie ma włączonej funkcji auto-echo ;) To może być echo programu, a nie z kabla.
  • Pomocny post
    Poziom 42  
    sorex86 --> nie przesadzajmy, to nie jest jakaś tajemna i wielka znowu wiedza, to raczej podstawy i dlatego o tym piszę, żeby ktoś skorzystał.

    A jak już jest ta wiedza, to i czasu nie trzeba tyle poświęcać na odpalanie tak prostej rzeczy jak transmisja RS232 i to bez żadnego kwarca zewnętrznego.

    Bo jak sam widzisz, tutaj problemem nie jest kwarc.
  • Poziom 9  
    No i chyba sie udalo zmienilem $cryystal na 1 Mhz. i potem wyszły mi wartosci rejestu Osccal od 164-183 przy predkosci 2400. Czyli to co potrzebowałem
    Teraz jak dobrze rozumiem przypisuje
    Code:

    Osccal = 173


    Dobrze rozumiem?

    UPDATE:
    Bardzo dziekuje za pomoc teraz juz zrozumiałem w czym lezał problem. Wszyszko działa dla predkosci 2400 oraz 4800 przy Osccal = 173 dla 1Mhz. Teraz bede probował uzywac fusebitów.
  • Poziom 42  
    Tak dobrze zrozumiałeś - tak się właśnie dobiera wartość OSCCAL tą metodą ;)

    Powodzenia z fusebitami.

    Gdybyś miał mikrokotroler ATmega8 to mógłbyś użyć super bezpiecznego programu, dzięki któremu na pewno byś przez przypadek nie zablokował procka. mkAvrCalculator ;) .... posiada on zakładkę "Fusy uproszczone" w której w super prosty sposób ustawia się taktowanie bez żadnych obaw a późnie w zakładce "Programator" ładnie "wrzuca" się je do procka.
  • Poziom 9  
    Tylko ze ATmega8 obecnie jest prawie nieosiąglna.
  • Poziom 42  
    No na chwilę obecną to w ogóle jest globalny problem z prockami ATMEL'a niestety :(

    Sam potrzebowałem kupić 30szt ATmega88 oraz 70szt ATmega8 w obudowach TQFP i wielki KLOPS !!!!! nie ma w żadnych hurtowniach i sklepach internetowych.

    Jak usłyszałem - to ATMEL miał poważny zaciach z powodu kryzysu, teraz kryzys się u nich skończył ale ATMEL nie wyrabia się totalnie z produkcją i ponoć taka sytuacja może się utrzymać jeszcze parę miesięcy - masakra ;)
  • Poziom 14  
    Witam !
    Po raz kolejny czytam te posty i dochodzę do wniosku , że mój problem mógłby być rozwiązany w tym dziale ....Posiadam urządzenie z lat 80-90 które bardzo dobrze pracuje ,sterowane jest z komputera poprzez port com1 (ale bardzo leciwego typu pc286,zegar 20MHz,dysk 49).Próbowałem podłączyć nowszy komputer 386,486 , ale z tymi komputerami moje urządzenie nie chce "rozmawiać" ,przesyłane pliki po odebraniu przez urządzenie mają bardzo dużo przekłamań , co praktycznie uniemożliwia pracę na tym urządzeniu.Różnego rodzaju próby konfiguracji tychże komputerów nie dają żadnych efektów.W tym przypadku ważna jest częstotliwość zegara z jaką są wysyłane dane. W urządzeniu pracują TTl-y program zawarty jest w Epromie ,jednostką jest procek 8080. Ponieważ w chwili obecnej trudno o tak "stare" komputery prosiłbym kolegów o pomoc , w jaki sposób rozwiązać prędkość wysyłanych danych przez Com-a , ażeby można było wykorzystać choć troszkę nowsze komputery , które jeszcze można zdobyć. Żadne próby zmiany bitrrate nie dawały rezultatu-transmisja jest z przekłamaniami.Powrót do "286" sytuację uzdrawia(ale on pomału gaśnie i może paść w każdej chwili.
    Pozdrawiam i czekam na podpowiedzi .