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

ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .

adambehnke 29 Sty 2010 01:26 91953 328
  • #121 29 Sty 2010 01:26
    atom1477
    Poziom 43  

    No to chyba mam szczęście bo ani jedna spośród może 100 ATMeg z przeciągu kilku lat nie opierała się mi. A dla pewności sprawdzałem na 2,7V i też chodziły.
    Problemy miałem dopiero przy 28...32MHz.
    Aż taki głupi jestem że mam aż takie szczęście? ;)

  • Relpol
  • #123 30 Sty 2010 14:33
    d.d
    Poziom 20  

    Właśnie czytam o tych protokołach i wygląda na to że X/Ymodem będzie prościej zaimplementować od kermita i Zmodem.
    Tu jest trochę info jak wygląda transmisja LINK1.PDF , LINK2 , LINK3.PDF.
    Bascoma nie znam więc w kodze za bardzo ci nie pomogę ale jak znajdę jeszcze jakieś materiały to tu wrzucę .
    Myślę że powinieneś dać se rade z X/Ymodem , sam chyba dzisiaj coś napisze w c i wtedy będę mógł bardziej szczegółowo opisać transmisję.

    //////////////////////////////////////////////////////////////////////////////////////////
    Wczytałem się dokładniej w temat i spawa wygląda tak .
    Xmodem:
    Rozmiar pakietów 132B w tym 128B to dane.
    Nazwę trzeba samemu wpisać przed lub po wysłaniu pliku a rozmiar można wyliczyć z przesłanych danych.
    Protokół ten jest bardzo prosty, można go uruchomić w kilka minut.

    Ymodem:
    Rozmiar pakietów pierwszy 132B=128B_Dane pozostałe 1029B=1024B_Dane (wymaga większego bufora odbiorczego)
    W pierwszym pakiecie transportowana jest nazwa pliku , rozmiar i data utworzenia.
    Protokół prawie taki sam jak Xmodem tylko pakiety większe .

    Zmodem się nie nadaje do komunikacji z AVR gdyż nie można wpłynąć na rozmiar pakietu który zwiększa się po każdej bezbłędnej transmisji i może mieć rozmiar 8KB.
    Chyba że mamy zewnętrzny ram w którym upakujemy tyle danych .

    KERMIT:
    Zaletą są małe pakiety maks 94B
    Niestety dosyć dziwny jest zapis danych :

    Do każdego bajtu mniejszego od 64 dodawane jest 64 i taki bajt poprzedzony jest znakiem # .

    Gdy wystąpi znak ~ to kolejny bajt minus 32 oznacza ilość powtórzeń kolejnego bajtu .

    Przykład (zapis szesnastkowy) 23=# , 7E=~ , 64=40h , 32=20h .

    42 4D 16 4D 00 00 00 00 00 00 36 00 / Prawidłowe bajty

    42 4D 23 56 4D 7E 26 23 40 36 23 40 / Zakodowane(skompresowane?) bajty

    23 56 ( 56-40=16 ) /23 oznacza że od kolejnego bajtu odejmujemy 40 i oba bajty zastępujemy wynikiem czyli 16

    7E 26 23 40 ( 26-20=6 40-40=00 = 00 00 00 00 00 00 ) /7E oznacza że kolejny bajt-20 opisuje ilość powtórzeń następnego bajtu który w tym przykładzie też jest zakodowany , wynikiem jest 6 powtórzeń bajtu 00

    Wszystkie protokoły dostępne w HyperTerminal opisane są w MSDN LINK

    Dodam jeszcze że właśnie udało mi się przesłać plik do avr protokołem KERMIT, muszę tylko dorobić procedurę dekodującą dane .

  • #124 01 Lut 2010 17:30
    bully
    Poziom 10  

    Mam takie głupie pytanie - jak podłączyć głośniczek pod atmega przez tranzystor? Mam głośniczek 50 ohm.

  • Relpol
  • #125 02 Lut 2010 12:09
    adambehnke
    Poziom 24  

    A dlaczego jeśli już chcesz podłączać głośniczek to nie zrobisz tego tak aby miało to jakiś sens. Nie lepiej użyć prostego wzmacniacza choćby LM386. Osiągniesz wzmocnienie sygnału (pewnie o to Ci chodzi) i dobrą jakość (przynajmniej u mnie pozbyłem się szumów). Schemat umiesciłem parę postów wyżej.

    Ale jeśli chcesz użyć tylko tranzystora to zrób to np tak:

    ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .

  • Pomocny post
    #126 02 Lut 2010 15:22
    polprzewodnikowy
    Poziom 26  

    adambehnke - pomyliłeś chyba typ tranzystora, NPN tak się nie podłącza.

  • #127 08 Lut 2010 23:19
    polprzewodnikowy
    Poziom 26  

    Mam takie pytanie, czy to zadziała na ATmega16? Niestety ale 32 nawet jeszcze w ręku nie trzymałem a 16 leży sobie tak bezużytecznie więc bym spróbował na niej to zrobić, co o tym myślicie?

  • #128 08 Lut 2010 23:31
    atom1477
    Poziom 43  

    W tej wersji (czyli przy użyciu AVR DOSu) nie da rady. Za mało RAMu.

  • #129 14 Lut 2010 22:53
    adambehnke
    Poziom 24  

    Właśnie zmontowałem odtwarzacz na gotowej płytce. Działa ślicznie. Jest tylko jeden poważny minus ale nie tyczy jakości odtwarzania ale braku kontroli nad głośnością. Chciałbym dorobić programowe zgłaśnianie i ściszanie.Myślałem o wykorzystaniu PWM ale nie wiem czy to da się zrobić. Owszem mogę dorobić ściszanie (także PWM ale z innego procka/urządzenia) i wyciszać/zgłaśniać odtwarzanie bezpośrednio działając na końcówkę "mocy" ale to jakieś takie naciągane.

  • #130 15 Lut 2010 00:22
    atom1477
    Poziom 43  

    No to zamiast:

    Code:

            Get #2 , A

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


    daj:
    Code:

            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                                          'To powoduje zawieszanie
            sts {Write_position}, R26


    Dodano po 38 [minuty]:

    Swoją drogą to zadziwiające że wszyscy którzy robią odtwarzacze dźwięku na uC (czyli cyfrowe odtwarzacze) chcą robić regulację głośności za pomocą takich wynalazków jak PWM czy też chcą robić normalną analogową regulację głośności ;)
    Zamiast normalnie przeskalować próbki.
    (Przy skalowaniu próbek przy małej głośności jest różnica bo jakość dźwięku ulega pogorszeniu, ale od 5...10% już nie słychać żadnego pogorszenia jakości.)

  • #132 17 Lut 2010 00:03
    adambehnke
    Poziom 24  

    Jest jednak jeszcze jeden mankament.Ale dotyczy kwestii elektronicznej. Otóż czasami jak wyślę polecenie odtwarzania jakiegoś pliku to w głośniku najpierw usłyszę trzask a potem odtwarzanie.Nie jest to wina programu ani odtwarzanych plików. Mogę odtwarzać 100x ten sam plik i trzaski pojawiają się losowo.

    W sumie to im większą przerwę czasową mam pomiędzy odtwarzaniami tym większe prawdopodobieństwo usłyszenia trzasku.
    Moim zdaniem winę ma kondensator wyjściowy C19 albo C21 w zależności od używanej końcówki. Ale jak można temu zaradzić. Kondensatory w sumie powinny mieć około 220uF ale z powodu braku takich zastosowałem 100uF. Co prawda użyte przeze mnie końcówki mocy są g... ale takie akurat walały mi się w szufladzie. Teraz trochę żałuję bo mam małe szumy nawet jak nie odtwarzam nic. Ale teraz za późno na płacz tylko coś trzeba pomyśleć. W sumie szumu nie słychać (trzeba zbliżyć ucho do głośnika) , wzmocnienie mam dobre ale te trzaski psują efekt.
    Ćwiczyłem aby wpisać do PWM po zakończeniu odtwarzania wartość 127 -128 ale to nic nie daje.

  • #133 17 Lut 2010 00:13
    atom1477
    Poziom 43  

    To raczej wina programu. Pod koniec odtwarzania pewnie na wyjściu procesora pozostaje sygnał o wypełnieniu nierównym 50%.
    Do tego na początku pliku Wav masz kilkanaście bajtów nagłówka i jego pasowało by omijać. A na razie to go odtwarzasz.
    A to czyszczenie bufora to powinno wyglądać tak:

    Code:

    Buffer(write_position_word) = 128

    a nie tak:
    Code:

    Buffer(write_position_word) = 129

  • #135 17 Lut 2010 07:41
    atom1477
    Poziom 43  

    No to już jest dziwne.
    Spróbuj wywalić te funkcję resetujące system (zakomentuj komendę Config Watchdog i wszystkie komendy Start Watchdog).
    Może system Ci się resetuje zamoczynnie po jakims czasie.

  • #136 17 Lut 2010 13:05
    adambehnke
    Poziom 24  

    Nie to nie jest wina ani watchdoga ani restartów procesora.Sprawdzałem dokładnie. To jest takie puknięcie jak nie wiem czy się orientujesz występuje często we wzmacniaczach audio.Stosuje się wtedy opóźnienie załączania głośnika w formie przekaźnika. To jednak będzie wina wzmacniacza.Ale nie wiem jak to wyeliminować. Układu opóźnianego załączania głośnika nie zastosuję bo to lekka przesada.
    Nawet jeśli poziom głośności mam ustawione na -0 to i tak słychać trzask. Może powoduje to start Timera1??

    Po dokładnych oględzinach stwierdziłem że jednak trzaski nie są winą kondensatorów ale pochodzą bezpośrednio z części cyfrowej tj. wyjścia PWM atmegi.
    Może dołożę jeszcze kondensator przy samym procku.

    Niestety i to nie pomaga :/ Dziwi mnie jednak ta losowość trzasków.

    Dodano po 2 [godziny] 43 [minuty]:

    No i pozbyłem się problemów z trzaskami.Okazało się że elektronicznie wszystko było w najlepszym porządku. Problemem był jak mówił kolega Atom oczywiście program i miał rację (jak zwykle :D ).

    Tak wygląda kod odtwarzania:

    Code:
    '---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                                          'To powoduje zawieszanie
            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
    '-------------------------------------------------------------------------------



    To właśnie ta część:

    Code:
    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


    Wyeliminowała trzaski i teraz "mucha nie siada" . Swoją drogą niesamowite wrażenie jak się teraz bawię moim prawie gotowym modułem który potrafi "mówić" :D

  • #137 17 Lut 2010 14:01
    PiotrEtenM500
    Poziom 19  

    Fakt stuku już nie ma, ale jest wcześniej przy włączeniu PWM'a
    i jeszcze jedno pytanie, czym konwertujesz na wav, sprawdziłem juz kilka konwerterów i zawsze po konwersji są szumy.

  • #138 17 Lut 2010 14:07
    adambehnke
    Poziom 24  

    Nawet nie ma stuku przy włączaniu PWM-a jeśli zaraz za konfiguracja timera dasz:

    Pwm1a = 129

    Ja osobiście używam Adobe Audition ,pełnej wersji.A komunikaty nagrywam sobie poprzez lektora IVONA. Niezły program. Ale cudów też nie należy się spodziewać przy 16khz i 8 bitach.

  • #139 17 Lut 2010 14:27
    PiotrEtenM500
    Poziom 19  

    Tak, dałem Pwm1a = 129, mimo przy pierwszym załączeniu jest "stuk" pwm'a

    Zastanawiam się czy kupić VS1003, chińczyk oferuje je po 5$(USA),sądze, że to będzie gwarancja lepszej jakości, choć ta aplikacja jako moduł informacyjny jest KLASA :)
    jako odtwarzacz muzyki, to jakość Casetta z lat 80' na Kasprzaku mono;)
    jest mało atrakcyjna.

  • #141 17 Lut 2010 15:59
    atom1477
    Poziom 43  

    Czyli winny był nagłówek Wava?

    Cały czas się zastanawiam dlaczego stosujecie wartość 129. Możecie mi to wyjaśnić?

  • #144 17 Lut 2010 16:25
    PiotrEtenM500
    Poziom 19  

    Właśnie chodzi o nagłówek, kiedy zmieniam wartość

    Code:
    Read_position = 0
    na np
    Code:
    Read_position = 10

    też powoduje "trzask"

  • #145 17 Lut 2010 16:48
    adambehnke
    Poziom 24  

    Nie wiem jak u Was ale ja tam nie mam już absolutnie żadnych trzasków.
    Owszem jest jeden mini szmer jak włączam urządzenie ale włączam je raz na "rok" i nie wyłączam. Chyba że ktoś puszcza sobie melodyjkę i wyłącza urządzenie , to co innego.
    Dla pewności przedstawiam ponownie działający kod.

    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

  • #146 18 Lut 2010 17:31
    Tomekddd
    Poziom 23  

    Witam.
    Znalazłem ten temat i jestem niesamowicie wdzięczny autorowi za udostępnienie kodu i schematu. Muszę zbudować syntezator mowy do mojego sterownika żeby powiadamiało o zdarzeniach.
    Mam kilka pytań odnośnie tej konstrukcji:
    1 Do czego jest DS1813 - czytałem ze coś resetuje ale czy nie można przyciskiem?
    2 Z jakimi kartami pamięci będzie to współpracowało ? czy ruszy na SANDISC Memory Stick Pro Duo?
    3 Czy zamiast LM2937 mogę wstawić LM7805? ze schematu wnioskuję że jeden z nich zmniejsza na 3,3V wiec by musiał zostać ale drugi zmniejsza na 5V to chyba mogę dać 7805?
    4 Ile plików i o jakiej długości mogę wgrać na kartę ?
    5 czy pliki na karcie muszę jakoś deklarować w programie do procesora?
    6 Proszę też o jakiś spis komend które trzeba wysłać przez RS232 żeby tym sterować

    Za wszelkie odpowiedzi i pomoc w realizacji będę wdzięczny

  • #147 18 Lut 2010 18:35
    adambehnke
    Poziom 24  

    Ad.1 DS1813 nie jest niezbędny i można go pominąć .Jest to po prostu zabezpieczenie resetujące procesor.
    Ad.2 Karty pamięci to SD Secure Digital. Po kilku zmianach powinno czytać MMC ale nie bawiłem się tym bo nie miałem akurat takiej karty a ta co miałem była z telefonu i nie chodziła.
    Ad3. Oczywiście LM7805 można spokojnie zastosować.Mi chodziło o minimlizację rozmiarów i wszystko robiłem w smd. Zresztą z powodu braku kilku elementów można sobie obejrzeć taki niecodzienny widok jak 7805(TO220) na padach smd : ))
    Link
    Ad4. Ilość i rozmiar pliku jest ograniczona tylko rozmiarem karty pamięci. Ale trzeba pamiętać o konwersji do 16khz 8 bit mono
    Ad5. Plików nie trzeba deklarować. W programie powyżej ja osobiście podawałem poprzez RS232 tylko nazwy plików do odtworzenie (długość max to 8znaków + rozszerzenie)
    Ad6. Hmm , po prostu wysyłasz np:

    dzwonek.wav lub test.wav

    i to wszystko.
    Dodatkowo można przerwać odtwarzanie wysyłając:

    stop

    lub zresetować procesor wysyłając:

    reset.

    a jeśli Chcesz regulować poziom głośności to wysyłasz :

    vol_val: x (gdzie x to liczba 0-255)


    Jeden ze wzmacniaczy proponuję pominąć gdyż ciężko skalibrować układzik jeśli każdy z kanałów ma pracować z innym poziomem głośności a po drugie jeden taki układzik spokojnie wystarcza.
    i to na tyle. Powodzenie w przeróbkach.

  • #148 18 Lut 2010 19:07
    Tomekddd
    Poziom 23  

    Dzięki, ja dam oczywiście jeden wzmacniacz bo to tylko do poleceń głosowych wiec nawet stereo nie potrzeba

    A jaką masz kartę SD jeśli nie byłaby droga to bym zakupił tylko żeby model się zgadzał

    Jeśli pominę drugi wzmacniacz to chyba regulacje głośności mogę z kodu usunąć bo mi się nie przyda, lepiej niech gra na full

  • #149 18 Lut 2010 19:16
    adambehnke
    Poziom 24  

    Używam takich kart . Jedna normalna SD a druga micro sd. Są tanie jak barszcz.

    ATMEGA[BASCOM] Najprostsze odtwarzanie Wav .

    Oczywiście możesz sobie wpisać stałą wartość w programie jeśli chodzi o poziom głośności. Ja tam jednak wolę sobie z poziomu menu to regulować (lub automatycznie) gdyż jak używam terminala wieczorem lub w nocy to mogę sobie ściszać odtwarzanie i nie budzić sąsiadów :D
    Układ nie odtwarza w stereo. Dałem sobie drugi wzmacniacz gdyż jeden głośniczek mam w terminalu a kilka następnych w sufitach w domu i regulacja była niezbędna.

  • #150 18 Lut 2010 20:15
    atom1477
    Poziom 43  

    Co do MMC to nie trzeba absolutnie nic zmieniać żeby i MMC działały.