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.

[SD][ATMEGA8][C] - Petit fatFS - szkielet programu.

splawik00 30 Maj 2013 01:27 3411 14
  • #1 30 Maj 2013 01:27
    splawik00
    Poziom 23  

    Witam.
    Meczę się już kilka dni z Petit fatFS na Atmega8.
    Pobrałem przykład na Attiny85 ze strony http://elm-chan.org/fsw/ff/00index_p.html
    Stworzyłem w AtmelStudio 6 nowy projekt (Atmega8) i dodałem biblioteki które zamieszczam w załączniku.
    W pliku suart.S zmieniłem wpis

    Kod: c
    Zaloguj się, aby zobaczyć kod

    na
    Kod: c
    Zaloguj się, aby zobaczyć kod

    żeby mieć transmisję na 19.2kbps. Procesor chodzi na wewnętrznym kwarcu 8MHz.
    Nie mogę zrozumieć tego wpisu
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Procek Attiny85 ma być niby podłączony w taki sposób
    [SD][ATMEGA8][C] - Petit fatFS - szkielet programu.
    Ale czy tu nie ma błędu? Skoro PB.0 to MOSI to częmu podłączony jest do DO w karcie, a PB.1 (MISO) do DI karty? Nie powinno być na odwrót?
    Co w ogóle konfiguruje ten wpis
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czy SPI? Co oznacza ten komentarz w pierwszej linii?
    Jak zmienić ten wpis, żeby działał z Atmega8? I czy nie powinno być najpierw DDRB =, a później PORTB = ?

    Dodam, że Atmegę i kartę oraz układ FT232 zasilam 3,3V i karta jest podłączona bezpośrednio
    [SD][ATMEGA8][C] - Petit fatFS - szkielet programu.
    Komunikacja UART pinami PD.0 i PD.1 (wiadomo :D).

    Próbuję skompilować program i wyskakują błędy.
    [SD][ATMEGA8][C] - Petit fatFS - szkielet programu.

    Proszę o wyrozumiałość, gdyż dopiero zaczynam z C. Niestety w internecie nie znalazłem kompletnie nigdzie kodu na Atmega8, który by się skompilował bez błędów. Poza tym wcale nie jest tak prosto znależć kompletny przykład obsługi karty SD.

    Jeżeli chodzi o kartę to mam microSD 2GB (+ adapter na SD) oraz drugą microSDHC 4GB (+ adapter na SD). Obie sformatowane na FAT32 i jednostka alokacji 512B.

    Kod w załączniku.

    0 14
  • #2 30 Maj 2013 15:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    Typy prog_cośtam nie są obecnie wspierane. Aby to odblokować należy zdefiniować symbol __PROG_TYPES_COMPAT__ we właściwościach projektu. Pamiętaj też, że ATMega8 nie ma wewnętrznego kwarcu, posiada generator, ale jego stabilność jest kiepska, jeśli myślisz o jego wyokrzystanu do transmisji UART to raczej o tym zapomnij. Z drugiej strony FT232 ma możeliwość wyprowadzenia zegara do taktowania MCU.
    Z trzeciej strony po co FT232:
    http://mikrokontrolery.blogspot.com/2011/03/X...emulacja-portu-szeregowego-rs-232-na-USB.html

    0
  • #3 30 Maj 2013 16:07
    splawik00
    Poziom 23  

    No to zamienię na zewnętrzny kwarc 8MHz. Nie widzę sensu, aby kupować Xmegę a obecnie używany układ FT232 wywalić. Tak równiez będzie działać, ja tylko chcę obsłużyć SD w ramach nauki. Może jak będę to kiedyś wykorzystywał w projekcie to pomyślę nad użyciem bezpośredniej emulacji USB na procku.

    tmf napisał:
    Aby to odblokować należy zdefiniować symbol __PROG_TYPES_COMPAT__ we właściwościach projektu.


    Mógłby kolega napisać w jaki sposób to zrobić? Ledwo zaczynam w C, wcześniej pisałem tylko w BASCOM, dlatego nie wiem jeszcze wielu rzeczy.

    0
  • Pomocny post
    #4 30 Maj 2013 18:56
    Marek_Skalski
    Moderator Projektowanie

    Podłączenie karty na rysunku z Tiny85 jest błędne. Twoja propozycja jest prawidłowa, ale brakuje rezystorów podciągających do Vcc (typ 10k przynajmniej dla linii !CS, vide LED w Tiny85).
    Komentarz to opis konfiguracji poszczególnych linii portu:
    H - wyjście w stanie wysokim,
    L - wyjście w stanie niskim,
    u - wejście z pull-up'em,
    z - wejście bez pull-upa.
    Ponieważ Tiny85 ma tylko 6 linii, stąd tylko 6 bitów. Ty masz port 8 bitów, ale używasz tylko 6, więc powinno działać.
    Kompletnych przykładów do obsługi kart SD/MMC jest cała masa, ale właśnie ze względu na różne potrzeby, szkoły, upodobania i humory twórców, większość z nich działa tylko w jednym wariancie wykonania. Musisz pamiętać, że pełny standard SD jest dostępny tylko dla zarejestrowanych członków organizacji (ok. 5k USD wpisowego i co rok kilka tysięcy USD za korzystnie ze znaku + update specyfikacji). Standard MMC jest oficjalnie ogólnodostępny, ale to też nie do końca jest prawda. Na razie każda karta musi obsługiwać komunikację w trybie SPI, przy ograniczeniu zegara do max. 26MHz (nieosiągalne w uC 8 bitowych), co oznacza akceptowalną prędkość transmisji dla audio lub plików tekstowych. Dla obrazu to już niestety dramat. Zastanów się do czego potrzebujesz kart(y), bo być może lepiej od razu zacząć naukę i tworzenie docelowego urządzenia na innym kontrolerze. Atmega8 to już dzisiaj zabytek.

    0
  • #5 30 Maj 2013 22:09
    splawik00
    Poziom 23  

    Chodzi mi tylko o prostą obsługę karty SD, np. zapis temperatury do .txt co godzinę itp. Czy za pomocą tego Petit fatFS'a mógłbym obsłużyć również karty SDHC?
    Konfiguracja portów dla Atmegi8 to chyba:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale co z drugą linią? MISO ma mieć pull-up? MOSI, SCK, SS w jakich stanach początkowych?

    Nadal nie mogę rozwiązać problemu z błędami przy kompilacji z tym __PROG_TYPES_COMPAT__ Jak to naprawić?

    0
  • Pomocny post
    #6 30 Maj 2013 22:39
    Marek_Skalski
    Moderator Projektowanie

    W kwestii podciągania to tak:
    1. Linie SCK/MISO/MOSI - ogólnie nie potrzebują żadnych dodatków poza włączeniem pull-up w kontrolerze. Pracowało to z Atxmega256A3BU i Atxmega128A1U bez żadnych problemów.
    2. Linia !CS/DAT3 - After power up, this line is input with 50Kohm(+/-20Kohm) pull-up (can be used for card detection or SPI mode selection). The pull-up may be disconnected by the user, during regular data transfer, with SET_CLR_CARD_DETECT (ACMD42) command.
    3. DAT1 i DAT2 w trybie SPI nieużywane - The ‘RSV’ pins are floating inputs. It is the responsibility of the host designer to connect external pullup resistors to those lines. Otherwise non-expected high current consumption may occur due to the floating inputs.

    DDRB = 0bxx1011xx
    PORTB = 0bxx0111xx
    czyli:
    SCK - out, 0
    MISO - in, 1 (pull-up)
    MOSI - out, 1
    !CS = out, 1

    Co do obsługi FAT to napisałem swoje procedury, z podwójnym buforem dla sektorów FAT, podwójnym buforem sektorów pliku, osobnym buforem dla sektora ROOT. W ten sposób mogłem wygodnie zapisywać dane z CPU do jednego bufora, a drugi był zapisywany na kartę ze wsparciem z DMA. Podwójny bufor FAT pozwalał mi wygodnie i bezpiecznie linkować pliki, gdy było przeniesienie z jednego sektora FAT do drugiego.
    Nie mam pojęcia czy 'Petit fatFS' obsłuży SDHC. Te karty są adresowane blokami, a nie bajtami i to jest spora różnica dla wszystkich programów do komunikacji z kartami pamięci.

    0
  • #7 31 Maj 2013 00:19
    splawik00
    Poziom 23  

    Zapomniałem dodać, że mam rezystory 51k na liniach MOSI i CS podciągnięte do 3,3V.
    Znalazłem takie coś:

    Cytat:
    6. Get error "unknown type name 'prog_char'"
    7. Change all prog_char's in xitoa.c and main.c to PROGMEM from what I found on the internet
    8. Compile again and get error "wide character array initialized from non-wide string"
    9. Add char in front of PROGMEM in "static const PROGMEM str[]" in main.c as per the internet again
    10. compile again and it works with 31 warnings but no errors.


    Zamieniłem wszystkie prog_char na PROGMEM i faktycznie błędy zniknęły, ale pojawił się ten "wide ..." (jak w cytacie). Nie wiem o co chodzi w tym co wytłuściłem powyżej. Gdzie dodać ten "char" ? Tak: (??)

    static const char PROGMEM str[]

    Bo jeżeli tak, to niestety pojawiają się inne błędy, których wcześniej nie było.

    [SD][ATMEGA8][C] - Petit fatFS - szkielet programu.

    0
  • #8 31 Maj 2013 09:28
    tmf
    Moderator Mikrokontrolery Projektowanie

    Przed miejscem załączenia pgmspace napisz:
    #define __PROG_TYPES_COMPAT__
    To powinno się co prawda robić w makefile, ale doraźnie jest ok. Z drugiej strony może warto by było lepiej poznać C zanim się weźiesz do tak rozbudowanego projektu? Bo zapewne wyjdzie jeszcze w międzyczasie wiele innych spraw.
    Twoje błędy biorą się zapewne z tego, że jak zdefiniujesz zmienną jako const char, to nie możesz jej bezpośrednio przekazać do funkcji, która jako argument przyjmuje char.

    0
  • #9 31 Maj 2013 09:37
    splawik00
    Poziom 23  

    Może rzeczywiście trochę się porwałem na skomplikowany projekt, ale myślałem, że będzie łatwiej. Niby gotowa biblioteka, a tu błędy :| No ale jak już zacząłem to chciałbym skończyć jakoś.
    Wie może kolega jak ma być z tym charem? Dawać, czy nie dawać?
    Po dodaniu #define __PROG_TYPES_COMPAT__ zarówno bez chara jak i z charem są błędy.

    0
  • Pomocny post
    #10 31 Maj 2013 10:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jeśli kompilujesz oryginalny projekt z __PROG_TYPES_COMPAT__ to nie powinieneś mieć błędów, a jedynie ostrzeżenia, że dany typ jest depreciated.
    Sama biblioteka nie ma błędów, po prostu w międzyczasie zmienił się kompilator, który obecnie jest bardziej restrykcyjny, a definiowanie atrybutu dla typu jest przypadkowym rozszerzeniem C dla gcc. Zmiany są kosmetyczne i polegają na zmianie typu prog_char na const char. Makro PROGMEM mam sens tylko przy definiowaniu zmiennej. W argumencie funkcji nie.

    0
  • #11 31 Maj 2013 20:33
    splawik00
    Poziom 23  

    Powróciłem do kodu z pierwszego postu, czyli oryginalnego. Zamieniłem wyjścia dla Atmegi8 jak w poście #6 oraz dodałem "#define __PROG_TYPES_COMPAT__" jak poniżej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pojawiają się takie błędy w pliku usi.s

    [SD][ATMEGA8][C] - Petit fatFS - szkielet programu.

    0
  • Pomocny post
    #12 31 Maj 2013 21:05
    tmf
    Moderator Mikrokontrolery Projektowanie

    Plik s to plik z kodem assemblerowym. Być może kod ten był pisany na inny procesor. Trzeba by zobaczyć jak wygląda, aby powiedzieć czym te błędy są spowodowane. Najpewniej używaniem instrukcji, która nie jest dostępna w ATMega8 lub jakąś błędną stałą.

    0
  • #13 31 Maj 2013 21:17
    splawik00
    Poziom 23  

    No to jest kod dla Attiny85.

    W usi.S te 2 linie są błędne:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Tylko co w nich jest nie tak? Asemblera kompletnie nie znam, więc sam sobie nie poradzę. :cry:

    constant value required
    number must be positive and less than 64

    0
  • Pomocny post
    #14 31 Maj 2013 23:22
    tmf
    Moderator Mikrokontrolery Projektowanie

    Błędne są nazwy rejestrów. Ale poprawnie tego nie jest banalne - ATTiny85 korzysta z interfejsu USI, którego nie ma ATMega8. Ona ma USART, wymagane zmiany w kodzie będą znacznie większe niż tylko zmiana nazw rejestrów. Także albo ściągnij wersję dla swojego procka, alb temat sobie odpuść do czasu aż nie poznasz bliżej c, assemblera i przede wszystkim używane procki.

    0