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][ASM/Bascom][SD-MMC] Poradnik dla początkujących - karty SD i MMC

09 Sty 2012 11:37 8088 17
  • #1 09 Sty 2012 11:37
    30402
    Użytkownik usunął konto  
  • #2 09 Sty 2012 11:52
    mirekk36
    Poziom 42  

    Doceniam wkład pracy. Każde takie opracowanie jest dobre. Jedyne co bym dodał, polecił i uzupełnił to to, że zamiast tych pośredniczących układów tranzystorowych wystarczy z pełnym powodzeniem zastosować prosty układ 74LVC125, który stanowić będzie przepiękny konwerter napięć +5V <--> +3,3V a jednocześnie nie będzie miał żadnych (co bardzo ważne) ograniczeń co do stosowanych prędkości).

    Nadmienię również, że FATFS wcale nie wymaga w związku z tym co napisałem wyżej układu 1:1 jak kolega napisał w poradniku. Taki scalaczek w 100% spełnia swoje zadania i polecam się nim zainteresować zamiast tych wszystkich dzielników rezystorowych czy tranzystorowych buforów. A obsługa kart przy FatFS możliwa jest bez zająknięcia łącznie z najnowszymi SDHC Class 6 o pojemnościach 8GBb.

    W pozostałych przypadkach fajnie kolega rozłożył procentowo przypadki różnych problemów jakie występują podczas takich konstrukcji, gdy ktoś pierwszy raz się za to zabiera. Właśnie te nieszczęsne dopasowania. Generalnie wiele słusznych uwag w poradniku - po takim pierwszym zapoznaniu się z nim na szybko.

    0
  • #3 09 Sty 2012 19:37
    rad231276
    Poziom 11  

    Wielki plus za zgłębienie tematu i udostępnienie poradnika na forum... Oby więcej takich ludzi, którym się coś che zrobić bezinteresownie...

    0
  • #4 25 Sty 2014 01:23
    grubson
    Poziom 9  

    Świetny poradnik!

    Chciałem się jednak upewnić:
    1) Te sposoby zapisu/odczytu danych umożliwiają jak gdyby stworzenie własnej biblioteki? (czyli nie potrzeba nic z zewnątrz?)
    2) Każdy bajt który chce wysłać na kartę SD zapisuję do rejestru SPDR - i zanim prześle następny czekam na pojawienie się 1 w bicie SPIF.?
    3) Mogę w ten sposób zapisywać dane pobrane np z GPS?
    4) Dane nie będą zapisywane do konkretnego pliku, tylko pod konkretny "adres bloku" - czyli nie będzie możliwości normalnego podglądu, jedynie za pomocą zaproponowanego przez Ciebie narzędzia DMDE. Żeby zapisywać do konkretnego pliku (np. *.txt) i dalej móc wykorzystywać te dane należałoby jeszcze je przekonwertować na FAT 16/32?

    Przepraszam za moje dopytywanie, ale ostatnio tyle się naczytałem na forach i książkach i naprzeglądałem różnych kodów od obsługi SD, że nie ogarniam tematu... niewielkie doświadczenie w programowaniu sprawia, że nie mogę się odnaleźć w tych wszystkich gotowcach, bo nigdzie nie ma żadnego opisu co jest co. Twój poradnik i tak sporo mi wyjaśnił :)

    0
  • #5 25 Sty 2014 15:34
    30402
    Użytkownik usunął konto  
  • #6 25 Sty 2014 18:17
    ASMnauka
    Poziom 12  

    Witam
    grubson , jeżeli Twym językiem jest Bascom, to proponuję zacząć od tego:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Tan więc zainteresuj się DRIVEREADSECTOR i DRIVEWRITESECTOR
    Dawno temu bardzo mi to pomogło zrozumieć zasadę działania zapisu i odczytu bez DOS-a.
    I jeszcze pomoc, z której to korzystałem.

    Pozdro Saabotaz , mój nauczycielu.

    0
  • #7 27 Sty 2014 14:21
    grubson
    Poziom 9  

    Dziękuję za szybką, rozbudowaną i pomocną odpowiedź!

    Na pewno wykorzystam zawarte tu wskazówki. Na początek postaram się napisać samemu prostą bibliotekę do zapisu na SD, wykorzystam zapisywanie danych z GPS zbierając kilkanaście pomiarów i zapisując na kolejne bloki - wydaje się najrozsądniejszy :)


    ASMnauka - niestety (albo stety) programuje w języku C, ale chętnie skorzystam również z Twoich materiałów. Zawsze przecież można przejrzeć na szybko podstawy bascoma, żeby wiedzieć mniej więcej co jest co :)

    Pozdrawiam i jeszcze raz dzięki!
    Jak będę miał jakieś problemy (co jest możliwe) pozwolę sobie jeszcze Was pomęczyć ;)

    0
  • #8 07 Kwi 2014 22:40
    lolor
    Poziom 11  

    Witam
    Zbudowałem interfejs dla Atmega8 na 4 tranzystorach wszystko działa OK, próbowałem przerobić program dla ATMEGA32 i niestety raz działa raz nie, gdy nie działa wyskakują mi następujące błędy:
    Blad:1 Odp:255
    lub
    Blad:3 Odp:1
    czasem
    Blad:5 Odp:1


    Przerobiłem konfiguracje portów czyli
    Config Portb = &B10111111 'dla ATMEGA32
    Config Portc = &B00001010
    Config Portd = &B11100010

    Portb = &B11111111 'dla MEGA32

    Portc = &B11110101
    Portd = &B00011101

    dodatkowo zmieniłem w kodzie dla ASM w dwóch miejscach z porb,2 na 4 (bo ATMEGA32 na pinie 4 ma SS, chyba tak ma być bo bez tego wogóle brak było komunikacji )
    1_cs_on: 'gdy CS jest niski to mozna wysylac komendy
    sbi portb,4 'pin CS karty w stan niski / INWERSJA !!

    2_cs_off: 'wysoki CS oznacza koniec transmisji
    nop
    nop
    cbi portb,4 'pin CS karty w stan wysoki / INWERSJA !!

    Niestety kompletnie nie znam się na ASM, dlatego proszę o pomoc (szczególna prośba do Saabotaz, twoja wiedza jest wielka) co należny jeszcze zmienić aby zaczęło to działać stabilnie dla ATMEGA32

    Pozdrawiam
    Lolor

    0
  • #9 09 Kwi 2014 14:08
    30402
    Użytkownik usunął konto  
  • #10 09 Kwi 2014 18:48
    lolor
    Poziom 11  

    Witam
    -Ta sam karta działa OK na Atmega8 jest to MicroSD 1GB
    -zszedłem z Q=10MH do 4Mhz bez zmian
    -pod Atmege32 po kolejnych próbach podpinałem ten sam interfejs co do Atmega 8 i bez zmian
    -napięcie jest stabilne, kondensatory na wejściu i wejściu(elektrolit +ceramik)
    -niestety nie mam starszych kart, sam interfejs jest OK ponieważ działa OK na Atmega8

    Popróbuje jeszcze z Q=1Mh

    Saabotaz dzięki za zainteresowanie

    Lolor

    0
  • #11 09 Kwi 2014 19:19
    30402
    Użytkownik usunął konto  
  • #12 12 Kwi 2014 11:12
    lolor
    Poziom 11  

    Na razie nie mam jeszcze własnego programu zacząłem od prób na twoim programie.
    Interesowała mnie szybkość odczytu z karty, ten sam kod kompiluje pod M8 i M32.
    W programie zapisuje jeden sektor i potem odczytuję 365 sektorów.
    Zwiększyłem hwstack bez zmian
    Nie próbowałem jeszcze zejść do 1MHz (nie zdążyłem kupić), ale na płytce od Atmega8 z tym samym kodem pracuje mi OK na prawie 7MHz
    Muszę sobie jeszcze kupić jakąś starszą karte

    Poniżej kod, bez sam

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    [/code]

    Pożyczyłem starszą kartę 512MB jak na razie wszystko na M32 dział OK, być może M32 nie lubi się z moją karta 1GB

    Pozdrawiam
    Lolor :wink:

    0
  • #13 16 Kwi 2014 18:11
    30402
    Użytkownik usunął konto  
  • #14 16 Kwi 2014 19:05
    lolor
    Poziom 11  

    Na wewnętrzny RC nie wpadłem.

    Znalazłem kartę 2G, która dział bardzo stabilnie na mnożnik128 i Q=10MHz, robiłem tez próby z dzielnikiem 64, ale czasem wyrzucało błędy

    Dzięki za pomoc

    Pozdrawiam
    Lolor

    0
  • #15 15 Lut 2015 14:54
    lolor
    Poziom 11  

    Saabotaz witam ponownie,
    Po dłuższej przerwie wracam do tematu, używam w programie DCF77, który przy kompilacji standardowo rezerwuje adresy od 96-142 w twoim programie od tego adresu rozpoczyna się bufor i kolejne zmienne

    Code:
    Dim Bufor(512) As Byte At &H60  
    
    Dim Blad As Byte At &H260
    Dim Adres As Long At &H261
    Dim Komenda As Byte At &H265
    Dim Odpowiedz As Byte At &H266


    Ja w swoim programie chciałbym zdefiniować tak
    Code:

    Dim Bufor(512) As Byte At &H273                             'dec  od 627   do 1139
    Dim Blad As Byte At &H473
    Dim Adres As Long At &H474
    Dim Komenda As Byte At &H478
    Dim Odpowiedz As Byte At &H479                              'dec 1145

    Zmieniłem w asm jak poniżej
    Code:

    22_czytaj_blok:
    ldi r22,&H04                                    'powtorze petle 4 razy
    ldi r27,&H00                                    'ustawiam adres w pamieci dla tablicy 512 bajtow
    ldi r26,&H273               było &H60      'w ktorej przechowam odczytane dane / zmienna BUFOR

    i
    Code:

                32_zapisz_blok:
                ldi r22,&H04                                    'powtorze petle 4 razy
                ldi r27,&H00                                    'ustawiam adres w pamieci dla tablicy 512 bajtow
                ldi r26,&H273               było &H60      'zmiennej BUFOR z ktorej bede czytal dane do zapisu


    Gdzie należałoby jeszcze pozmieniać aby to zadziałało, bo teraz nie działa :cry:

    Z góry dziękuję za pomoc
    Lolor

    0
  • #16 19 Lut 2015 21:50
    lolor
    Poziom 11  

    Witam
    Chyba już znalazłem rozwiązanie, dość proste przy definicji w pierwszej kolejności definiuję zmienną bufor(512) potem DCF77 i wszystko jest OK :D

    Code:

    Dim Bufor(512) As Byte At &H60
    Dim Blad As Byte At &H260                                 
    Dim Adres As Long At &H261                               
    Dim Komenda As Byte At &H265                             
    Dim Odpowiedz As Byte At &H266                                                        'dec 1145

    Config Dcf77 = Pind.2 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 1 , Updatetime = 28 , Switchpower = 0 , Secondticks = 5


    Pozdrawiam
    Lolor

    0
  • #17 19 Lut 2015 22:49
    30402
    Użytkownik usunął konto  
  • #18 20 Lut 2015 17:24
    lolor
    Poziom 11  

    Saabotaz
    Dzięki za wyjaśnienie, miałem Cię pytać dlaczego moje zmiany, nie działały.
    Teraz jest wszystko jasne. :D

    Pozdrawiam
    Lolor

    0