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

ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .

adambehnke 11 Kwi 2010 13:32 92814 328
  • #241
    Tomekddd
    Poziom 23  
    Dzięki, po testach dochodzę do wniosku że jak na tak prostą metodę to gra świetnie :D porównywalnie do gorszej jakości odtwarzaczy mp3.
    Dziękuje również że udostępniłeś pliki tego projektu bo niestety sam bym programu nie napisał.
  • Relpol przekaźniki
  • #242
    adambehnke
    Poziom 24  
    Hmm , wystąpiła u mnie bardzo dziwna sprawa. Wykonałem nową płytkę do swojego systemu.Jest bardzo rozbudowana i wyposażona w kilka procesorów. I otóż sprawa wygląda tak. Całość zasilana jest z 5V (dobrze odfiltrowane i stabilne napięcie , karty pamięci MicroSD (jest ich dwie) zasilam ze stabilizatora 3,3V (także porządnie odfiltrowane i stabilne) .Połączenie karty pamięci z procesorem oczywiście wykonałem na dzielnikach rezystorowych (zawsze tak robię i nie było problemów) , z tym że zawsze używałem w dzielnikach wartości rezystorów 3,3k i 1,8k . Lecz tym razem akurat zabrakło mi rezystorów smd 3,3k i zastosowałem 3,15k. I z moich dwóch kart pamięci działa tylko jedna (podpięta pod atmegę 32) , niestety druga karta podpięta pod atmegę 2560 nie działa. SPI mam sprzętowe , procesor się programuje i daje odczytywać , program się wykonuje , połączenia elektryczne sprawdzone i "przedzwonione" a karta nie odpowiada. Fusbity także ustawione poprawnie (ustawione tak samo jak w kilku innych moich działających projektach) . Czy winne mogą być te zastosowane rezystory 3,15k?

    A oto fragment połączeń z kartą MicroSD:

    ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .


    Dodam że identycznie podłączone mam drugą kartę pamięci pod Atmega32 i ta działa bezbłędnie. Oczywiście sprawdzałem czy nie jest uszkodzona sama karta pamięci i dla testów sprawdzałem także kilka innych.
    Niestety nie mam w posiadaniu oscyloskopu i nie mam jak sprawdzić co dzieje się na SPI.
  • #243
    atom1477
    Poziom 43  
    Pokaż raczej podłączenia do procesora.
  • #244
    adambehnke
    Poziom 24  
    To może umieszczę cały schemat pierwszej płytki urządzenia.

    ps.Nie sugerujcie się serią kondensatorów przy stabilizatorach napięcia. Na PCB są porozmieszczanie tam gdzie trzeba.

    Karta pamięci przy Atmega32 pracuje poprawnie (jest to odtwarzacz Wav i nie ma z nim problemu) ,natomiast karta przy A2560 nie działa. Tzn ładuję z niej obrazki na LCD lecz niestety odczytu nie ma.

    ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .
  • Relpol przekaźniki
  • #245
    atom1477
    Poziom 43  
    Chm. Wygląda to dobrze. Ale jakieś przebiegi na liniach MOSI/MISO/SCK/SS są?
  • #246
    adambehnke
    Poziom 24  
    Zapewne już Wiesz że jest to układ z którym walczyliśmy wcześniej do ładowania grafiki z karty. Korzystam z tego samego programu co poprzednio (działa w innym module poprawnie) i nie miałem z nim problemu. Tutaj po prostu nie mam odczytu z karty wcale. I nie jest to wina programu. Problem musi leżeć w elektronice. Jedyna zmiana jaką wprowadziłem w porównaniu z innymi modułami to zmiana wartości trzech rezystorów z 3,3k na 3,15k. Ale właśnie na takich rezystorkach pracuje karta przy A32 i działa poprawnie. Niestety nie mam oscyloskopu aby przyjrzeć się stanom na liniach przy karcie. Sprawdzałem w stanie "spoczynku" mutimetrem napięcia na każdej linii zarówno w jednym złączu karty Sd jak i drugim i są takie same. Podczas pracy programu widać że coś się dzieje na tych liniach. Dla testów podpięłem nawet pełnowymiarową kartę SD i także nie działała. Natomiast do starego urządzenia poprzez przejściówkę podłączyłem kartę MicroSd (bo myślałem że może nie chce pracować urządzenie z mini kartą) i działała poprawnie.
  • #247
    atom1477
    Poziom 43  
    No ale w poprzednim układzie miałeś ATMegę32.
  • #248
    adambehnke
    Poziom 24  
    No tak i tu także za audio odpowiada M32 która działa poprawnie. W sumie to powinienem napisać w temacie z grafiką z SD ale jakoś tu napisałem.


    ps. Właśnie znalazłem rezystorki 3k3 :D i to z dobre 300 sztuk. Wlutuję i napiszę jakie będą zmiany. Jedyny problem to zniszczone gniazdko MicroSD które w przypływie nerwów brutalnie usunęłem z płytki myśląc że może doszło do jakiegoś zwarcia pod nim :P . Ale wstawię na dzisiaj pełnowymiarowe dla testów.
  • #249
    atom1477
    Poziom 43  
    Ale mi chodzi o grafikę. Grafike miałeś na ATMega32. A tu masz na ATMega256.
  • #251
    atom1477
    Poziom 43  
    Acha. Czyli na ATMega256 już to testowałeś i to działało?
    Ale nie zmieniłeś tylko rezystorów. Masz całą inną płytkę. Masz jakieś zwarcie albo przerwę pewnie.
  • #252
    adambehnke
    Poziom 24  
    Tak działało.Fakt płytka jest inna i nowa .Co prawda robiona w satlandzie ale i oni mogą coś skopać. Sprawdzam ponownie ścieżki. A czy winne mogą być zbyt cienkie ścieżki (mam 5mils)? Najlepiej zaraz przetestuje cały port ,dam jakieś miganie ledami i napiszę co wyszło.
  • Pomocny post
    #253
    WOBI
    Poziom 19  
    a masz poprawna deklaracje SPI?
    Pisałem juz że powinno być jak poniżej, miałem taki problem że niektóre karty źle działały. Ten błąd ciągnie się we wszystkich konfiguracjach AVR-DOS.

    tak powinno być:

    Code:
    ' HW-SPI is configured to highest Speed 
    
      Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
       Spsr.0 = 1 
  • #254
    adambehnke
    Poziom 24  
    Tak , mam poprawione konfigurację i dzięki tym zmianom pracują wszystkie karty :)

    A z problemem właśnie się uporałem. Okazało się że jednak miałem przerwę .... ale nie na PCB a w mózgu :/


    Na starej płytce miałem gniazdo SD z detekcją włożonej karty , i w programie to wykrywałem w ten sposób:

    Code:
    Sd = Pinh.2
    
    If Sd = 0 Then
    A2 = Driveinit()
    A2 = Initfilesystem(1)
    End If


    Czyli jeśli nie było karty to pomijano inicjalizacje i tym samym zwiechę w tym miejscu w programie.

    Oczywiście na nowej płytce mam złącza MicroSD bez detekcji włożenia karty.Jednak program z uporem twierdził że nie ma włożonej karty gdyż pin detekcji "wisiał w powietrzu"......
  • #255
    androot
    VIP Zasłużony dla elektroda
    Te rezystory ~kilka kΩ w dopasowaniu napięć do karty SD to nieporozumienie. Przy 8MHz na SD_CLK przebiegi są mocno zniekształcone. Lepiej zmniejszyć te wartości 10x.

    Co zrobić, żeby player mniej szumiał? Mam ustawione fast PWM, ale może da się jeszcze zmniejszyć szum? Może zwiększyć częstotliwość PWM?
  • #256
    atom1477
    Poziom 43  
    Szum wynika z głębi bitowej która wynosi 8. Większa częstotliwość PWMa nie pomoże. Chyba że zwiększył być i częstotliwość próbkowania dźwięku. Ale wtedy ATMegia już raczej nie wyrobi z pobieraniem danych z karty SD.
  • #258
    atom1477
    Poziom 43  
    No niestety, ale to właśnie wina 8-miu bitów.
  • #259
    androot
    VIP Zasłużony dla elektroda
    Przy kwarcu 16 i 20MHz:
    Z kartą SD działa, z MMC nie :(
    Mimo, że MMC inicjalizuje się prawidłowo.
    Gbdriveerror zwraca 0.
    Mam tylko jedną MMC do testów.

    Robiłem też próby z kwarcem 24MHz i wtedy nie działa też na SD.
    Spowolniłem SPI do ok. 250KHz przy inicjalizacji, a potem przyspieszam do 12MHz (kwarc 24MHz).
  • #260
    sijkij2
    Poziom 9  
    Witam. Przeczytałem cały temat, ale nie jestem pewien jednej rzeczy...chodzi mi o naprawdę najprostrze rozwiązanie. więc wystarczy zrealizować ten schemat :
    ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .

    oraz zaprogramować ten kod podany na 5-tej stronie tematu:
    Code:
    '-------------------------------------------------------------------------------
    
    '-------------------------------------------------------------------------------
    '--------WAV PLAYER-----16kHz 8bit mono-----------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------

    '$PROG &HFF,&HDF,&HDF,&H00' generated. Take care that the chip supports all fuse bytes.

    '---PROCESOR--------------------------------------------------------------------
    $regfile = "M32Def.dat"
    $crystal = 16000000
    $hwstack = 128
    $swstack = 64
    $framesize = 64
    $baud = 38400                                               ' use baud rate
    '-------------------------------------------------------------------------------


    '---DEKLARACJE ZMIENNYCH--------------------------------------------------------
    Dim Timer1_licznik As Byte
    Dim Buffer(256) As Byte At 1024
    Dim Write_position As Byte
    Dim Read_position As Byte
    Dim Write_position_word As Word
    Dim S As String * 36
    Dim A As Byte
    Dim B As Word
    Dim Volume As Byte
    Dim Mix(2) As Integer
    Dim Mixx As String * 3
    Dim Vol_val As String * 10
    '-------------------------------------------------------------------------------


    '---MOJE ZMIENNE TESTOWE--------------------------------------------------------


    Dim Play As Integer                                         'START/STOP ODTWARZANIA
    Dim Plik As String * 30                                     'NAZWA PLIKU DO OTWARCIA

    'UART
    Dim Uart_flaga As Integer
    Dim Uart_dane As String * 30

    '-------------------------------------------------------------------------------


    '---TIMER 1---------------------------------------------------------------------
    On Timer1 Timer1_handler Nosave
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    '-------------------------------------------------------------------------------
    Pwm1a = 129

    '---PORTY-----------------------------------------------------------------------
    Config Porta = &B00000000                                   'nc
    Config Portc = &B00000000                                   'nc
    Config Portb = &B00000110
    Config Portd = &B00100110                                   'OCR1A = Output

    Porta = &B00000000                                          'nc
    Portc = &B00000000                                          'nc
    'Portb = &B00000000
    Portd = &B00000000




    '-------------------------------------------------------------------------------


    '---PLIKI ZEWNĘTRZNE I BIBLIOTEKI-----------------------------------------------
    $include "CONFIG_AVR-DOS.Bas"
    '-------------------------------------------------------------------------------


    '---ZEGAR-----------------------------------------------------------------------
    Config Clock = Soft
    '-------------------------------------------------------------------------------


    '---UART------------------------------------------------------------------------
    Config Serialin = Buffered , Size = 20 , Bytematch = 13     'KONFIGURACJA PRZERWANIA OD UART-A
    '-------------------------------------------------------------------------------


    '---WATCHDOG---------------------------------------------------------------------------
    Config Watchdog = 1024                                      'reset wystąpi po 1024ms = 1s
    '-------------------------------------------------------------------------------


    '---SPI-HW----------------------------------------------------------------------
    Const Cmmc_soft = 0                                         'SPI HARDWARE

       ' 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

    '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 700
    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
    '-------------------------------------------------------------------------------


    '---WŁĄCZENIE PRZERWAŃ-------------------------------------------------
    Enable Interrupts
    '-------------------------------------------------------------------------------


    '---SD-INICJACJA KARTY I SYSTEMU PLIKÓW-----------------------------------------
    'B = Drivecheck()
    Gbdriveerror = Driveinit()
    B = Initfilesystem(1)
    '-------------------------------------------------------------------------------


    '---USTAWIENIA WSTĘPNE----------------------------------------------------------

    Set Portb.0                                                 'podciągnięcie do vcc klawisza TEST

    Plik = "helo.wav"
    Play = 0
    '-------------------------------------------------------------------------------


    '***********************ODCZYT USTAWIENIA POZIOMU GŁOŚNOŚCI*********************
    Readeeprom Volume , 5
    If Volume > 250 Then Volume = 15
    If Volume < 0 Then Volume = 0
    '*******************************************************************************

    Print "ONLINE:" ; Volume ; Chr(13);

    '---URUCHOMIENIE WATCHDOG-A----------------------------------------------------------------------------
    Start Watchdog                                              'uruchamiamy układ watchdog
    '-------------------------------------------------------------------------------
    Clear Serialin



    '---PĘTLA GŁÓWNA PROGRAMU-------------------------------------------------------
    Do

    'klawisz TEST"
    If Pinb.0 = 0 Then
       Waitms 20
       Bitwait Pinb.0 , Set                                     ' jak puscisz przycisk to dalej wykonuje program
       Plik = "test.wav"
       Play = 1
    End If


    If Uart_flaga = 1 Then Gosub Zatrzymanie
    If Uart_flaga = 1 Then Gosub Dekoder                        'SPRAWDZANIE CZY ODEBRANE DANE SĄ POPRAWNE

    If Play = 0 Then Portb.1 = 0                                'Używam sobie tego podczas testów
    If Play = 1 Then Portb.1 = 1                                'Używam sobie tego podczas testów
    If Play = 0 Then Portb.2 = 1                                'Używam sobie tego podczas testów
    If Play = 1 Then Portb.2 = 0                                'Używam sobie tego podczas testów
    If Play = 1 Then Gosub Odtwarzacz                           'ZEZWOLENIE I SKOK DO ODTWARZANIA



    Reset Watchdog                                              'resetujemy watchdoga
    Loop
    '-------------------------------------------------------------------------------
    End                                                         'KONIEC PROGRAMU PRZY OPUSZCZENIU PĘTLI GŁÓWNEJ


    Zatrzymanie:

    'Zatrzymanie odtwarzania do czasu rozpoznania danych
       For Write_position_word = 1 To 256                       'czyszczenie bufora
       Buffer(write_position_word) = 128
       Next Write_position_word
       Disable Timer1                                           'zatrzymanie timera1
       Close #2
       Start Watchdog
    Return


    '---DEKODOWANIE ODEBRANYCH DANYCH Z UART-A--------------------------------------
    Dekoder:


    If Right(uart_dane , 4) <> ".wav" Then Goto Clp

       Plik = Uart_dane                                         'NAZWA PLIKU DO ODTWORZENIA
       Play = 1                                                 'ZEZWOLENIE NA SKOK DO ODTWARZANIA

       Clp:
       Uart_dane = ""
       Uart_flaga = 0
       Clear Serialin

    Return
    '-------------------------------------------------------------------------------



    '---ODTWARZACZ------------------------------------------------------------------
    Odtwarzacz:
    Stop Watchdog

    Open Plik For Binary As #2

    Pwm1a = 129

    For Write_position_word = 1 To 256
    Get #2 , Buffer(write_position_word)
    Next Write_position_word

    For Write_position_word = 1 To 256
    Get #2 , Buffer(write_position_word)
    Next Write_position_word


    Write_position = 0
    Enable Timer1



    Do
        If Write_position <> Read_position Then
            Get #2 , A

            lds R16, {A}
            subi R16, 128
            lds R17, {Volume}                                   'Od 0 do 255
            mulsu R16, R17
            mov R16, R1
            subi R16, 128

            ldi R27, 4                                          '<------------------- Starsza połówka adresu bufora. Np. 4 = High(1024)
            lds R26, {Write_position}
            st X+, R16                                         
            sts {Write_position}, R26

        End If

        If Play = 0 Then Goto Stp                               'Nagły stop odtwarzania

    Loop Until Eof(#2) <> 0

    Stp:
    For Write_position_word = 1 To 256                          'czyszczenie bufora
    Buffer(write_position_word) = 129
    Next Write_position_word

    Play = 0                                                    'wstrzymanie odtwarzania
    Disable Timer1                                              'zatrzymanie timera1
    Close #2                                                    'ZAMKNIĘCIE PLIKU

    Start Watchdog
    Return
    '-------------------------------------------------------------------------------



    '---PRZERWANIE OD TIMERA 1------------------------------------------------------
    Timer1_handler:
      push R16
      In R16, SREG
      push R26
      push R27

      lds R26, {Timer1_licznik}
      inc R26
      sts {Timer1_licznik}, R26
      cpi R26, 2
      brlo R26_mniejsze_2
          ldi R26, 0
          sts {Timer1_licznik}, R26

          ldi R27, 4                                            '<------------------- Starsza połówka adresu bufora. Np. 4 = High(1024)
          lds R26, {Read_position}
          ld R27, X+
          !Out OCR1AH, R27
          !Out OCR1AL, R27

          sts {Read_position}, R26
      R26_mniejsze_2:

      pop R27
      pop R26
      !Out SREG, R16
      pop R16
    Return
    '-------------------------------------------------------------------------------



    '---PRZERWANIE OD UART-A--------------------------------------------------------
    Serial0charmatch:

    Play = 0

    Input Uart_dane Noecho                                      'ODBIÓR DANYCH Z UART-A


    'VOLUME
    If Left(uart_dane , 4) = "vol:" Then
       Mix(1) = Len(uart_dane)                                  'całkowita długość odebranych danych z początkiem vol:
       Mix(2) = Mix(1) - 4                                      'całkowita długość wartości do wstawienia do volume
       Mixx = Mid(uart_dane , 5 , Mix(2))
       Volume = Val(mixx)
       If Volume < 0 Then Volume = 0
       If Volume > 250 Then Volume = 250
       Writeeeprom Volume , 5                                   'zapis poziomu głośności do pamięci eeprom
    End If

    'STOP
    If Uart_dane = "stop" Then                                  'JEŚLI ODEBANO STOP TO WSTRZYMAJ ODTWARZANIE
       Play = 0 : Uart_dane = ""
       Clear Serialin
    End If

    'RESET
    If Uart_dane = "reset" Then
       Uart_dane = ""

       For Write_position_word = 1 To 256                       'czyszczenie bufora
       Buffer(write_position_word) = 129
       Next Write_position_word

       Play = 0                                                 'wstrzymanie odtwarzania
       Disable Timer1                                           'zatrzymanie timera1
       Close #2                                                 'ZAMKNIĘCIE PLIKU

       Gosub Reset_systemu
    End If

    'ZAPYTANIE O POZIOM GŁOŚNOŚCI
    If Uart_dane = "vol_val" Then                               'SPRAWDZANIE AKTUALNEGO POZIOMU GŁOŚNOŚCI

       Vol_val = "vol_val:" + Str(volume)
       Print #4 , Vol_val ; Chr(13);
       Clear Serialin

    End If

    Uart_flaga = 1                                              'FLAGA INFORMUJĄCA ŻE ODEBRANO DANE

    Clear Serialin
    Return
    '-------------------------------------------------------------------------------



    '---PĘTLA POWODUJĄCA ZAPLANOWANY I CELOWY RESET SYSTEMU-------------------------
    Reset_systemu:
    Start Watchdog
       For Write_position_word = 1 To 256                       'czyszczenie bufora
       Buffer(write_position_word) = 129
       Next Write_position_word

       Play = 0                                                 'wstrzymanie odtwarzania
       Disable Timer1                                           'zatrzymanie timera1
       Close #2
    Do
    'Pusta pętla spowoduje reset wywołany przepełnieniem watchdoga
    Loop
    Return


    czy ja dobrze rozumuję?
  • #263
    zdzb
    Poziom 2  
    Witam,

    Mam polutowaną płytkę wg powyższych wskazówek, program jak wyżej.
    Procesor ATMega 644, kwarc 16MHz, karta SD 256MB (lub MMC32MB) podłączona (wejścia) poprzez dzielnik 2k/3.9k zasilana napięciem 3.3V.

    Prosiłbym o podpowiedź, jaka może być przyczyna:

    Ustawienia:
    Code:
    Config Pinb.4 = Output  
    
    Mmc_cs Alias Portb.4
    Set Mmc_cs
    Config Pinb.4 = Output
    Spi_ss Alias Portb.4
    Set Spi_ss             
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
    Spsr.0 = 1
    Spiinit
    $lib "MMC.LIB"
    $external _mmc
    Enable Interrupts
    B = Driveinit()
    B = Initfilesystem(1)



    Driveinit zwraca kod błędu 225 dziesiętnie (Cperrdrivereset - Error response Byte at Reset command)
    InitfileSystem(1) zwraca kod błędu 227 dziesiętnie (Cperrdrivereadcommand - Error response Byte at Read Command)




    inventco.eu - znaczniki CODE. Tym razem poprawiłem.
  • #264
    djmdp
    Poziom 16  
    Witam, też kombinowałem z tym playerem wave i mam kilka doświadczeń, na pewno bez 16bit nie będzie dobrego dźwięku bez szumów, robiłem player na armie, więc mialem 44khz bez problemu, lecz nadal tylko 8bit, bo arm również nie wyrobi się z 16bitami pwm, ale mam pewne pomysły, które ktoś tutaj mógłby rozwinąć, najprostszy to zastosować DAC external, ale to troche pójście na łatwiznę, myślałem o tym jak możnaby było zaimplementowac w procesorze przetwornik sigma-delta, on by bardzo pomógł, pewnie dałoby się osiągnąć lepsze efekty niż 8bit pwm. Kolejna sprawa to jak w takim razie załatwiają sprawę marnej rozdzielczości przetworniki we wzmacniaczach klasy D? Z tego co wiem to częstotliwości PWM są tam rzędu 70khz. Więc pomijając filtr wyższych rzędów skąd tam w miarę dobra jakość?
  • #265
    dondu
    Moderator Mikrokontrolery Projektowanie
    djmdp napisał:
    ... na pewno bez 16bit nie będzie dobrego dźwięku bez szumów,...

    Spokojnie, będzie dobry dźwięk bez szumów i to już przy 8 bitach i 8kHz - sprawdzone na PWM w praktyce na zwykłej ATMega8.
    Oczywiście zależy kto czego oczekuje :)
  • #266
    djmdp
    Poziom 16  
    znaczy jeszcze kwestia postrzegania "dobrego dźwięku":) załóżmy, że oczekujemy dźwięku jakości zbliżonej do powiedzmy cd. Więc z 8bit raczej nie da się osiągnąć takiego efektu? Chyba że bardzo rozbudowane filtry (wyższych rzędów aktywne), ale to raczej tylko poprawi dźwięk.. A co myślicie o tym sigma delta na uc? Jestem typem na moje nieszczęście, który wszystko chce robić na piechotę;)
  • #267
    dondu
    Moderator Mikrokontrolery Projektowanie
    djmdp napisał:
    znaczy jeszcze kwestia postrzegania "dobrego dźwięku":) załóżmy, że oczekujemy dźwięku jakości zbliżonej do powiedzmy cd.

    zdzb nie pisał jakiej jakości dźwięku oczekuje.
    Ty piszesz o szumach i do nich się odniosłem.
    Masz rację - jakości CD nie osiągniesz w ten sposób :)
  • #268
    zdzb
    Poziom 2  
    Oczekuję "tylko" 16kHz

    Już znalazłem błąd:
    w konfiguracji SPI było Noss = 1, a ja używałem SS do wyboru karty SD.
  • #269
    WOBI
    Poziom 19  
    Masz jeszcze błąd kofiguracji SPI. Nie czytasz wątku, wyżej już pisałem.

    Ten błąd ciągnie się we wszystkich konfiguracjach AVR-DOS !!!

    Specyfikacja kart SD wyraźnie mówi jak wyglada zegar na SPI polaryzacja spoczynkowa SCK jest stan L a nie H (czyli na byc polarity Low)!!! to samo dotyczy phase!!!

    A poźniej będą pytania i płacz: pomocy nie działa ;)

    tak powinno być:

    Code:
    ' HW-SPI is configured to highest Speed 
    
      Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
       Spsr.0 = 1 
  • #270
    Duch__
    Poziom 31  
    A to koledzy widzieli? Wave file player

    Możliwość odtwarzania 8 bitowych plików (22ksps - stereo oraz 44ksps - mono)

    Właśnie testuje go na atmedze 644 i działa rewelacyjnie. Próbuje go przy okazji zoptymalizować do atmegi32, gdyż szkoda używać takiego olbrzyma jak 644.

    Dla zainteresowanych filmik:


    Link