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

AVR (Atmega, ATTiny) - Różnica poziomów napięć

Atlantis86 30 Gru 2012 09:47 3609 16
  • #1 30 Gru 2012 09:47
    Atlantis86
    Poziom 19  

    Pracuję w tej chwili nad pewnym projektem, wykorzystującym moduł GSM (Motorola D15). Używam mikrosterwonika Atmega8 (później pewnie zamienię go na ATTiny 4313). Na czas prób zastosowałem zasilanie ze stabilizatora 78T05, więc nie mam żadnych problemów z poziomami napięć. Jednak docelowo całość chciałbym zasilać z akumulatorka 3,6V i tutaj zaczynają się schody.

    Moduł GSM może być zasilany napięciem z przedziału 3-6V. Jakie by ono nie było, poziomy napięć na liniach portu rs232 są takie same (poziom wysoki 5V). Problem w tym, że z karty katalogowej mikrosterownika wynika, że maksymalną dopuszczalną wartością VCC+0,5V, a to za mało...
    W drugą stronę powinno był łatwiej, datasheet modułu GSM podaje następującą informację:

    Cytat:
    The signal thresholds are:
    Vih 2.0V min.
    Vil 0.8V max.
    Voh 4.4V min. @ 50uA or 3.8V min. @ 8mA.
    Vol 0.1 max. @ 50uA or 0.44V @ 8mA.


    Czy może istnieje jakiś scalak, który umożliwiałby połączenie obydwu układów, nie wymagając przy tym napięcia 5V? Coś na wzór max232.
    Najlepiej, gdyby oferował obsługę wszystkich linii. W tej chwili co prawda korzystam jedynie z RX i TX, ale całkiem możliwe, że w końcowym rozwiązaniu będą używane także inne, np. DSR.
    Czy też moim jedynym wyjściem jest zbijanie zbyt dużego poziomu napięcia, np. za pomocą dzielników?

    0 16
  • Arrow Multisolution Day
  • #2 30 Gru 2012 10:00
    eleproject

    Poziom 17  

    Nie do końca jestem pewny czy mówimy o RS232 czy o UART.
    Jeśli o UART to dał bym dzielnik tak jak proponujesz by zmniejszyć napięcie i już.
    Reszta poziomów wydaje się być właściwa.

    0
  • #3 30 Gru 2012 11:14
    Atlantis86
    Poziom 19  

    Tak, miałem na myśli UART. Moja pomyłka...
    Czyli mam rozumieć, że wystarczy dobrać dzielnik pomiędzy liniami wyjściowymi modułu a wejściowymu uC tak, aby przy maksymalnie naładowanej baterii napięcie na pinach atmegi mieściło się w dopuszczalnym zakresie? Przy komunikacji w drugą stronę podnoszenie napięcia nie będzie konieczne?

    Zasilanie całości napięciem 5V trochę uprościłoby sprawę, komplikując jednocześnie kwestię zasilania z akumulatorka...

    0
  • Arrow Multisolution Day
  • #4 30 Gru 2012 18:21
    BlueDraco
    Specjalista - Mikrokontrolery

    To nie takie proste. Modemy są dość wrażliwe na napięcia wejściowe. Najprościej połączyć modem z mikrokontrolerem zasilanym z 3 V, ew. 3.3 V. Nawet wtedy przydadzą się rezystory szeregowe na wejściach modemu, o wartościach rzędu 2k..3k3. Jeżeli upierasz się przy zasilaniu 5 V - najlepiej użyj jakiegoś translatora poziomów, ale również z rezystorem szeregowym na wejściu modemu.

    0
  • #5 30 Gru 2012 18:34
    Atlantis86
    Poziom 19  

    BlueDraco napisał:
    To nie takie proste. Modemy są dość wrażliwe na napięcia wejściowe. Najprościej połączyć modem z mikrokontrolerem zasilanym z 3 V, ew. 3.3 V.


    Nie wiem czy dobrze się zrozumieliśmy. Modem o którym mowa przyjmuje na liniach o napięciu do 5V, niezależnie od napięcia zasilania (które może mieścić się w przedziale 3V-6V). To nie o modem się martwię, ale o uC, gdyż w przypadku Atmegi i ATTiny maksymalne napięcie dopuszczalne na linii wynosi VCC+0,5V. A więc w przypadku zasilania 3,6V wartość graniczna będzie wynosiła 4,1V - prawie wolt mniej od tego, co będzie podawał modem...


    Cytat:
    Nawet wtedy przydadzą się rezystory szeregowe na wejściach modemu, o wartościach rzędu 2k..3k3.


    Rozumiem, że te rezystory (nie dzielniki, same rezystory pomiędzy liniami uC i modemu) są wskazane tak czy inaczej, jako dodatkowe zabezpieczenie? W tej chwili (testowo) połączenia wykonane są po prostu przewodami. Czy powinienem jednak przewidzieć tam także rezystory?

    Cytat:
    Jeżeli upierasz się przy zasilaniu 5 V - najlepiej użyj jakiegoś translatora poziomów, ale również z rezystorem szeregowym na wejściu modemu.


    Translatora z czego do czego? ;)
    Atmega zasilana napięciem 5V daje na liniach stan wysoki wynoszący około 5V, jak w przypadku modemu.

    Oczywiście gdybym w manualu wyczytał, że moduł jest kompatybilny z urządzeniami operującymi napięciami na poziomie 3,3V to byłaby zupełnie inna bajka, nawet nie odważyłbym się go bezpośrednio podłączyć do uC zasilanego 5V...

    Cały fragment dokumentacji, odnoszący się do tej kwestii, brzmi następująco:

    Cytat:

    The D15 is a DCEdevice operating in 0 to 5V logic. An MC74VHCT244 buffer buffers all the
    In/Out signals.
    DTR, DSR, RTS, CTS, DCD lines are "1" (active) in 0V and "0" (inactive) in 5V.
    RXD, TXD lines are "1" in 0V and "0" in 5V.
    The signal thresholds are:
    Vih 2.0V min.
    Vil 0.8V max.
    Voh 4.4V min. @ 50uA or 3.8V min. @ 8mA.
    Vol 0.1 max. @ 50uA or 0.44V @ 8mA.


    W dokumentacji zamieszczony jest także schemat blokowy, z którego wynika, że sam modem zawiera własne bufory, a na wejściach także dzielniki.

    0
  • #6 30 Gru 2012 18:44
    BlueDraco
    Specjalista - Mikrokontrolery

    Ok, być może źle zrozumiałem. Chodzą mi po głowie "gołe" modemy, takie, jak G20, G24 czy G30 - z takimi mam doświadczenie i są one bardzo marudne pod względem elektrycznym. Mikrokontroler wytrzyma na wejściach wszystko - daj mu tylko rezystory szeregowe; przy przejściu z 5 V na 3.3 V - jakieś 10k. Sprawdź tylko zgodność poziomów w drugą stronę Voh_min musi być większe od Vih_min.

    0
  • #7 30 Gru 2012 19:40
    tmf
    Moderator Mikrokontrolery Projektowanie

    Ja bym jednak zaczął od sprawdzenia noty modemu. Bo może się okazać, że to napięcie nie jest z przedzału 3-6V tylko max 3,6V, albo, że te 6V to maximum absolute rating.
    Po drugie jakoś sobie nie wyobrażam, żeby modem zasilany 3,6V dawał na wyjściu 5V. To po prostu nie miałoby sensu, a realizacja wymagałaby zastosowania przetwornicy lub pompy. Jeszcze gdyby to było chodziaż te +/-12V to jakiś sens tego by był. No chyba, że to taki niby RS232, nie TTL, ale graniczny dla RS232. A wtedy po drugiej stronie zwykły max232 na 3,3V jest potrzebny. Te 5V to może znaczy 5V tolerant - miałoby to sens, bo zwykle modemy motoroli działają na 3-3,3V i mają wejścia 5V tolerant.

    0
  • #8 30 Gru 2012 20:34
    Atlantis86
    Poziom 19  

    tmf napisał:
    Ja bym jednak zaczął od sprawdzenia noty modemu. Bo może się okazać, że to napięcie nie jest z przedzału 3-6V tylko max 3,6V, albo, że te 6V to maximum absolute rating.


    Od tego właśnie zacząłem. W manualu wszystko jest dosyć jasno opisane, nawet w kilku miejscach. Na przykład:

    "The D15 is powered from a single power supply in the range of 3.0 to 6.0 Vdc."


    Cytat:
    Po drugie jakoś sobie nie wyobrażam, żeby modem zasilany 3,6V dawał na wyjściu 5V. To po prostu nie miałoby sensu, a realizacja wymagałaby zastosowania przetwornicy lub pompy.


    Prawdę mówiąc też się nad tym zastanawiałem. Jednak w nocie wyraźnie jest mowa o "0 to 5V logic" (fragment przytoczony powyżej). Nie próbowałem jeszcze odpalać go na napięciu niższym niż 5V (nie mam pod ręką odpowiedniego stabilizatora) ale czyżby autorzy dokumentacji byli aż tak mało konkretni? W notach AVR-ów poziom napięć jest wyraźnie określony w odniesieniu do VCC. Tutaj jest mowa jedynie o 5V.


    Cytat:
    Te 5V to może znaczy 5V tolerant - miałoby to sens, bo zwykle modemy motoroli działają na 3-3,3V i mają wejścia 5V tolerant.


    Nie wiem czy proste i dość jednoznaczne zdania z noty można interpretować w ten sposób... Wkleiłem je w jednym z poprzednich postów.

    0
  • #9 30 Gru 2012 20:48
    eleproject

    Poziom 17  

    Właśnie. Podszedłbym do tematu tak jak tmf radzi. A jak nie znajdziesz info w nocie, to zasil modem z 3,6 V (procek też daj na 3,6 V) i TYLKO DO TESTÓW podłącz szeregowe rezystory pomiędzy układami i zobacz oscyloskopem co wystawia modem. Jeśli wystawia stan wysoki na 3,6 V to wyrzuć rezystory szeregowe i przestań się martwić :)

    0
  • #10 30 Gru 2012 21:51
    BlueDraco
    Specjalista - Mikrokontrolery

    Sprawdź trzy razy dopuszczalne poziomy napięć na wejściach modemu. Typowo w modułach GSM wynoszą one 3.0 V (nie 3.3 ani 3.6) i należy to potraktować bardzo serio. Co więcej, dopóki modem się nie włączy (a chwilę to zajmuje), nie wolno na wejścia podać nawet 3 V, bo następuje latchup - po to właśnie są te rezystory szeregowe (a i to czasem nie wystarcza).

    0
  • #11 30 Gru 2012 23:27
    Atlantis86
    Poziom 19  

    eleproject napisał:
    Właśnie. Podszedłbym do tematu tak jak tmf radzi. A jak nie znajdziesz info w nocie, to zasil modem z 3,6 V (procek też daj na 3,6 V) i TYLKO DO TESTÓW podłącz szeregowe rezystory pomiędzy układami i zobacz oscyloskopem co wystawia modem. Jeśli wystawia stan wysoki na 3,6 V to wyrzuć rezystory szeregowe i przestań się martwić :)


    Nie wystarczyłoby zmierzyć woltomierzem napięcia na którejś z linii ustawianych na stałe (a przynajmniej na dłużej), jak DSR albo RI?


    BlueDraco napisał:
    Sprawdź trzy razy dopuszczalne poziomy napięć na wejściach modemu.


    Niby jak, niby gdzie? Kilka razy w tym wątku cytowałem fragmenty noty, w której była mowa o poziomach napięć...
    Co więcej - mierzyłem woltomierzem napięcia na liniach takich jak RI - było tam właśnie trochę poniżej 5V. Na pewno nie 3...


    Cytat:
    Co więcej, dopóki modem się nie włączy (a chwilę to zajmuje), nie wolno na wejścia podać nawet 3 V, bo następuje latchup - po to właśnie są te rezystory szeregowe (a i to czasem nie wystarcza).


    Na razie zanim zacznę coś wysyłać do modemu nakazuję programowi czekać jakieś 20-30 sekund. Ostatecznie jednak procedura będzie wyglądała następująco:

    1) Ustawiam linię TS (odpowiada za włączenie modemu) na stan wysoki.
    2) W pętli while czekam na pojawienie się stanu wysokiego na linii DSC_EN (oznacza włączenie modemu). W pętli działa licznik, który po przekroczeniu określonej wartości przerywa procedurę inicjującą, zwracając kod błędu (zabezpieczenie przed zawieszeniem programu, gdyby modem z jakiegoś powodu nie chciał się włączyć).
    3) Ustawiam linię TS na stan niski.
    4) W pętli while czekam na pojawienie się stanu niskiego na linii DSR. Tak samo jak w punkcie drugim w pętli działa licznik, który w pewnym momencie zwróci kod błędu.

    Dopiero po spełnieniu tych warunków do modemu zostaną wysłane pierwsze komendy AT.

    Chyba te założenia są w porządku?

    Tak BTW czy wśród zestawu standardowych komend AT znajduje się jakaś, która umożliwiłaby ustawienie modemu na stan niedostępności do połączeń przychodzących, ale bez wylogowywania go z sieci? Chodzi mi o odpowiednik sytuacji zdjęcia słuchawki z widełek w telefonie stacjonarnym. Połączenie przychodzące w momencie wybierania numeru może sporo namieszać, a dodanie instrukcji odrzucającej w programie nie sprawdza się - sprawdzenie czy komunikat to "RING" trochę trwa, zajmując procesor właśnie wtedy, gdy powinien zliczać impulsy z tarczy. W efekcie połączenie przychodzące zostaje co prawda odrzucone, ale dochodzi także do przekłamania wybranego numeru...

    0
  • #13 31 Gru 2012 14:54
    Atlantis86
    Poziom 19  

    tmf napisał:
    Daj linka do noty.


    Mam ją na dysku, więc może po prostu wrzucę jako załącznik.
    Wydaje mi się, że dobrze zrozumiałem treść tego dokumentu, jednak będę bardzo wdzięczny za wszystkie opinie bardziej doświadczonych, w razie gdyby jednak trzeba było wyprowadzić mnie z błędu. :)

    0
  • #14 31 Gru 2012 16:47
    tmf
    Moderator Mikrokontrolery Projektowanie

    Wydaje się, że istotnie ten moduł ma wyjścia 5V niezależnie od zasilania. Ciekawostka straszliwa. Chociaż można to też tak rozumieć, że wyjścia są zgodne ze standardem TTL 5V. Ja bym napisał do producenta o odpowiedź jak to łączyć z układami 3,3V. Ew. można śmiało połączyć przez szeregowy rezystor na każdej linii interfejsu.

    0
  • #15 31 Gru 2012 17:36
    Atlantis86
    Poziom 19  

    tmf napisał:
    Wydaje się, że istotnie ten moduł ma wyjścia 5V niezależnie od zasilania. Ciekawostka straszliwa.


    Właśnie kilka razy czytałem fragmenty dotyczące zasilania oraz portu szeregowego i w inny sposób nie potrafię ich zinterpretować. Brzmią dość jednoznacznie.
    Generalnie moduł ma po obydwu stronach PCB trochę różnych scalaków. Różni się pod tym względem dość znacznie od innych (nowszych), które są mi znane - tam płytka zawiera praktycznie tylko ekran, złącza i kilka elementów pasywnych. Może któryś z nich zajmuje się właśnie konwersją poziomów, niezależnie od VCC?


    Cytat:
    Ja bym napisał do producenta o odpowiedź jak to łączyć z układami 3,3V. Ew. można śmiało połączyć przez szeregowy rezystor na każdej linii interfejsu.


    Spróbuję, chociaż wydaje mi się, że moduł może mieć już kilka ładnych lat. Nie posiadają nawet jeszcze obsługi transmisji danych przez GPRS. Z tego co mi wiadomo. posiadany przeze mnie egzemplarz przez kilka lat pracował w jakimś urządzeniu, które potem zostało zdemontowane i zastąpione czymś nowocześniejszym. Jestem ciekaw czy w Motoroli ktoś jeszcze będzie udzielał informacji na jego temat. ;)

    A co do podłączenia przy zasilaniu 3,3V, to najpierw będę musiał wybrać się do sklepu po odpowiedni stabilizator.

    BTW może ktoś z Was poradzić mi w jaki sposób powinienem podłączyć słuchawkę i mikrofon do tego modułu? Mikrofon jest standardowy, elektretowy, z dwoma wyprowadzeniami. Słuchawka to klasyczna wkładka W66.
    Szczególnie zaś chodzi mi o to, czy konieczne będą jakieś tranzystorki w roli wzmacniaczy?

    O projekcie już kiedyś pisałem (kiedy jeszcze walczyłem ze stroną programową). Chodzi o zamontowanie modułu wewnątrz obudowy starego, polskiego telefonu RWT, wraz z uC pośredniczącym w komunikacji z zabytkowym sprzętem (tarcza numerowa, "widełki"). Na chwilę obecną program działa - to znaczy mogę wybierać i odbierać połączenia, wprowadzać PIN po włączeniu itp. Pozostało dopracowanie strony sprzętowej - podpięcie audio, elektromechanicznego dzwonka oraz przygotowanie układu zasilania/ładowania baterii.

    BTW mam jeszcze jedno pytanie. Mianowicie czy ktoś z was wie, czy może da się za pomocą jakiejś komendy AT ustawić moduł w taki sposób, aby przez jakiś czas (do momentu odwołania tego polecenia) z automatu ignorował wszystkie połączenia przychodzące (zwracając sygnał zajętości), ale bez wylogowywania się z sieci. Chodzi o to, żeby w tym czasie cały czas było możliwe wykonywanie połączeń wychodzących.
    Krótko mówiąc ma to służyć symulacji zachowania stacjonarnego telefonu po zdjęciu słuchawki z widełek. Początkowo planowałem dodanie odpowiedniej instrukcji w programie. Wybieranie numeru z tarczy odbywa się w pętli, a więc sądziłem, że wystarczy po prostu w każdej iteracji sprawdzić, czy w buforze są nowe znaki, a tak - odczytać czy składają się komunikat "RING". Wtedy program reagowałby wysłaniem komendy "ATH". Niestety rozwiązanie się nie sprawdziło. Odczytanie komendy zajmuje procesor na czas długi na tyle, że jeśli wtedy zakręci się tarczą, pewne impulsy mogą zostać przeoczone i numer ulegnie przekłamaniu.

    W dokumentacji modemu znalazłem instrukcję "AT+CHLD=0", która miała odpowiadać za ignorowanie połączeń przychodzących. Niestety - dotyczy ona jedynie obsługi kilku rozmów przychodzących jednocześnie. Zastosowanie jej wtedy, gdy nie ma żadnego aktywnego połączenia zwraca "ERROR" i nie powoduje oczekiwanej zmiany - połączenia nadal przychodzą.

    Może jest jakiś inny sposób?

    0
  • #16 05 Sty 2013 13:05
    Atlantis86
    Poziom 19  

    Hmm... Jeszcze jedną dziwną rzecz zauważyłem w tym module.
    Mianowicie chciałem dać trochę automatyki podczas włączania. Atmega najpierw sprawdza stan linii DSC_EN (stan wysoki wskazuje na włączenie modułu). Jeśli jest zero, ustawia linię TS ("włącznik") na stan wysoki i trzyma go do momentu pojawienie się stanu wysokiego na DSC_EN. W międzyczasie działa także licznik, który po piętnastu sekundach przerwie operację i zwróci kod błędu, oznaczający problem z włączeniem modułu. Stan wysoki na linii DSC_EN wynosi trochę poniżej 5V (pomiar multimetrem).

    Dalej program ma czekać, aż pojawi się stan niski na linii DSR, co oznacza gotowość do przyjmowania komend przez USART. Niestety - tu pojawił się problem. Program jakby ignorował tę część i przystępował do wysyłania poleceń, zaraz potem zwracał błąd, nie otrzymawszy oczekiwanej odpowiedzi. Sprawdziłem multimetrem napięcie na linii DSR i okazało się, że wynosi ono trochę poniżej 3V (czasem trochę więcej). Identycznie wygląda sytuacja na CTS.

    Jak mogę interpretować taki stan rzeczy?

    Generalnie teraz po prostu kazałem programowi przeczekać około 10s po włączeniu modułu, co daje mu czas na zainicjowanie komunikacji przez USART.

    0
  • #17 09 Sty 2013 18:40
    Atlantis86
    Poziom 19  

    Rzuciłem okiem na manual tego modułu i jeszcze jedna rzecz przyszła mi do głowy. Mam na myśli stronę 34. Znajduje się tam informacja, że wychodzące i przychodzące sygnały są buforowane przez MC74VHCT244.
    Na załączonym schemacie widać, że linie wejściowe mają za wyjściem bufora dzielnik napięcia. Bufory wyjściowe są po prostu podłączone.

    AVR (Atmega, ATTiny) - Różnica poziomów napięć

    Czy tam na wyjściach nie powinien wystąpić jakiś rezystor pull-up albo pull-down?

    Tak BTW jak zachowuje się wejście AVR-a, jeśli w programie nie ustawimy żadnej wartości za pomocą rejestru PORTx? Przyjmuje jakąś domyślną wartość i zostaje pociągnięte do potencjału masy/zasilania, czy też jego stan jest nieustalony?

    0