wtorek, 29 marca 2011

Podłączenie karty pamięci SD

Autor: drzasiek
Redakcja: dondu

Drzaśkowy pamiętnik: Spis treści


Budując system z mikrokontrolerem, często zachodzi potrzeba magazynowania większej ilości informacji, które mogą być odczytywane i/lub zapisywane w czasie działania programu, i nie są gubione w czasie gdy odłączymy zasilanie,

Niekiedy wystarcza do tego wbudowana pamięć EEPROM, ale nie zawsze. Małe mikrokontrolery posiadają zwykle od kilkuset bajtów do kilku/kilkunastu KB pamięci EEPROM lub jej nie posiadają wcale.

Dlatego szukamy taniego i łatwo dostępnego nośnika o dużej pojemności.

Świetnym rozwiązaniem okazują się wszechobecne karty pamięci SD, które oferują bardzo duże pojemności, małe wymiary, niską cenę oraz łatwą obsługę przez interfejs SPI.

Garść wiedzy o kartach SD, dokumentację standardu oraz jak kartę podłączyć do płytki stykowej znajdziesz w artykule: Karta SD


Karta SD z systemem FAT

Obsługa systemu plików na karcie pamięci nie jest wcale taka prosta. Nie należy się jednak tym zrażać. No bo po co wyważać otwarte drzwi?

W sieci można znaleźć kilka wersji darmowych bibliotek do obsługi kart pamięci z systemem FAT/FAT32.
Jedną z najlepszych, prostych w obsłudze oraz co najważniejsze ciągle rozwijanych jest biblioteka FatFS oraz jej okrojony odpowiednik przeznaczony na mikrokontrolery, czyli Petit FatFs.

W artykule tym przedstawię proste sposoby podłączenia karty pamięci do mikrokontrolera Atmega8 oraz sposób implementacji Petit FatFs.



Magistrale (interfejsy)


Karty SD posiadają dwie magistrale:
  • SDBus - szybsza, 4 bitowa magistrala,
  • SPI - wolniejsza, ale za to bardzo popularna.
W niniejszym artykule pokazuję sposób wykorzystania karty poprzez interfejs SPI.



Zasilanie

Zasilanie karty SD może mieścić się w pewnych przedziałach:
  • 2V - 3,6V dla komend inicjalizacji, 
  • 2,7V - 3,6V podczas przesyłania danych oraz pozostałych komend.
Dla niniejszego artykułu wykorzystuję najczęściej stosowany poziom napięcia jakim jest 3,3V. To poziom napięcia, który zapewnia bezpieczne użytkowanie karty, a znaczna część mikorkontrolerów może z nim także pracować.




Pinologia

Karta SD posiada wyprowadzeń:
  • 9  - w wersji SD
  • 11 - w wersji mini SD,
  • 8  - w wersji micro SD.


Pinologia (wyprowadzenia) karty SD.

Pinologia (wyprowadzenia) karty mini SD.   Pinologia (wyprowadzenia) karty mikro SD.


Nas interesują oznaczenia w drugiej kolumnie na powyższych rysunkach, czyli dla interfejsu SPI:


VDDZasilanie karty pamięci (+)
VSS1 i VSS2GND (masa)
DIData Input (szeregowe wejście danych)
DOData Output (szeregowe wyjście danych)
SCLKsygnał taktujący transmisję (sygnal zegarowy)
CSChip Select (w stanie niskim uruchamia bufory I/O karty)





Podłączamy kartę SD do mikrokontrolera

Czas więc podłączyć kartę pamięci do mikrokontrolera.

Trzeba jednak pamiętać o poziomach napięć sygnałów i ich ewentualnego dopasowania (konwersji).

Najprostszym rozwiązaniem jest zasilanie zarówno mikrokontrolera jak i karty pamięci takim samym napięciem, np. 3,3V.

Jednak nie zawsze mikrokontroler może być zasilany takim napięciem, a to ze względu na:
  • własne ograniczenia (brak możliwości pracy z takim napięciem),
  • potrzebę zasilania mikrokontrolera napięciem większym od 3,6V (maksymalne dla karty SD) np. 5V z powodu ustawionej dużej prędkości mikrokontrolera lub wymogów dot. napięcia zasilania  podłączonych do niego innych układów peryferyjnych..

Zobaczmy więc jakie mamy ograniczenia dla mikrokontrolera ATmega8 w wersji podstawowej oraz wersjach A i L:

  • ATmega8 oraz ATmega8L:


ATmega8, ATmega8L - zakresy napięć zasilania.
Rys. ATmega8, ATmega8L - zakresy napięć zasilania.


  • ATmega8A jest podobnie jak w ATmega8L:


ATmega8A - zakresy napięć zasilania.
Rys. ATmega8A - zakresy napięć zasilania.

ale niestety zależy także od prędkości zegara jakim taktujemy ATmega8A:


ATmega8A - zakresy napięć zasilania w zależności od częstotliwości zegara (F_CPU).
Rys. ATmega8A - zakresy napięć zasilania
w zależności od częstotliwości zegara (F_CPU).

Jaki widzisz wiele czynników trzeba brać pod uwagę ustalając napięcie zasilania mikrokontrolera, przez co często trzeba mocno kombinować.



Mikrokontroler 3,3V - karta SD 3,3V

Rozważmy na początek najprostszy przypadek, czyli zasilanie zarówno karty pamięci jak i mikrokontrolera napięciem 3,3V.


Schemat podłączenia karty pamięci SD do mikrokontrolera Atmega8 - wspólne napięcie zasilania  3,3V.
Rys. Schemat podłączenia karty pamięci SD do mikrokontrolera Atmega8
(wspólne napięcie zasilania  3,3V).


Powyższy schemat przedstawia najprostszy sposób połączenia mikrokontrolera i karty.

W praktyce (choć nie jest to konieczny warunek) powinno się stosować podciągnięcia do zasilania (wszystkich linii odpowiedzialnych za komunikację) za pomocą zewnętrznych rezystorów, aby zapobiegać stanom nieustalonym na liniach transmisyjnych np. tuż po włożeniu karty do złącza, ale zanim jeszcze układ nadrzędny (MASTER) rozpocznie komunikację z kartą.

Należy więc schemat wzbogacić następująco:


Schemat podłączenia karty pamięci SD do mikrokontrolera (wspólne napięcie zasilania  3,3V) wraz z rezystorami podciągającymi.
Rys. Schemat podłączenia karty pamięci SD do mikrokontrolera(wspólne napięcie zasilania  3,3V) wraz z rezystorami podciągającymi.



Wartości rezystorów podciągających można dobrać typowo z zakresu 4.7-10k.

Pełne podłączenie karty pamięci do mikrokontrolera ATmega8A zasilanego napięciem 3,3V.


Kompletny schemat ATmega8A + karta SD + rezystory podciągające (wspólne zasilanie 3,3V).
Rys. Kompletny schemat ATmega8A + karta SD + rezystory podciągające
(wspólne zasilanie 3,3V).






Mikrokontroler 5V - karta SD 3,3V


Co zrobić, gdy z jakichś względów mikrokontroler musi być zasilany napięciem wyższym, np. 5V?

Karta SD na wejściach akceptuje poziomy z zakresu od Vss-0,3V do Vdd+0,3V zatem można przy zasilaniu karty napięciem 3,3V wysyłać do niej sygnały napięciowe z zakresu od -0,3V do 3,6V.

Stan wysoki będzie rozpoznawany od ok. 0,625Vdd, czyli w tym przypadku od 2V do 3,6V, zaś stan niski będzie rozpoznawany od 0,25Vdd w dół, czyli od -0,3V do 0,82V.


Rozwiązanie 1: rezystor

Oto najprostsze (chociaż nie zalecane) rozwiązanie. Bardziej można je stosować jako rozwiązanie awaryjne/testowe:

Mikrokontroler zasilany 5V, karta SD zasilana 3,3V+ rezystory (szeregowo) dostosowujace poziom sygnałów.
Rys. Mikrokontroler zasilany 5V, karta SD zasilana 3,3V
+ rezystory (szeregowo) dostosowujace poziom sygnałów.


Układ działa na zasadzie stabilizatora parametrycznego na diodzie zenera:

Schemat stabilizatora parametrycznego.
Rys. Schemat stabilizatora parametrycznego.


Literatura:

Zaraz, zaraz! Ale diod nie widać na wcześniejszym schemacie!
Owszem - wykorzystuje się tutaj wbudowane na wejściach karty pamięci diody zabezpieczające.

Taki układ działa na liniach MOSI, CLK oraz CS.


Ale po co rezystor na linii Miso?

Przecież jest to wejście danych dla mikrokontrolera, a więc wyjście karty pamięci. Skoro karta zasilana jest napięciem 3,3V, będą tam sygnały z przedziału 0V do 3,3VDlatego rezystor ten nie jest konieczny jednakże pod warunkiem, że nie będziemy programować mikrokontrolera, gdy podłączona jest karta pamięci.

Odłączanie karty pamięci podczas każdego programowania jest kłopotliwe, stąd potrzebny jest rezystor zabezpieczający linię DO karty, ponieważ w trakcie programowania na linii MISO mikrokontrolera wystąpią napięcia z przedziału 0V-5V.


Jak dobrać rezystory?

Tutaj byłbym ostrożny. Ja użyłem rezystorów 470R. Takie rozwiązanie nadaje się raczej dla wolniejszych prędkości transmisji.

Poniżej przebiegi CLK dla częstotliwości 1, 2, 4 i 8 MHz na wyprowadzeniach karty pamięci podłączonej według powyższego schematu:


Przebiegi na linii CLK dla częstotliwości 1MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 1MHz.



Przebiegi na linii CLK dla częstotliwości 2MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 2MHz.


Przebiegi na linii CLK dla częstotliwości 4MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 4MHz.


Dla 4MHz transmisja już się posypała.

Ale dlaczego? Jak widać na powyższym oscylogramie poziom niski wypada na granicy ok. 0,9V. Jak podawałem na początku, stan niski dla zasilania karty napięciem 3,3V jest rozpoznawany z przedziału -0,3V do ok. 0,82V, zatem nic dziwnego, że przy prędkości transmisji 4MHz taki układ już się nie działa prawidłowo.



Przebiegi na linii CLK dla częstotliwości 8MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 8MHz.

Dla 8MHz, czyli maksymalnej częstotliwości zegara SPI ATmega8 jak widać wygląda to jeszcze gorzej.
Dolny offset (przesunięcie w górę względem 0V) sięga już ok. 1,5V  (strasznie dużo!), zatem nie ma szans na prawidłowe rozpoznawanie poziomów napięć przez kartę SD.


Wnioski:
  1. Sposób ten jest dość ryzykowny i w łatwy sposób można uszkodzić kartę pamięci.
  2. Diody zenera na wejściu karty to diody o napięciu zenera ok. 3,6V (wynika to z max napięcia zasilania karty) stąd też przy zasilaniu karty napięciem 3,3V mieścimy się na styk w granicy napięcia VCC+0.3V jakie można podać na wejście karty.


Rozwiązanie 2: rezystor + dioda

Napięcie na wejściach można zmniejszyć, stosując zewnętrzną diodę zenera, na napięcie 2,7 - 3,6V.

Najlepiej jednak trzymać się w środku przedziału, ponieważ tak jest najbezpieczniej.

Mając za to podwójne zabezpieczenie, można pokusić się o ciut mniejsze rezystory. Ja zastosowałem rezystory 220Ω oraz diody zenera BZX553 o napięciu zenera 3V.


Mikrokontroler zasilany 5V, karta SD zasilana 3,3V + rezystory i diody dostosowujace poziom sygnałów.
Rys. Mikrokontroler zasilany 5V, karta SD zasilana 3,3V
+ rezystory i diody dostosowujace poziom sygnałów.


Tak wyglądają przebiegi na linii CLK dla następujących szybkości transmisji:


Przebiegi na linii CLK dla częstotliwości 1MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 1MHz.


Przebiegi na linii CLK dla częstotliwości 2MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 2MHz.


Przebiegi na linii CLK dla częstotliwości 4MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 4MHz.

Jak widać dla 4MHz przy tym rozwiązaniu występuje mniejszy offset od dołu niż dla rozwiązania poprzedniego. Dla 4MHz przy tym sposobie podłączenia karty transmisja nadal ma prawo zadziałać.


Przebiegi na linii CLK dla częstotliwości 8MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 8MHz.

Przy 8MHz offset jest już za duży i transmisja się posypała.




Rozwiązanie 3: dzielnik rezystancyjny

Równie proste, ale zdecydowanie lepsze niż rozwiązania poprzednie.

Skoro trzeba zmniejszyć napięcie, to chyba pierwszym sposobem jaki przychodzi do głowy elektronikowi jest zastosowanie dzielnika napięcia.

Ale jak dobrać wartości rezystancji?

Idealny rezystor posiada tylko jeden parametr: rezystancję. W praktyce posiada jeszcze indukcyjność i pojemność pasożytniczą. Zatem układ dzielnika napięcia, który dla rezystora idealnego widziany jest tak:


Dzielnik rezystancyjny idealny.
Rys. Dzielnik rezystancyjny idealny.


w praktyce dla rezystora wygląda tak (tzw. układ zastępczy):


Dzielnik rezystancyjny rzeczywisty.
Rys. Dzielnik rezystancyjny rzeczywisty.


Dodatkowo każde wejście karty posiada swoją pojemność i to wcale nie małą ze względu chociażby na pojemność złączową i pasożytniczą diod na wejściu.

Jak widać może się z tego zrobić filtr LC lub RC lub jakiś inny mutant :-)

Zakładając dolnoprzepustowy filtr RC, częstotliwość graniczna filtru będzie malała wraz ze wzrostem rezystancji.

Stosując zatem rezystory o dużych wartościach zmniejszamy sobie pasmo przepustowości takiego dzielnika napięciowego.

Stąd wniosek: Im mniejsze wartości rezystancji, tym lepsze pasmo.

Ale nie ma nic za darmo:

Stosując rezystory o małych wartościach zwiększamy płynące prądy.

I tutaj powstaje pytanie: Jakie wartości rezystancji użyć, żeby nie uszkodzić wyjść mikrokontrolera, ale mieć możliwie najszybszą transmisję danych?

Jako, że prezentowany przykład dotyczy ATmega8, zaglądamy co mówi dokumentacja:


Nieprzekraczalne wartości najważniejszych parametrów mikrokontrolera ATmega8
Rys. Nieprzekraczalne wartości
najważniejszych parametrów mikrokontrolera ATmega8.

Jak widać maksymalny prąd pojedynczego pinu mikrokontrolera może wynieść 40mA.

Jednakże nie znaczy to, że możemy ustawić pin jako wyjście i pobierać z niego godzinami prąd 40mA i wszystko będzie w porządku. Producent podaje tę wartość w punkcie „Absolute Maximum Ratings”, czyli wartości, których przekroczenie skutkuje uszkodzeniem mikrokontrolera. Dlatego dla bezpieczeństwa przyjmijmy prąd 20mA (0,02A).

Teraz wykonamy proste obliczenie z prawa Ohma:

R = U / I
R = 5V / 0,02A = 250Ω

Czyli przy napięciu wejściowym 5V, aby popłynął prąd nie większy niż 20mA należy użyć rezystory o łącznej rezystancji szeregowej nie mniejszej niż 250Ω.

Teraz należy dobrać rezystory o dostępnych i dość popularnych wartościach. Ja wybrałem:
R1 = 100Ω
R2 = 220Ω

I = U / R
I = 5V / (110Ω + 220Ω) ≈ 0,0156A ≈ 15,6mA 

oraz:

Uwyj = 5V • 220Ω / (110Ω + 220Ω)  ≈  3,44V


Dla takich wartości prąd pobierany z wyjścia mikrokontrolera nie przekroczy 16mA, a napięcie na wyjściu dzielnika wyniesie ok. 3,44V, zatem mieszczę się spokojnie w dopuszczalnych granicach.

Nanosimy wartości elementów na schemat:


Mikrokontroler zasilany 5V, karta SD zasilana 3,3V + dzielniki rezystorowe dostosowujace poziom sygnałów.
Rys. Mikrokontroler zasilany 5V, karta SD zasilana 3,3V
+ dzielniki rezystorowe dostosowujace poziom sygnałów.


i testujemy otrzymując następujące przebiegi na lini CLK:

1MHz:

Przebiegi na linii CLK dla częstotliwości 1MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 1MHz.



2MHz

Przebiegi na linii CLK dla częstotliwości 2MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 2MHz.



4MHz


Przebiegi na linii CLK dla częstotliwości 4MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 4MHz.



8MHz

Przebiegi na linii CLK dla częstotliwości 8MHz.
Rys. Przebiegi na linii CLK dla częstotliwości 8MHz.



Jak widać rozwiązanie to jest najlepszym z wszystkich dotychczas przeze mnie przedstawionych, a transmisja przebiega poprawnie nawet przy 8MHz.



Przyczyny problemów?

Jedną z najczęściej spotykanych przyczyn kłopotów z komunikacją po SPI wraz z konwersją napięć jest nieodpowiednie dobranie układu konwertującego do zastosowanej częstotliwości transmisji danych.

Drugą przyczyną może być błędny odczyt stanu wysokiego na linii MISO przez  mikrokontroler. Zasilając kartę SD napięciem 3,3V, a  mikrokontroler napięciem 5V, poziom 3,3V na wejściu  mikrokontrolera powinien być odczytywany jako wysoki.

3,3V/5V = 0,66

Zdarzyć się jednak może, że napięcie zasilania karty wyniesie nieco mniej, zaś mikrokontrolera nieco więcej i w konsekwencji mogą występować błędy.




Rozwiązanie 4: bufor

Rozwiązaniem wszelkich problemów związanych z poziomami napięć jest zastosowanie buforów na liniach pomiędzy kartą pamięci i mikrokontrolerem, np. popularny bufor SN74LS07. Jest to układ scalony zawierający w sobie 6 buforów z wyjściem typu OC (ang. open collector).


Bufor SN74LS07.
Rys. Bufor SN74LS07.



Open collector (otwarty kolektor) oznacza, że kolektor wyjściowego tranzystora NPN nie posiada wewnętrznego podłączenia do stanu wysokiego. Poniżej schemat wewnętrzny pojedynczej bramki w układzie SN74LS07. Zauważ, że tranzystor ten ma kolektor podłączony jedynie do wyjścia oznaczonego Output:


Wewnętrzna struktura pojedynczego bufora 74LS07.
Rys. Wewnętrzna struktura pojedynczego bufora SN74LS07.


Układ z wyjściem OC może jedynie zewrzeć wyjście do masy (logiczne zero) lub pozostawić je w stanie wysokiej impedancji więc żeby była to logiczna jedynka musimy zastosować zewnętrzny rezystor podciągający.

Podobnie występują również układy OD (open Drain) w przypadku układu zbudowanego na tranzystorach polowych.

Zastosowanie bufora OC (lub OD) daje możliwość elastycznego dostosowania odpowiedniego poziomu napięcia stanu wysokiego na wyjściu bufora, podciągając wyjście przez rezystor zewnętrzny do odpowiedniej szyny napięcia zasilania.

Maksymalny prądy wyjściowy w stanie niskim dla układu SN74LS07 wynosi 40mA. Przy zasilaniu układu napięciem 5V, rezystor podciągający (czyli rezystor obciążenia dla wyjścia OC) może mieć minimalną wartość (liczymy prawem Ohma):

R = U / I

R = 5V / 0,04A = 125Ω

Nie należy jednak stosować tak małych rezystancji, by zbytnio nie obciążać układu, ani źródła zasilania. Dlatego bezpieczną wartością będzie przyjęcie wartości rezystancji z przedziału 470Ω - 1kΩ.


Stosuj bufory gdy musisz mieć absolutną pewność poprawnego działania przy dużych częstotliwościach.




Przykład czytnika kart SD

Poniżej przedstawiono przykładowy schemat podłączenia karty pamięci do mikrokontrolera zasilanego napięciem 5V przy zastosowaniu bufora (translatora napięć) na układzie SN74LS07.


Mikrokontroler zasilany 5V, karta SD zasilana 3,3V + bufor 74LS07 z rezystorami dostosowujacy poziom sygnałów.
Rys. Mikrokontroler zasilany 5V, karta SD zasilana 3,3V
+ bufor 74LS07 z rezystorami dostosowujacy poziom sygnałów.

I na zakończenie artykułu przedstawiam schemat i kod programu do bardzo prostego demonstracyjnego czytnika dokumentów tekstowych z karty pamięci, wykorzystując wyświetlacz 2x16 znaków z kontrolerem HD44780 i bibliotekę obsługi systemu FAT na kartach pamięci – Petit FatFS:


Kompletny schemat czytnika kart SD (mikrokontroler i bufor zasilane 5V, karta SD zasilana 3,3V).
Rys. Kompletny schemat czytnika kart SD
(mikrokontroler i bufor zasilane 5V, karta SD zasilana 3,3V).


Kompletny projekt (program) w Atmel Studio 6: sd_reader.rar

Mikrokontroler Atmega16 ustawiony na wewnętrzny oscylator RC 8MHz. Program otwiera plik tekstowy DOK1.txt znajdujący się w głównym katalogu na karcie pamięci i wyświetla tekst. Klawisz GORA i DOL służą do przewijania tekstu.


Przeczytaj take: Karta SD

Miłej zabawy z Petit FatFS!

39 komentarzy:

  1. Dzięki Drzasiek za ten artykuł. Właśnie siedzę nad projektem w którym będę używał kartę SD.

    Użyłeś bufora 74LS07. Widziałem także projekty w których były bufory 74125. Różnicę w ich sterowaniu rozumnie, ale chciałem zapytać o ich wersje. Konkretnie widziałem 74HC125 i 74VC125.

    Czy mógłbyś wytłumaczyć kiedy stosować wersje LS, HC i VS?

    OdpowiedzUsuń
  2. http://pl.wikipedia.org/wiki/Seria_7400

    OdpowiedzUsuń
  3. Witam. Artykułu nie czytałem, ale wiem, że za jakiś czas to zrobię, bo interesuje mnie ten temat. Także piszę tylko dlatego, żeby pogratulować roboty, którą wykonujesz. No i żeby potwierdzić, że ktoś czyta tą stronę. Pozdrawiam!

    OdpowiedzUsuń
  4. Jakich innych układów można użyć zamiast 74LS07? Jakie różnice z tego wynikają oraz jakie są tego wady/zalety?

    OdpowiedzUsuń
  5. Wyżej podałem link, gdzie wyjaśnione są oznaczenia literowe. Nie ma sensu, żebym przepisywał tutaj informacje, które zawarte są w powyższym linku.
    A tutaj:
    http://en.wikipedia.org/wiki/List_of_7400_series_integrated_circuits
    z kolei jest lista układów z serii 74xx. Jakie układy szukać? Bufory (ang. hex buffer/driver) z wyjściem typu otwarty kolektor(ang. open collector outputs).
    Ewentualnie z wyjściem trójstanowym (ang. three-state outputs), ale wtedy jest nieco inna filozofia podłączania. Proszę przestudiować informację zawarte pod linkami a na pewno wiele się rozjaśni.

    OdpowiedzUsuń
  6. Ja dodam, że w pierwszym komentarzu kol. WolakS pytał o często stosowane bufory 74125 i 74126. I tymi proszę się zainteresować, najlepiej w wersji HC, czyli 74HC125 lub 74HC126.

    OdpowiedzUsuń
  7. Po co wyjście danych karty SD (pin MISO mikrokontrolera) jest rezystor, skoro wyjście karty jest typu otwarty kolektor? Mam na myśli sytuację, gdy mikrokontroler zasilany jest z 5V. Wystarczy przecież to wyjście podciągnąć do +5V rezystorem.

    OdpowiedzUsuń
  8. Podaj pełną nazwę jaka jest napisana pod schematem o którym mówisz, bo nie wiem do czego się odnosić.

    OdpowiedzUsuń
  9. Chodzi o ten obrazek: http://2.bp.blogspot.com/-3lBWnnz9Ql0/UFUVGHUPNKI/AAAAAAAADgM/C_2FoWfvOxY/s400/avr-atmega-5V-karta-sd-3_3V-podlaczenie.gif

    Chodzi mi o wyjście danych karty (z rozpędu napisałem o otwartym kolektorze, miało być otwarty dren).

    OdpowiedzUsuń
  10. Karta pamięci SD nie ma wyjść typu OC/OD. Czemu tak sądzisz?
    A rezystor do pinu MISO mikrokontrolera jest po to, by nie uszkodzić karty pamięci podczas programowania mikrokontrolera.
    W trybie programowania to programator jest masterem a slave to mikrokontroler. Czyli w przypadku zasilania mikrokontrolera napięciem 5V, na linii MISO podczas programowania będą występować sygnały 0-5V, co mogłoby uszkodzić kartę.

    OdpowiedzUsuń
  11. Witam. Mam zamiar wykonać układ który będzie miał na swoim pokładzie kartę SD/MMC. Układ ten będzie zasilany z baterii. Zasilanie jakie w obecnej chwili planuję to 5V (w przyszłości będzie 3V3 żeby zaoszczędzić na energii). Mam więc takie pytania: czy kartę SD i układ buforów mogę zasilić poprzez diodę zenera, czy to nie będzie powodowało jakichś zakłóceń i czy układ będzie działał poprawnie. Zastosowanie kolejnego LDO spowoduje że układ będzie pobierał większy prąd (no nie aż taki duży, ale zawsze coś;) ). W swoim artykule napisałeś że można użyć diody zenera - ale czy na dłuższy czas pracy układu jest do dobre rozwiązanie, czy lepiej poświęcić te kilka może mA na zastosowanie LDO. Proszę o wyrozumiałość - biorę wszystkie możliwe warianty pod uwagę i wybiorę ten najbardziej optymalny. Dzięki za odpowiedź.

    OdpowiedzUsuń
  12. Stabilizator parametryczny na diodzie zenera nie jest zbyt dobrym rozwiązaniem jako źródło zasilania czegokolwiek. Zbyt mała wydajność prądowa takiego źródła.
    Już lepiej wykorzystać spadek napięcia na złączu pn i połączyć w szereg kilka diod, z tym, że trzeba pamiętać o tym, że karta może pobrać dość spory prąd, w zależności od zasilania, producenta i operacji wykonywanych. Najlepiej sprawdzić w dokumentacji karty pamięci. Więc diody muszą wytrzymać prąd jaki może przez nie popłynąć. Chociaż takie rozwiązanie też bym odradzał. Jeśli zależy Ci na oszczędzaniu energii to od razu przejdź z wszystkim na napięcie 3.3V.

    OdpowiedzUsuń
  13. Daniel, niestety karty SD ciągną impulsowo spore prądy (nawet kilkaset mA!). Stąd prosty zasilacz na zenerce i rezystorze zupełnie się nie sprawdzi - zasilanie będzie siadać i cała transmisja pójdzie do /dev/null. Dobre LDO pobierze dla siebie jakieś mikroampery + oczywiście cały spadek jak to na regulatorze liniowym bywa. Lepiej od razu całość zasilić z 3V3 i nie kombinować.

    OdpowiedzUsuń
  14. Tak zrobię. Wszystko od razu poprzez LDO 3v3. Dzięki za opinię i rady.
    Pozdrawiam.

    OdpowiedzUsuń
  15. Czy w pliku mian.c nie brakuje czasem:
    #include "HD44780.h"?

    OdpowiedzUsuń
  16. Wszystko fajnie, tylko ten artykuł (jak i następny o RS) nie podchodzi pod definicję pamiętnika :>

    OdpowiedzUsuń
  17. Witam, co to za wejście/wyjście IC2P ? Artykuł świetny, rozjaśniło mi to co nie co (:

    OdpowiedzUsuń
  18. C:\Users\Andrzej\Desktop\sd_reader\main\main.cproj : error : Package ToolchainPackages\com.Atmel.AVRGCC8.C\WinAVR does not exist

    Witam . Dręczy mnie właśnie ten problem podczas otwierania projektu w Atmel Studio 6 . Zna ktoś odpowiedź jak rozwiązać taki błąd?

    OdpowiedzUsuń
    Odpowiedzi
    1. nie masz pakietu WinAVR. Zainstaluj go albo pobierz Toolchain Atmel'a
      POzdrawiam

      Usuń
  19. Witam!
    Co to za model oscyloskopu?
    Pozdrawiam.

    OdpowiedzUsuń
  20. C:\Users\Andrzej\Desktop\sd_reader\main\main.cproj : error : Package ToolchainPackages\com.Atmel.AVRGCC8.C\WinAVR does not exist


    Dodaj zmienne środowiskowe do programu, najwidoczniej ich brak.

    OdpowiedzUsuń
  21. Bardzo fajny poradnik!
    Ale zgubiła mnie w nim jedna rzecz ten bufor i taktowanie.
    Nie wiem może u Ciebie przy takim taktowaniu wewnętrznym oscylatorem działa u mnie na 8Mhz wewnętrzny nie działał. Zmieniałem w programie w fusebitach i niestety ale 8Mhz nie wydala nie próbowałem zewnętrznego dlatego nie przekreślam tych badań ale strasznie mnie to zalatwiło tzn dużo czasu mi zajęło dojście do tego że to wina taktowania bo ufałem bezgranicznie poradnikowi ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. W zamyśle Drzaśka ten artykuł miał pokazać całkiem początkującym jedynie zjawiska i problemy w zależności od stosowanych różnych popularnych rozwiązań. Innymi słowy chcieliśmy uczulić początkujących, że elektronika cyfrowa jest cyfrową tylko z nazwy i że rządzą nią prawa elektroniki analogowej.

      Dlatego artykuł i przedstawione w nim wyniki doświadczeń nie mogą stanowić "wyroczni", że w dany przypadku inny projekt będzie działał tak samo. Przy częstotliwościach granicznych dla każdej z wersji układu wpływ czynników dodatkowych jak np. projekt płytki PCB może powodować odmienne zachowanie się całości.

      A jak sobie poradziłeś ze swoim projektem?

      Usuń
  22. witam, mam taki problem ze źle odczytuje mi z karty pamieć dane i wyświetla mi jakieś krzaczki, układ działa prawidłowo, to znaczy wyświetla się na poczutą napis "czytam..." a po włożeniu karty pamieć od razu wyświetla krzaczki, czy to może być problem z zasilanie karty pamieć? czy z wadliwym uc? programowałem kilka razy różne atmegi8/16 i na każdej jest to samo, co może być tego przyczyną??

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam. Przyczyn może być wiele, dlatego dokładnie opisz to na form wklejając Twój schemat i cały program.

      Usuń
    2. ... a tutaj wklej proszę link do tematu na forum.

      Usuń
  23. schemat i program jest z tej strony, opisanego jako:" Przykład czytnika kart SD"

    OdpowiedzUsuń
    Odpowiedzi
    1. Zrób o co prosiłem i dorzuć do tego jeszcze (oprócz schematu) ostre zdjęcia Twojego układu.

      Usuń
  24. Podłączam linie CLK do oscyloskopu ale nic nie pokazuje. Czy możecie powiedzieć mi jak podłączyć tak, aby pokazało przebieg? Potrzebny jest generator funkcyjny? Jakiś schemat rzucicie podłączenia do oscyl.? Proszę.

    OdpowiedzUsuń
  25. Witam, a jak jest z kwarcem20mhz? Czy karta sd na nim pojdzie?

    OdpowiedzUsuń
  26. ten projekt nie był ani kompilowany a tym bardziej uruchamiany
    znalazłem kilka małych błędów i jeden kardynalny, uniemożliwiający wręcz uruchomienie transmisji SPI

    OdpowiedzUsuń
  27. Niestety link do programu wygasł. Można wznowić?

    OdpowiedzUsuń
  28. W temacie konwersji poziomów napięć: Można znaleźć coś takiego https://pl.aliexpress.com/item/I2C-IIC-8-Channel-Logic-Level-Converter-Module-Bi-Directional-for-Arduino/32783676584.html?spm=2114.13010608.0.0.9w5VMU Co to właściwie jest i jak działa?

    OdpowiedzUsuń
  29. Udało mi się znaleźć takie info: schemat oraz datasheet użytego półprzewodnika ale nadal nie rozumiem jak to działa :).

    OdpowiedzUsuń
  30. Ten dokument dokładnie wyjaśnia zasadę działania.
    To tani prosty sposób na konwersję poziomów napięć. Używamy go np. tutaj.

    OdpowiedzUsuń
  31. Witam,
    Jaka jest szansa że plik sd_reader.rar zostanie uaktualniony? Bardzo chętnie bym się zapoznał z samą konfiguracją biblioteki.
    Pozdrawiam!

    OdpowiedzUsuń
  32. Cześć,
    czy jest możliwość uaktualnienia pliku z programem? Ten link niestety już nie działa a chciałem spróbować podbawić się kartą SD.

    OdpowiedzUsuń