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

AVR Karta SD problem z komunikacją

Tomcio7 02 Wrz 2008 11:24 8787 30
  • #1 02 Wrz 2008 11:24
    Tomcio7
    Poziom 17  

    Mam dwa układy - identyczne - atmega8 sd głośnik wyświetlacz przy czym...
    Pierwszy zasilany jest napięciem 3v3 - karta działa prawidłowo, avr czyta dane z karty, głośnik gra, wyświetlacz wyścietla (wszystko działa prawidłowo w zakresie od 2v8 do 3v4)

    Natomiast drugi zasilany jest 5.0V - karta nie działa prawidłowo!! wogole nie jest wykrywana (zastrzegam że to ta sama karta)! przy czym komunikacja z avr'em odbywa się przez dzielnik napięcia - napięcie z dzielnika to ok 3v1.

    Nie potrafię dociec gdzie leży problem. Zastrzegam że z pewnych względów muszę avr zasilać napięciem 5V.

    Popraw temat
    kosmita

    0 29
  • #2 02 Wrz 2008 13:03
    ciastek4
    Poziom 13  

    Właśnię posiłkuję się z komunikacją z kartą SD. Mi się wydaję, ze masz coś poknocone z zasilaniem albo z dzielnikami rezystancyjnymi (spradź to jeszcze sobie raz). Pamietaj, że karta wygaga zasilania z zakresu 2.7V - 3.6V. ;)

    0
  • #3 02 Wrz 2008 13:16
    Tomcio7
    Poziom 17  

    Sprawdzałem to już n razy - w jednym układzie działa w drugim nie. Karte zasilam 3v3 ;)

    dzielnik mam z rezystorami 280 [ohm] i 470

    0
  • #4 02 Wrz 2008 16:37
    Biszkopcik
    Poziom 12  

    Sam korzystam tylko z układu gdzie wszystko zasilam 3v3, ale czytałem w kilku miejscach, że przy zasilaniu proca z 5V między kartę a procek wypada wstawić odpowiedni bufor, np 74LVC541 (3,3V CMOS, 5V tolerant I/O)

    0
  • Pomocny post
    #5 02 Wrz 2008 18:17
    BoskiDialer
    Poziom 34  

    U mnie dzielniki z 10k pomiędzy sd a 3v3 oraz 2k2 pomiędzy sd a uC sprawdzają się doskonale (ta sama konstrukcja dla wszystkich pinów - można zmieniać kierunek transmisji, przydatne w trybie innym niż spi, chociaż przy spi też działa) - zawsze możesz sprawdzić takie podłączenie. Lepsze to niż 280R i 470R w dzielniku [rozmowa na gadu]

    0
  • #6 02 Wrz 2008 19:49
    Tomcio7
    Poziom 17  

    pomiędzy uC a kartę dałem 10k, kartę a gnd 22k i efekt ten sam.. Jakieś pomysły?
    Za pomoc w rozwiązaniu daje 200pkt :) bo siedzę nad tym już 2 dzień..

    0
  • Pomocny post
    #7 02 Wrz 2008 19:58
    Osmo
    Poziom 18  

    całkiem nieźle moja atmega 32 współpracowała z karta podłaczona według schematu ze strony:
    http://www.captain.at/electronic-atmega-mmc.php

    Czyli między uC a karta 1k8, miedzy kartą a GND 3k3.

    Co prawda to mmc, ale SPI to samo, SD 128 chulało aż miło ;)

    -1
  • #8 02 Wrz 2008 20:32
    Tomcio7
    Poziom 17  

    Wyjście karty DataOut bezpośrednio do portu 5V?

    DZIAŁA. Dodam że przy poprzednich wartościach 280R i 470R nie działało w taki sposób

    'Koledzi' BoskiDialer i Osmo dostają po 100pkt. Wielkie dzięki:)

    -1
  • #9 03 Wrz 2008 09:35
    takow
    Poziom 12  

    U mnie MMC chodzi na dzielnikach-rezystorach i atmega128.
    Tylko że jak odpalę avr-dos w Bascomie i czytam z karty nagrane wavy mono 16kHz i 8bit to mam głos przerywany (komputerowy), atmega odczytuje do bufora po 512B i od razu wysyła do PWM.
    Podejrzewam, że problem z przerywaniem to ten moment gdzie atmega czyta po isp te 512 Bajtów.
    Jeśli załaduje z karty 128kB xramu to odtwarza przez PWM miodzio, tylko że jak skończy się xram, to jest parę sekund przerwy aż się ram załaduje na nowo. Jak czytam prosto z karty to kicha-przerywa (drga głos).
    Czy da się skonfigurować avr-dos, żeby czytał po jednym bajcie z mmc?
    Czy macie jakiś pomysł, żeby czytać cały plik wav bez przerw ?

    0
  • #10 03 Wrz 2008 11:49
    __Grzegorz__
    Poziom 27  

    Kolega powinien poczytać sobie o ustrojstwie zwanym FIFO....

    0
  • #11 03 Wrz 2008 12:17
    takow
    Poziom 12  

    No więc myślałem o czymś takim:
    Pierwszy procesor czyta po 512B i wystawia każdą próbkę na jeden port 8-bitowy (jest to system avr-dos więc nie mam specjalnie kontroli co, kiedy i ile się zaciąga z karty)
    Drugi procesor przez chwilę ładuje te dane do ramu "od góry do dołu", a po chwili zaczyna z "dołu", ciągle z jednego miejsca te dane pobierać i wystawiać na przetwornik D/A zrobiony na PWM-ie. Przepływ danych z jednego procesora do drugiego byłby kontrolowany paroma pinami portu.
    To tak jakby nalewać z góry wodę do pojemnika, a u dołu ją wylewać przez otwór. To chyba FIFO (first input first output) ale muszę poczytać faktycznie.
    Co o tym myślicie?

    0
  • #12 03 Wrz 2008 14:23
    __Grzegorz__
    Poziom 27  

    Może prościej będzie dodać drugi bufor na dane i wtedy:

    wgrywasz z karty do pierwszego bufora, odtwarzasz z drugiego,

    jak odtworzysz wszystkie dane z drugiego, przełączasz na dane z pierwszego i wgrywasz dane do drugiego,

    jak odtworzysz wszystko z pierwszego, przełączasz się na drugi i wgrywasz dane do pierwszego...

    i tak w kółko....

    plus rozwiązanie problemów na początku i końcu takiego żonglowania buforami...

    0
  • #13 03 Wrz 2008 17:26
    Tomcio7
    Poziom 17  

    albo (mam to sprawdzone) masz bufor np 512B
    wgrywasz dane z karty do bufora i zaczynasz odtwarzać np. w przerwaniu
    gdy w przerwaniu odtwarza już np 400 (cztery-setny-bajt) z karty zaczynasz wgrywanie danych
    z karty wpisuje do bufora 1,2,3,4 bajt - a ty w tym samym momencie odtwarzasz 401, 402
    Sztuką jest tak dobrać tą 'założoną przezemnie teraz wartość 400' (banalne) aby zdążyć odtworzyć wszyskie dane, a w momencie gdy odtwarzamy 512bajt mieć już pare pierwszych odczytanych z karty

    znakomicie sprawdza się to tutaj
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=1076005&highlight=
    tutaj jeszcze dochodzi wyświetlanie obrazka :))

    -1
  • #14 08 Wrz 2008 19:08
    Jacek54
    Poziom 10  

    Może to ktoś wyjaśnić, na karcie SD/MMC nie koniecznie może wystepować FAT, żeby móc ją obsługiwać ?
    Pojecie karta sformatowana jest z FAT-em czy bez ?

    0
  • #15 08 Wrz 2008 20:27
    BoskiDialer
    Poziom 34  

    Jacek54: Karta to nic innego jak nośnik danych podzielony na bloki o ustalonym rozmiarze (zazwyczaj 512B). Można tam przechowywać dane w dowolny sposób. Jakkolwiek jest to nie wygodne, gdyż nie wszystkie urządzenia umiały by interpretować te dane (zapis/odczyt jest zawsze taki sam, więc tu nie było by problemu). System plików, jak np fat czy ext2 to wyższa warstwa - ukrywa bloki urządzenia w zamian dostarcza obiekty jakimi są pliki i foldery - system plików to nic innego jak ustalony schemat zapisywania danych na karcie. Sama karta "nie wie" nic o plikach czy innych strukturach - po prostu przekazuje dane z/do urządzenia(sterownika), a ten interpretuje je, podobnie sam sterownik nie wie, czy dane są zapisywane na karcie pamięci, dysku, w pamięci RAM czy gdzie - obie warstwy komunikują się na poziomie abstrakcji jakim są sektory. Sam sterownik karty dostarcza więc tylko podstawowe funkcje (zwrócenie rozmiaru nośnika, odczyt/zapis sektora), a sterownik systemu plików korzysta z tych funkcji. Warstwę systemu plików można pominąć i odwoływać się bezpośrednio do sterownika po sektory, ten nie zaprotestuje, gdyż żądanie sektorów to normalne żądanie - karta nie zauważy żadnej różnicy i też będzie działać.

    Pojęcie karty sformatowanej najczęściej oznacza, że są tam utworzone poprawne struktury jakiegoś systemu plików, nie musi być określone jakiego, jakkolwiek najczęściej jest to FAT.

    0
  • #16 09 Wrz 2008 12:43
    Jacek54
    Poziom 10  

    Dzieki
    1.Czyli na karcie nie sformatowanej (bez systemu plików) jest podział na sektory ?
    2. Czy w bascomie, żeby mieć obsługę plików trzeba włączyć AVR-DOS oraz aktywować instrukcję initfilesystem?

    0
  • #17 09 Wrz 2008 13:14
    BoskiDialer
    Poziom 34  

    ad 1/ Tak, karta nie sformatowana jest podzielona na sektory (zawsze jest).
    ad 2/ Musisz poczytać dokumentację. Żeby mieć obsługę plików musisz mieć sterownik, możesz go równie dobrze sam napisać. Jeśli chcesz korzystać ze sterownika z "AVR-DOS" - poczytaj dokumentację (jeśli jest), powinna poruszać to zagadnienie.

    0
  • #18 10 Wrz 2008 11:41
    Jacek54
    Poziom 10  

    Dzięki !
    1.Opis AVR-DOS mam w pliku pomocy bascoma, nie wiem czy to wystarczy?
    2.Co muszę wiedzieć, żeby napisać własny program na uP do obsługi plików na karcie. Czy muszę znać zawartosć boot sectora, mieć do niego dostęp, móc dokonywać na nim jakiś zmian ?
    3. Czy tablica FAT wchodzi w skład boot sectora ?
    4. czy te dane sa mi potrzebne ?
    5. Jeżeli tak, to gdzie na ten temat mozna poczytać w polkim języku. ?

    0
  • #19 12 Wrz 2008 23:59
    BoskiDialer
    Poziom 34  

    ad 1/ Też nie wiem. Dla niektórych osób to wystarczy, dla niektórych nie.
    ad 2/ Musisz wiedzieć jak są rozmieszczone struktury po sektorach, jakie są relacje pomiędzy strukturami, rozmieszczenie pól etc. Różne systemy plików różnie podchodzą do różnych zagadnień, stąd są między nimi różnice. FAT jest wyraźnie nastawiony na prostotę (bootsector zawierający podstawowe informacje o systemie plików - jakie dokładnie nie będę pisał, utfg; następnie jest jedna lub kilka tablic FAT opisujących stan poszczególnych klastrów oraz powiązania łańcuchowe pomiędzy nimi, dalej jest właściwa przestrzeń danych. Ext2 jest nastawiony na niezawodność, nagłówki plików są umieszczone w iwęzłach, nie ma czegoś takiego jak tablice FAT - nośnik jest podzielony na grupy, każda ma jeden blok opisujący zajętość pozostałych bloków w grupie (+inne struktury; sam blok opisujący nie ma określonej lokalizacji - znajduje się wewnątrz grupy, jego położenie determinuje deskryptor grupy), na samym początku obok bootsectora zawierającego podstawowe informacje o systemie są deskryptory grup. Ogólnie co system to inna struktura i filozofia. bootsector to tylko namiastka tego, co trzeba umieć odczytać (jeśli to potrzebne) i interpretować, w nim jest chyba najmniej informacji (co nie oznacza, że są najmniej ważne). Różne systemy mają zresztą różne struktury w bootsectorze, niektóre w ogóle go nie mają (ext2 pomija bootsector, posiada natomiast superblok pod sektorem 2 [licząc od 0]). Żeby napisać własny sterownik systemu plików trzeba mieć: wiedzę i doświadczenie w programowaniu, czas, chęci, upór, dokumentację, pomysł i zdolność kombinowania.
    ad 3/ Nie.
    ad 4/ Dużo danych jest Tobie potrzebnych.
    ad 5/ W języku polskim owszem są materiały, ale nie licz na to, że będzie ich dużo. Szczegółowe opisy są najczęściej po angielsku.

    0
  • #20 16 Wrz 2008 20:01
    maly_elektronik
    Poziom 23  

    A w jaki sposób zasilasz sd (przy tym dzielniku rezystorowym) :?:
    Mam nadzieje że posiadasz stbilizator 3v3 który z napiecia 5V robi 3v3 do zasilania karty :) Jeżeli tak masz to może któraś ścieżka nie przewodi jak powinna :(

    0
  • #21 17 Wrz 2008 00:25
    saper_2
    Poziom 17  

    Witam,

    To ja może się podepnę do temetu :), bo problem mam chyba bardzo podobny...
    Ostatnio zainteresowałem się kartami SD :) i mam problem przy podłączeniu karty kiedy procesor zasilam z 5V zrobiłem 3 wersje układów dopasowania poziomów v1 na 74lvx125 ,v2 na rezystorach i v3 na 74ac244 i wszystkie nie działają. ;( .. To ich schematy:
    v1
    AVR Karta SD problem z komunikacją
    v2 - zamiast LP użyłem S1117-3.3
    AVR Karta SD problem z komunikacją
    i v3
    AVR Karta SD problem z komunikacją
    Napięcie zasilania na karcie (i buforze) mam OK, czyli dla v1=3V i v2,v3=3,3V ... dopiero pod koniec tygodnia będę miał oscyloskop cyfr. więć może coś więcej się wyjaśni ,a teraz chciałbym aby "fachowcy" "rzucili" okiem na schematy... Może jakiś jednak popełniam błąd na schemacie? Mogę wrzucić jeszcze rysunki/zdjęcia płytek (v2 już zdemontowałem na rzecz v3 :) )
    I jeszcze jedno czy wszystkie karty udało się wam uruchomić bo mi tylko działają karty kingstona ,zaś karty toshiby i sandiska wogule nie chcą gadać :(

    Kod jaki napisałem jest tutaj: http://del-el.jcom.pl/?module=257&cat=13
    Zaś taki wynik dostaję w terminalu:

    Code:

    CPU start...
    MMC GO_IDLE_STATE R1=0b11111111
    ...25x...
    MMC GO_IDLE_STATE R1=0b11111111
    MMC init error: 1

    Nie wiem czemu mam ciągle 0xFF w buforze :| , próbowałem zamieniać DI z DO w procesorze ale to nic nie zmienia :(

    Główny problem rozwiązany - przepraszam za śmiecenie :/
    Rozwiązanie : wymieniłem RS4-RS6 na 2k ,a RS7 na 3k3 i wszystko zadziałało :) . (ale jestem głupi ;) )
    Ale pozostaje pytanie z działaniem innych kart :| ,na razie będę probował odaplić karte toshiba'y na bazie opisu ze strony http://elm-chan.org/docs/mmc/mmc_e.html

    0
  • #22 30 Gru 2008 13:13
    takow
    Poziom 12  

    Ja mam prośbę głównie do Tomcio7.
    Odgrzewam temat odtwarzania plików wav z karty mmc.
    Potrzebuje pomocy-bo sam nie wiem jak to zrobić, żeby mi głos nie przerywał, podczas doczytywania 512B z karty mmc podczas odtwarzania tych próbek.

    Tomcio napisał:
    albo (mam to sprawdzone) masz bufor np 512B
    wgrywasz dane z karty do bufora i zaczynasz odtwarzać np. w przerwaniu
    gdy w przerwaniu odtwarza już np 400 (cztery-setny-bajt) z karty zaczynasz wgrywanie danych
    z karty wpisuje do bufora 1,2,3,4 bajt - a ty w tym samym momencie odtwarzasz 401, 402
    Sztuką jest tak dobrać tą 'założoną przezemnie teraz wartość 400' (banalne) aby zdążyć odtworzyć wszyskie dane, a w momencie gdy odtwarzamy 512bajt mieć już pare pierwszych odczytanych z karty

    Ale jak odtwarzam ten 400-bajt to muszę przerwać odtwarzanie na chwilę pobierania całych-niestety 512B z karty, a to trwa właśnie tyle, że mi zakłóca dźwięk. Dajcie jakiś pomysł, bo utknąłem tu.

    Pozdrawiam

    0
  • #23 30 Gru 2008 13:29
    BoskiDialer
    Poziom 34  

    takow: Dwa bufory: jeden jest aktualnie odtwarzany, podczas gdy do drugiego ładujesz dane. Jeśli dane w pierwszym się skończą, robisz zamianę buforów i podczas gdy dane z aktualnego są odtwarzane program ma czas na załadowanie kolejnej porcji do tylnego buforu.
    Inaczej można to zilustrować na buforze FIFO: w przerwaniu odczytujesz pojedyncze bajty, jeśli w buforze jest miejsce na wpisanie co najmniej 512 bajtów, to odczytujesz sektor. Im bufor dłuższy, tym lepsze zabezpieczenie przed niedomiarem. Ważne jest, aby odtwarzanie było w przerwaniach, a odczyt w kodzie głównym tak, aby mógł być przerwany.

    0
  • #24 31 Gru 2008 13:12
    asembler
    Poziom 32  

    Nie musisz koniecznie czytac 512 bajtów. Istnieje mozliwosc czytania np 128 baktów z karty. z zapisem to inna bajka tu musi byc 512 bajtów.
    Moze skrócenie czasu odczytu np "podsektora" 128 bajtów pomoże w uniknieciu nieporzadanych efektów dzwiekowych.

    0
  • #25 02 Sty 2009 20:56
    takow
    Poziom 12  

    No to poddaje się chyba.

    Mój pierwszy pomysł poległ ponieważ były zakłócenia spowodowane czytaniem co chwila 512B , a tak to szło:
    Open "MOWA8K.WAV" For Binary As #1
    Do
    Get #1 , Sample
    Pwm1a = Sample
    Waitus 50
    Loop Until Eof(1) <> 0
    Close #1

    Następny pomysł poległ właśnie dzisiaj bo odczytuje z karty nie te dane co trzeba (wychodzą głupoty) (odtwarzanie działa w przerwaniu timera2):
    1. zapisuje danymi z MMC pierwszą połowę Xramu 4352 do 34943
    2. włączam timer2, który w przerwaniu odczytuje od początku Xram i kiedy odtwarzam tą 1 połowę Xramu (od 4352 do 34943), zapisuję 2 połowę Xramu (34944 do 65535) danymi z karty
    3. kiedy zaczynam odtwarzać 2 połowę Xramu (od 34944 do 65535), to zapisuje 1 połowę Xramu danymi z MMC (od 4352 do 34944)

    xram=64kB, atmega128, odtwarzam PWM

    0
  • #27 04 Sty 2009 12:07
    takow
    Poziom 12  

    Panowie-działa.

    Nie ciągnąc już tematu, przedstawię co było źle i jak teraz działa.
    Więc zrobiłem najpierw na pamięci ram 64KB, do połowy której ładowałem próbki, gdy druga była odtwarzana. Tu miałem poważny błąd-jak się okazało głupie niedopatrzenie (jak to bywa w 90% problemów).

    Teraz już działa ok. Na początku inicjalizuje kartę-tak jak w helpie, potem otwieram odpowiedni plik as binary. Następnie mam dwa bufory po 512B.
    Zaczynając odtwarzać z pierwszego, ładuje dane do drugiego. Odtwarzacz-PWM działa w przewaniu, w którym to zmieniają się odpowiednio flagi oznaczające który bufor jest używany, a do którego trzeba ładować dane.

    Oto najważniejszy fragment programu:
    ATMEGA128
    8MHZ INTERNAL
    '-------------------------------------------------------------------------------
    Sub Glowny
    Call Inicjalizacja

    Start Timer2
    Do
    If Pozycja > 512 And Pozycja < 1024 And Buf_dol = 0 Then
    For Poz_lad = 0 To 512
    Get #1 , Probka_lad
    Bufor(poz_lad) = Probka_lad
    Next Poz_lad
    Buf_dol = 1
    End If

    If Pozycja > 0 And Pozycja < 512 And Buf_gora = 0 Then
    For Poz_lad = 512 To 1024
    Get #1 , Probka_lad
    Bufor(poz_lad) = Probka_lad
    Next Poz_lad
    Buf_gora = 1
    End If
    Loop Until Eof(1) <> 0
    Close #1
    Stop Timer2
    Print "KONIEC"
    Do
    Loop
    End Sub
    '-------------------------------------------------------------------------------
    End
    '-------------------------------------------------------------------------------

    Int_player:
    Timer2 = 145
    Stop Timer2
    Probka = Bufor(pozycja)
    Pwm1a = Probka
    If Pozycja = 1024 Then Pozycja = 0
    If Pozycja = 512 Then Buf_dol = 0
    If Pozycja = 0 Then Buf_gora = 0
    Incr Pozycja
    Start Timer2
    Return
    '-------------------------------------------------------------------------------

    Dziękuję za zainteresowanie i pomoc
    Pozdrwawiam

    0
  • #28 04 Sty 2009 12:44
    marek_Łódź
    Poziom 36  

    Prędkość pobierania danych z karty nie jest parametrem krytycznym i można te dane obsługiwać bezpośrednio w trakcie ich pobierania z karty bajt po bajcie, dostosowując prędkość pobierania do potrzeb obsługi. Mam taki układ akwizycji danych, w którym zapis i odczyt danych realizuję właśnie w takim trybie i nie ma żadnych problemów (oczywiście maksymalny czas dostępu do kolejnego bajtu na karcie musi być krótszy od cyklu odtwarzania, co jest szczególnie istotne, gdy operujemy systemem plików, dającym dodatkowe słabo kontrolowane narzuty czasowe). Teoretycznie można w takim układzie w ogóle zrezygnować z bufora pamięciowego, niemniej można to również zrobić w postaci bufora cyklicznego (opisany wyżej przez kol BoskiDialer bufor FIFO), po którym wędrują dwa wskaźniki zapisu i odczytu , co dodatkowo zabezpieczy całość przed sytuacją, gdy jakieś "zatkanie" transmisji spowoduję dziurę czasową na wyjściu. Bufor FIFO może mieć dowolną długość, również mniejszą od 512 bajtów, niemniej im dłuższy, tym lepiej.
    Wariant dwubuforowy (2x512) jest szczególnym przypadkiem bufora FIFO, wariant "bez bufora" to taki, w którym bufor pamięciowy ma 1 bajt i mieści się w rejestrze.

    :arrow: takow - gratuluję rozwiązania problemu .

    0
  • #29 04 Gru 2009 19:14
    marenc
    Poziom 24  

    Witam, dołączę się do tematu...

    Zmontowałem podłączenie do AVR wg. schematu ze strony http://www.captain.at/electronic-atmega16-mmc-schematic.png

    Jedyną różnicą jest zastosowanie układu ATmega328P. Napisałem swoje oprogramowanie i sprawdziłem kilka z internetu - żadne nie działa. Odpowiedź karty to zawsze 0xff. Podejrzałem schematy z tego wątku i dodałem testowo PullDown na DO i nadal odczyt to 0xff.

    Dzielnik rezystancyjny 1k8 i 3k3 - sprawdziłem układ kilkanaście razy. Zasilanie ze stabilizatora 3V3. Podane dwie masy. Pin 8 i 9 Karty nie podłaczony. Kwarc 20MHz - SPI testowałem dla kilku częstotliwości.

    Problem jest z odczytem - gdy będzie komunikacja, to z resztą dam sobie radę.

    0
  • #30 05 Gru 2009 22:27
    zbv
    Poziom 20  

    Masz kwarc 20MHz problemem może być zbyd duże prędkość na SPI (sprawdzałeś przy różnych ale jakich?), układ z rezystorami sprawdza się przy niższych prędkościach. Ustaw SPI na jakieś 100kHz i wtedy zobacz jak Ci to zadziała.

    0