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.

Karta MMC, Atmega16L, wyświetlacz - problem z napięciami

28 Lip 2007 13:02 2172 12
  • Poziom 9  
    Witam
    Karta wymaga zasilania 3.3V - procesor ruszy bez problemu na 3.3V zgodnie z notą katalogową. Ale jak dogadać cpu z wyświetlaczem wymagającym zasilania 5V (http://www.artronic.pl/o_produkcie.php?id=583)? Nie będzie problemu, czy trzeba jakiś "translator" 3.3V <-> 5V?

    Jak z 3.3V odpalić MOSFET'a? Pozostaje tylko driver?
  • Poziom 34  
    Można też inaczej... ja u siebie zastosowałem na każdej ścieżce dzielnik rezystorowy 4k7/10k - uC (u mnie atmega128) jest zasilany z 5V - na wyjściu dzielnika mam 3,4V - praktycznie w sam raz na wejście cmos karty. w drugą stronę mam dokładnie to samo (pierwotnie chciałem się komunikować z kartą SD po szynie 4-bit, ale okazało się, że nie można wyłączyć mechanizmu liczenia sum kontrolnych, a więc przeszedłem w tryb MMC - zresztą dzielnik na wejściu uC jest abezpieczeniem, gdyby pin stał się wyjściem) - pin karty obciążony opornikiem 10k do masy, 4k7 do pinu - na wejściu uC mam 3V3 - według dokumentacji atmegi128 najmniejsze napięcie gwarantujące odczyt pinu jako stan wysoki, to 0.6Vcc = 3V więc spokojnie trzymam się w zakresie. karta zasilana z osobnego stabilizatora 3v3. Jedynie trzeba jeszcze uwzględnić pojemność wejść karty i pojemność wejść uC - ograniczenie u siebie wyliczyłem jakoś na 30MHz, ale i tak programowo wyciągam tylko koło 2MHz...
    W dokumentacji atmegi16 jest ten sam próg napięcia gwarantującego odczyt jako stan wysoki - więc można by zastosować ten pomysł. Można też zmienić wartości oporników na 2k2/4k7.
  • Poziom 21  
    Witam. Miałem kiedyś podobny problem z mega8 i lcd. Było to rok temu i nie pamiętam rozwiązania, ale zdaje się że lcd zasiliłem z 5V a linie sterujące podciągnąłem również do 5V przez rezystory.

    Raz miałem również styczność z lcd typu OLED lub PLED. Pamiętam ze ruszał bez problemu na 3.3V.

    Można również zastosować konwerter poziomów, np. 74HC245. Lub wykonać to na diodach zenera (było o tym na forum).

    Co do mosfetów to przeważnie stosuje się jakieś drivery (scalone lub na tranzystorach). Chociażby ze względów ochrony uC. Też szukałem kiedyś takiego, co by poszedł z 3.3V. Było ciężko, a że projekt nie był priorytetowy - odpuściłem sobie.

    pozdr, JnS
  • Poziom 9  
    BoskiDialer napisał:
    Można też inaczej... ja u siebie zastosowałem na każdej ścieżce dzielnik rezystorowy 4k7/10k - uC (u mnie atmega128) [...].


    Czyli tak jak w załączniku i dla każdego "pinu" karty MMC osobny dzielnik robimy, tak?

    No to jeśli dobrze załapałem do biorę się do roboty :)
  • Poziom 9  
    Jj_Johnys napisał:
    Witam. Miałem kiedyś podobny problem z mega8 i lcd. Było to rok temu i nie pamiętam rozwiązania, ale zdaje się że lcd zasiliłem z 5V a linie sterujące podciągnąłem również do 5V przez rezystory.
    [...]

    Co do mosfetów to przeważnie stosuje się jakieś drivery (scalone lub na tranzystorach). Chociażby ze względów ochrony uC. Też szukałem kiedyś takiego, co by poszedł z 3.3V. Było ciężko, a że projekt nie był priorytetowy - odpuściłem sobie.

    pozdr, JnS


    Poszukam odnośnie zenerek.
    Ten MOSFET nie będzie pracował z zawrotnymi f, ma tylko załączać wyświetlacz. Drugi ma być sterowany PWM do "wygaszania" podświetlenia po pewnym czasie i to tyle;)
  • Poziom 34  
    Tak właśnie to u mnie wygląda...
  • Poziom 32  
    BoskiDialer napisał:
    pierwotnie chciałem się komunikować z kartą SD po szynie 4-bit, ale okazało się, że nie można wyłączyć mechanizmu liczenia sum kontrolnych, a więc przeszedłem w tryb MMC


    Możesz trochę przybliżyć ten temat ?
  • Poziom 34  
    Przybliżać nie ma co... przestudiowałem całą dokumentację na temat kart sd i zacząłem robić płytkę - 4 piny z szny danych na 4 dolne bity portu, wyżej pin z szyny poleceń/odpowiedzi, sygnał segara i 2 sygnały z gniazda - karta włożona i karta zabezpieczona przed zapisem... 6 sygnałów połączone na dzielniku rezystorowym(4 przewody z danych jak i przewód poleceń/odpowiedzi są dwukierunkowe) z tego powodu, że chciałem uzyskać maksymalną prędkość transmisji - karty SD mogą pracować w trybie 4-bit przy zegarze 25MHz, co teoretycznie daje prędkość wymiany danych na poziomie 12,5MB/s... problem się zaczął, kiedy doszedłem do wniosku, że nie da się wyłączyć mechanizmu sprawdzania sum kontrolnych, a ten jest naprawdę bardzo zmyślny - suma kontrolna jest liczona z generatora x16+x12+x5+1, ale żeby było zabawniej, to nie ze strumienia danych, tylko z poszczególnych bitów każdej linii z osobna - czyli trzeba na raz liczyć 4 sumy kontrolne - na jakimś układzie programowalnym to zrobić pewnie by nie problem, tyle że u siebie miałem tylko możliwość rozwiązania programowego, a poza tym nie znam vhdl'a. Z prostych obliczeń wynikło mi, że liczenie tak skomplikowanej sumy kontrolnej będzie bardziej spowalniać niż pobieranie danych za pomocą jednego pinu - dlatego przeszedłem na komunikację w trybie spi.
    Przy pierwszym podejściu napisałem też funkcje do liczenia sum kontrolnych (crc16+crc7) i zoptymalizowałem je do tego stopnia, że nie wymagają tablic LUT ani nie wykorzystują pętli (w obrębie przetwarzania jednego bajtu), a jednocześnie są bardzo szybkie - jak ktoś chce, to tu je zamieszczam (pierwotnie napisane były w delphi - do testów. w takiej formie je zamieszczam):


    Code:
    function crc7(const AData;ALen: integer): Byte;
    
    var vData: array[0..0] of byte absolute AData;
        vByte: Integer;
        ct: Byte;
    begin
      result := 0;
      for vByte := 0 to ALen-1 do
      begin
        ct := result xor vData[vByte];
        result := (ct         shl 4) xor
                  (ct         shl 1) xor
                  (ct and $F0      ) xor
                  (ct and $70 shr 3) xor
                  (ct and $80 shr 6);
      end;
      // crc w górnych 7 bitach, dolny bit skasowany - ta forma może być dogodna, gdyż w protokole sd/mmc suma crc7 jest przesyłana jako 7 bitów crc i jeden bit końca polecenia (i odpowiedzi - tylko w sd)
      result := result shr 1;
    end;


    Code:
    function crc16(const AData;ALen: integer): word;
    
    var vData: array[0..0] of byte absolute AData;
        vByte: Integer;
        vCrcM: Word;
    begin
      result := 0;
      for vByte := 0 to ALen-1 do
      begin
        vCrcM := (result shr 8) xor vData[vByte];
        vCrcM := vCrcM xor (vCrcM shr 4);
        result := vCrcM xor (vCrcM shl 5) xor (vCrcM shl 12) xor (result shl 8);
      end;
    end;


    ps. mam też kilka innych funkcji do crc zoptymalizowanych do granic - np odwrócone crc przy generatorze 0x8408 - na procku avr przetworzenie stanu zajmuje 15 cykli i wykorzystuje 4 rejestry - jak by ktoś chciał, to mogę zamieścić wraz z obszernym opisem jak przebiegała optymalizacja
  • Poziom 17  
    co do komunikacji AVR + MMC to jest dobry kurs w archiwum EP o nazwie "Obsługa kart pamięci Flash za pomocą mikrokontrolerów" częsci 4 do 7 są o MMC i AVR, w ostatniej części jest kod w C obsługi w trybie SPI
  • Poziom 32  
    BoskiDialer napisał:
    Przybliżać nie ma co... przestudiowałem całą dokumentację na temat kart sd i


    Przepraszam, nie doczytałem że pisałeś o transmisji 4bit.
  • Poziom 27  
    Witam
    Temat MMC juz chyba koledzy rozjaśnili
    Co do MOSFETÓW to poczytaj sobie (pooglądaj wykresy) np.IRF7455
    Dopasowanie poziomów logicznych to prosty temat, jeśli chcesz oszczędzić energie to użyj np. VHC244
    Wyświetlacz z drugiej strony:
    liczyłeś predkości komunikacji z kartą... na pewno nie osiągniesz wiecej niz 6Mbodów przy zasilaniu procka 3,3V. Chcesz mieć max? musisz go zasilić 5V. Wtedy masz SPI 12MHz/8bit Jednocześnie odpada problem z wyświetlaczem.
    Pozdrawiam
  • Poziom 10  
    Witam,
    Czy ktoś posiada dokumentacie kart sd/mmc? Planuje uzyć jej w projekcie, a słabo mi idzie znajdowanie opisu .
    potrzebuje dokładnie opisu komend, interfejsu, czyli noty katalogowej.
    z góry dziękuję i pozdrawiam
  • Poziom 17  
    polecam na stronie elektroniki praktycznej jest kurs obsługi MMC przez AVR (w C), wszystko tam jest ładnie opisane