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.
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...
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...
