logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVRDOS - problem z kartami-nie współpracuje

monokrysztal12 23 Sie 2011 02:17 2150 13
  • #1 9852979
    monokrysztal12
    Poziom 13  
    Witam.
    Robię układ oparty na karcie SD, mikroprocesorze ATMEGA32. Program napisany w Bascomie, użyte zostały biblioteki AVR-DOS. MA on odtwarzać pliki WAV z karty, do testów używam tego programu znalezionego w internecie.


    'dźwięk 32khz / 8 bit / mono / wav
    'do każdego nagranego pliku dodać z przodu pliku 10% czasu utworu ciszy potrzebej na załadowanie pliku.
    
    
    $regfile = "M32Def.dat"
    $crystal = 16000000
    $external Waitms
    $baud = 9600
    
    Const Cmmc_soft = 0                                         'SPI HARDWARE
    
    #if Cmmc_soft = 0
    
    ' --------- Start of Section for HW-SPI ----------------------------------------
    
       ' define Chip-Select Pin
       Config Pinb.4 = Output                                   ' define here Pin for CS of MMC/SD Card
       Mmc_cs Alias Portb.4
       Set Mmc_cs
    
       ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
       Config Pinb.7 = Output                                   ' define here Pin of SPI SS
       Spi_ss Alias Portb.7
       Set Spi_ss                                               ' Set SPI-SS to Output and High por Proper work of
                                                      ' SPI as Master
    
       ' HW-SPI is configured to highest Speed
      Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1       'Config Spi = Soft , Din = Pinb.3 , Dout = Portb.2 , Ss = Portb.0 , Clock = Portb.1
       'Spsr.0 = 1                                               ' Double speed on ATMega128
       Spiinit                                                  ' Init SPI
    
    ' --------- End of Section for HW-SPI ------------------------------------------
    
    #else                                                       ' Config here SPI pins, if not using HW SPI
    
    ' --------- Start of Section for Soft-SPI --------------------------------------
    
       ' Chip Select Pin  => Pin 1 of MMC/SD
       Config Pinb.4 = Output
       Mmc_cs Alias Portb.4
       Set Mmc_cs
    
       ' MOSI - Pin  => Pin 2 of MMC/SD
       Config Pinb.5 = Output
       Set Pinb.5
       Mmc_portmosi Alias Portb
       Bmmc_mosi Alias 5
    
       ' MISO - Pin  => Pin 7 of MMC/SD
       Config Pinb.6 = Input
       Mmc_portmiso Alias Pinb
       Bmmc_miso Alias 6
    
       ' SCK - Pin  => Pin 5 of MMC/SD
       Config Pinb.7 = Output
       Set Pinb.7
       Mmc_portsck Alias Portb
       Bmmc_sck Alias 7
    
    ' --------- End of Section for Soft-SPI ----------------------------------------
    
    #endif
    
    ' ========== End of user definable range =======================================
    
    Spiinit
    ' Error
    Const Cperrdrivereset = 225                                 ' Error response Byte at Reset command
    Const Cperrdriveinit = 226                                  ' Error response Byte at Init Command
    Const Cperrdrivereadcommand = 227                           ' Error response Byte at Read Command
    Const Cperrdrivewritecommand = 228                          ' Error response Byte at Write Command
    Const Cperrdrivereadresponse = 229                          ' No Data response Byte from MMC at Read
    Const Cperrdrivewriteresponse = 230                         ' No Data response Byte from MMC at Write
    Const Cperrdrive = 231
    Const Cperrdrivenotsupported = 232                          ' return code for DriveGetIdentity, not supported yet
    Waitms 1                                                    ' Wait some time before initialising MMC/SD
    Dim Gbdriveerror As Byte                                    ' General Driver Error register
    Dim Gbdriveerrorreg As Byte                                 ' Driver load Error-Register of HD in case of error
    Dim Gbdrivestatusreg As Byte                                ' Driver load Status-Register of HD on case of error
    Dim Gbdrivedebug As Byte
    $lib "MMC.LIB"                                              ' link driver library
    $external _mmc
    Gbdriveerror = Driveinit()                                  ' Init MMC/SD Card
    
    
    Dim Bufor As Byte
    Dim B As Byte
    Dim S As String * 8
    Dim Utwor As String * 5
    
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    
    Pwm1a = 0
    Start Timer1
    
    Config Clock = soft
    Enable Interrupts
    
    $include "CONFIG_AVR-DOS.Bas"
    
    
    
    
    
    cli
    B = Drivecheck()
    ' Gbdriveerror = Driveinit()
    B = Initfilesystem(1)
    S = Dir( "*.wav")
    
    'Open "COM1:" For Binary As #5                               'otwarcie uart
    
    
    
    
    
    'Pętla główna programu
    Do
    
    Utwor = Inkey()
    Utwor = Chr(utwor)
    
    
      If Utwor = "a" Then
      S = "1.wav"
      Gosub Play
      End If
    
      If Utwor = "b" Then
      S = "2.wav"
      Gosub Play
      End If
    
      If Utwor = "c" Then
      S = "3.wav"
      Gosub Play
      End If
    
      If Utwor = "d" Then
      S = "4.wav"
      Gosub Play
      End If
    
      If Utwor = "e" Then
      S = "5.wav"
      Gosub Play
      End If
    
      'itd  , itd
    
    
    
    Loop
    
    
    
    
    
    Play:
    
       If Len(s) < 3 Then Return
    
       Pwm1a = 0
    
       Open S For Binary As #2
         Waitms 1
    
            Do
    
              Get #2 , Bufor
              Pwm1a = Bufor
    
    
    
            Loop Until Eof(#2) <> 0
    
    
    
    
            Pwm1a = 0
            Close #2
            S = ""
    
    Return 


    Układ zmontowałem na płytce stykowej, karta SD zasilana ze stabilizatora 3,3V. Mikroprocesor zaś - 5V. Na liniach, przez które wędrują dane z uP do karty - dzielniki napięcia oporowe - z 5V dają 3,3. Linia powrotna danych z karty - bezpośrednio podłączona do uC.

    Układ testowałem na 3 kartach - tj. 32MB, 1GB, 2GB. z karty 32MB moge odczytać rozmiar owej karty, inne parametry oraz zapisać plik. Jednak przy próbie odczytu - program się zawiesza.

    Zaś z karty 1GB - mogę zainicjować, sprawdzić - rozmiar, wolne/zajęte miejsce itp (tak jak poprzednio) i odczytywać też mogę, tylko przy odczycie WaV po ok. 3 sek. program się zawiesza. Dodam ,że przy próbie zapisu pliku plik jest zawsze pusty (w karcie 32 MB zapisywało normalnie do pliku), nawet utw. jako 2 (bo w AVRDOS jest błąd, że 1 plik jest zawsze pusty)

    Na karcie 2GB - wywala AVRDOS błędy: 227. Dodam, że kiedyś owa karta pracowała z AVRDOSEM OK - dla krótkich plików muz. było ok, lecz przy dłuższych - program popadał w martwą pętle (choć 1 raz udało się plik wav odtw. w całości, lecz po włożeniu do PC, trzeba było kartę formatować bo AVRDOS rozwalił system plików.
    Karty są chyba ok podłączone, bo przy tych 2 pierwszych sprawdzenie przebiega prawidłowo.

    Oczywiście napięcie całości jest dobrze filtrowane, są przy uC i karcie kondensatory, wersja BASCOMA użyta do kompilacji kodu 2.0.5.0, AVRDOS 5.5, ustawienia portów są prawidłowe. Co może być tego przyczyną?

    Ps
    -dodam, że kiedyś to wszystko cudem działało, aż do momentu przeprojektowania układu na płytce stykowej.
    -zasilałem wszystko 1 napięciem 3,9V - bez skutku
    -Kiedyś działało, lecz czasem plik odczytywało i tym samym uszkadzało jednocześnie... program też dziwnie się wieszał w środku muzyki...
    -linie łączące procesor-karta są krótkie
    - przepraszam za stylistykę, ale jest już późno...
  • #2 9853411
    maly_elektronik
    Poziom 23  
    Pewnie zbyt krótko program czeka na CRC i dlatego wychodzą takie cuda :)
    Spróbuj zmniejszyć prędkość spi pracującego z kartą. Nie da się odczytując pliku go uszkodzić (karta pracuje w trybie odczyt lub zapis nigdy razem). Spróbuj jeśli to możliwe podmienić bibliotekę do obsługi kart SD i ewentualnie pozmieniaj trochę kod aby wszystko dobrze współpracowało (wystarczy odczyt karty sd ze stroni Urlicha Radig'a lub elm-chan'a [fatfs])

    Pozdrawiam maly_elektronik
  • #3 9854267
    monokrysztal12
    Poziom 13  
    Podmieniłem bibliotekę na inną wersję - nic nie dało. Jeżeli chodzi o prędkość transmisji SPI, to gdzie to zrobić? Dodam też, że ta 32MB karta jest bardzo powolną kartą (z nią działa tylko zapis).
    Używam SPI sprzętowego.

    Dodano po 16 [minuty]:

    zmieniłem prędkość, dodałem kod (karta pracuje z pr. 1MHz)
    Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 16  


    lecz też nic nie dało.

    Dodano po 11 [minuty]:

    A teraz to wogle, po tych zmianach (tj. podmianie bibliotek, zegar) działa tylko karta 32MB, przy innych kartach pokazuję błędy 17, 227. Oczywiście wszystkie karty są sprawne - sprawdzałem na PC. NIe wiem co już robić...
  • Pomocny post
    #4 9854433
    maly_elektronik
    Poziom 23  
    Poszkaj w opicie biblioteki avrdos co oznacza komunikacj 17 i 257 :)
    I napisz :)
    Gdybyś pisał w C podesłałbym Ci moją bibliotekę do kart SD (próbowałem na wielu i działa poprawnie).
    Sam gdy szukałem bibliotek do kart SD/MMC miałem problem bo nie chciały się inicjować :)
  • #5 9854460
    monokrysztal12
    Poziom 13  
    17 -Sektor zerowy karty nie jest sektorem MBR
    227 - Error response Byte at Read Command

    to oznaczają te kody
  • #6 9854560
    maly_elektronik
    Poziom 23  
    W pierwszym błędnie masz odpowiedź :)
    Karta która ma 32MB jest na tyle mała na 99% przypadków jest sektor MBR jest pierwszym sektorem karty natomiast przy większych pojemnościach ten sektor może (i w większości przypadku jest) zupełnie dalej.

    Możesz to zobaczyć przy pomocy WinHEX'a. Musisz dopisać procedurke szukającą tego pierwszego sektora (prostą pętla która będzie porównywać określone bajty sektora które są charakterystyczne dla MBR'a) i wtedy wpisać tą wartość do zmiennej która przechowywuje tą informacje.

    P.S Bajty charakterystyczne MBR'a znajdziesz w googlach (w formie tablicy budowy sektora mbr z opisem większości bajtów)
  • #7 9854587
    monokrysztal12
    Poziom 13  
    Tylko dlaczego jak odczytuję tę kartę 32MB (program-1szy post) to program się zawiesza?
    Nie wiem dlaczego kiedyś wszystko pracowało OK?
    Zaraz zobaczę z tym sektorem startowym.
  • #8 9854790
    Mundi1970
    Poziom 24  
    Dziwne to jest to że w ogóle coś działa ;). Inicjalizacje karty SD masz w komentarzu:

    B = Drivecheck() - można usunąć
    Gbdriveerror = Driveinit() - to jest inicjalizacja karty

    Jeżeli wychodzą błędy przy inicjalizacji karty, możesz spróbować tej konfiguracji SPI:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    a po wykonaniu inicjalizacji karty Driveinit() przełączyć SPI na szybszy tryb:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #9 9855035
    monokrysztal12
    Poziom 13  
    Więc tak, odkomentowałem ten fragment kodu (wcześniej nie zauważyłem), podłączyłem i układ działa tak:
    dla karty 32MB wszystko jest już ok, dźwięk jest odtw. jedynie po ok. 9 sekundach odtw. program się zawiesza.

    dla karty 1GB - inicjuje się, program czeka na wybór pliku do odtw. Gdy wybiorę, kawałeczek - gdzieś 100ms pliku jest grane, potem wszystko staje.

    dla karty 2GB cały czas wywala błąd 227 mimo że kiedyś ona z avrdosem działała.

    Dodam, że jak plik wav jest krótki, to z kartą 32MB działa wszystko ok, większy niż te 8 sekund - zawiesza się

    Karta 2GB nie inicjuje się nawet jak zmniejszę prędkość...

    Dodano po 11 [minuty]:

    w tej 32MB po tych 9 s przerywa tak, jakby program pobrał z karty do bufora dane, następnie karta została wyjęta/tranzsmisja z nią została przerwana, a w głośniku co każdy obieg pętli słychać zawartość owego bufora

    Dodano po 17 [minuty]:

    Dodam, że ten czas po którym sie zawiesza zależy od pliku dzwiękowego. Widocznie coś jest ładowane do bufora i powoduje problem
  • #10 9855170
    Mundi1970
    Poziom 24  
    Wypróbuj tą konfiguracje SPI jaką podałam. Podobno jest to jedyna słuszna konfiguracja. :D
  • #11 9855182
    monokrysztal12
    Poziom 13  
    Niestety nic nie daje...

    Dodano po 1 [minuty]:

    Jak dodałem taki fragment:
    Cytat:
    Do
    Toggle Stan


    If Stan = 0 Then
    Get #2 , Bufor2
    Pwm1a = Bufor
    Elseif Stan = 1 Then
    Get #2 , Bufor
    Pwm1a = Bufor2
    End If

    Loop Until Eof(#2) <> 0


    to gra więcej niż 2x dłużej i sie zawiesza.

    Dodano po 42 [minuty]:

    Dla każdej innej piosenki jest pewien charakterystyczny, ten sam moment, co się zawiesza

    Dodano po 23 [minuty]:

    Już nie wiem, teraz karta Sd 32M przestała działać, tj inicjuje się, ale muzyka gra tylko 100ms tak jak kiedys w karcie 1GB. Teraz zaś karta sd 1GB działa, i to nawet się nie zawiesza - muzyka dograła do końca. nie wiem co już jest :D

    edit

    niestety po wgraniu do karty nowego wav-a znowu klapa... jak widać raz działa poprawnie, ale już 2-gim razem to nie

    Dodano po 16 [minuty]:

    Może dać jakiś bufor z 3,3 na 5V żeby zamieniał, na linii dannych z karty do uC?

    Dodano po 1 [godziny] 20 [minuty]:

    Co więc może być?

    Dodano po 1 [godziny] 28 [minuty]:

    Czy avr dos poprawnie obsługuje karty SD czy tylko MMC?

    Dodano po 1 [godziny] 57 [minuty]:

    znalazłem możliwą[?] przyczynę - gdy usunąłem funkcję eof(#2) służącą do sprawdzania końca pliku - wszystko działa. Tylko nie wiem teraz, jak sprawdzić czy jestt już koniec pliku bez tej funkcji, albowiem jeżeli ta funkcja w dowolnym przypisaniu zostanie wywołana - program staje.
  • Pomocny post
    #12 9857937
    maly_elektronik
    Poziom 23  
    Czy muzykę na kartę wgrywasz jako fat16/32 czy po prostu po kolei sektorami :?:
    Jeśli to fat16 lub 32 bo w strukturze każdego pliku w RootDirectry możesz odczytać jego rozmiar :)
    Ale nie tak się sprawdza czy plik się skończył (mówię o fat) :) Aby wiedzieć że plik się kończy tzn pozostał jego ostatni klaster (najczęściej 8sektorów czasem więcej) to w tablicy alokacji FAT znajduje się wartość większa bądź równa 0x0FFFFFF8 :) Ale jeśli nie zajmowałeś się nigdy fatem to będzie Ci cieżko to zrozumieć (wiem po sobie) :)

    Wg avr-libc:
    Cytat:
    The AVR platform (currently) doesn't contain an eof function.
  • #13 9859920
    monokrysztal12
    Poziom 13  
    Dodałem parametry związane z pamięcią SRAM, tj -

    $hwstack = 128
    $swstack = 64
    $framesize = 64

    Program ruszył. Odtwarza już nawet długie utwory bez zawieszania się, działa z funkcją EOF i prawidłowo rozpoznaje koniec pliku. Zobaczymy jak to będzie dalej działało...
  • #14 9863475
    monokrysztal12
    Poziom 13  
    Wszystko jest ok, tylko pojawiają mi się takie błędy - mogę i z nimi dokończyć kompilację, ale wolę się upewnić, co oznaczają.

    Błędy:

    AVRDOS - problem z kartami-nie współpracuje

    Dodano po 12 [minuty]:

    błąd ten oznacza "błędny znak", tylko ja tego znaku nigdzie nie widzę ani pomyłki
    Linia błędu jest zawsze ostania, cokolwiek tam bym umieścił

    Dodano po 14 [minuty]:

    bład powoduje polecenie - $external _mmc . Dlaczego?

    Dodano po 2 [minuty]:

    Dyrektywa $EXTERNAL

    Przeznaczenie:

    Informuje kompilator by dołączył procedury lub funkcje w języku asembler z biblioteki.

    Dodano po 14 [minuty]:

    Trzeba było dodać Const Cmmc_soft = 0 i wszytko ok

    Dodano po 1 [godziny] 55 [minuty]:

    czy taka regulacja poziomu głośności jest dobra?


    Do
    
    Get #2 , Bufor                'Bufor
    
    If Volume <= Bufor Then
    Bufor = Bufor - Volume
    End If
    
    Pwm1a = Bufor
    
    Loop Until Eof(#2) <> 0
REKLAMA