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.

Jaka pamięć zewnętrzna 512kB do AVR?

greg_matrix 08 Kwi 2006 18:27 5088 8
  • #1 08 Kwi 2006 18:27
    greg_matrix
    Poziom 16  

    Witam,
    Będę potrzebował jakąś pamięć 512kB do mikrokontrolera AVR. Najprawdopodobniej będzie to ATMEGA8535 albo jakiś podobny obsługujący I2C, choć być może będzie jakiś z większą liczbą pinów I/O. W każdym razie powinien obsługiwać I2C, powinien mieć przetwornik ADC. Na razie rozglądam się czego by tu można użyć... Chwilowo moją uwagę zwróciła pamięć o symbolu: 628512LP07SMD- nie jestem jednak pewny czy jest odpowiednia. Pamięć której potrzebuję musi zachowywać zawartość po odłączeniu zasilania. Dobrze też by było żeby była właśnie w SMD.

    Zasadniczo zadanie do którego potrzebuję jest nastepujące: urządzenie ma być czymś w rodzaju cyfrowego dyktafonu. Chcę mieć dostęp do zapisanych komunikatów głosowych i móc je w dowolnej chwili odczytywać. Komunikaty te będą zapisane "raz na zawsze" i na dobrą sprawę nie jest potrebna możliwość ich zmiany. To będzie kierowane do przetwornika DAC i odtwarzane jako dźwięk. Na poniższym rysunku przedstawiłem moją wstępną koncepcję, choć zdaję sobie sprawę, że rozwiązanie to ma poważne wady. Przede wszystkim pamięć musiałaby być wcześniej zapisana i można by było z niej tylko wysyłać dane do DAC. Samo programowanie to też trudność przy takim rozwiązaniu- właściwie to na razie nie wiem jak to rozwiązać. Trzeba by było z mikrokontrolera podawać adresy i w tym samym czasie do szyny danych podawać liczby do zapisania. Pewnie się to da zrobić, zle może jest jakiś prostszy sposób?? W związku z tym kilka moich pytań:

    1. Czy są pamięci adresowane szeregowo? Jeśli tak to jakie? Jeśli takie są to na pewno mają dużo większy czas dostępu- jakiego rzędu?

    2. Dużo lepiej niż na moim rysunku byłoby połączyć 8-bitową szynę danych do mikrokontrolera. Ale razem z 16-bitową szyną adresową i 3 pinami sterującymi mam wtedy 27 zajętych pinów. W ATMEGA8535 jest tylko 32 I/O- zostaje mi 5. Będę potrzebował podłączyć jeszcze 2 urządzenia na I2C i dodatkowo 1 albo 2 piny muszę mieć wolne... Czyli braknie. ATMEGA8515 ma o 35 linii I/O, ale z tego co się zorientowałem nie obsługuje I2C. Jak to rozwiązać?

    3. Czy jest jakiś AVR z przetwornikiem DAC?

    4. Może jakaś inna pamięć niż ta którą znalazłem będzie lepsza do tego celu? Odnośnie zachowywania zawartości po odłączeniu zasilania- czy stan pamięci trzeba podtrzymywać jakąś bateryjką Li-Ion, czy są też takie które po prostu "same z siebie" się nie kasują (zdaje się, że EEPROM o ile dobrze myślę)?

    5. Czy ktoś mógłby udzielić mi jakichś wskazówek jak się za to zabrać? Nie chodzi mi tu o narysowanie schematu i napisanie kodu... potrzebuję konkretnych wskazówek z czego się można szybko i skutecznie nauczyć. No i na co powinienem zwrócić uwagę. Jak się takie coś programuje z PC? Pewnie wiele osób ma dużo doświadczenia w tej dziedzinie. Będę wdzięczny jeśli ktoś coś podpowie.

    0 8
  • #2 08 Kwi 2006 18:54
    lbugiera
    Poziom 21  

    Co do pamięci to np taka AT25F2048N
    Będziesz musiał wziąść dwie bo to jest 256K, ale wydaje mi się że to nie powinien być większy problem. Jak jest to poszukaj czegos co się zaczyna od AT25F ale ma 512K*8. Ona jest odczytywana po SPI, a przykład podłaczenia masz w pdfie. Wszytko zależy od tego jak szybko dane muszą byc podawane na DAC. Bo jeśli weźmiesz jakiegoś atmela co może pracować przy 20Mhz to maksymalnie dasz rade wrzucać DAC'ow około 1MB/s (jeden bajt co 1us) jeśli jest to DAC obsługiwany przez interfejs równoległy. Czyli zdążysz wysłac cała pamięć na DAC'a w ... półsekundy. Domyślam się wieć że chcesz to robić dużo wolniej. Jeśli to ma byc np 44kHz to AVR spokojnie się wyrobi i jeszcze można nawet pomyśleć nad jakims niezaskomplikowanym kompresowaniu danych. Proponuje, więc powyższą pamięć podłączyć po SPI do AVR'a i przekazywać je inaczej niż proponujesz. Pierw z flasha do AVR'a i z AVR'a na DAC.

    Napisz jaki konkretnie układ chcesz na DAC'a, bo nie ma AVRów z DAC'iem. Ogólnie proponuje albo atmega88 albo 16 jeśli ten pierwszy będzie miał za mało pinów.

    Zdecyduj jakie konkretnie układy chcesz użyć na DAC'a i pamiec to wtedy pomyślimy którego uC wybrać. Napisz też ile kanałów ADC jest ci potrzebne. Powiedz też coś więcej o samej idei. Co to dokładnie jest za urządzenie, skąd przychodzi sygnał sterujący itd.

    Boogie[/url]

    0
  • #3 08 Kwi 2006 19:24
    greg_matrix
    Poziom 16  

    W międzyczasie poszperałem i znalałem takie coś: AT45DB041-SU
    To jest pamięć Flash 512kB produkcji Atmel no i jest w obudowie SO8, co mi bardzo odpowiada :-)
    Na stronie Analog Devices znalazłem taki DAC: http://www.analog.com/en/prod/0,2877,AD5602,00.html
    Może przyślą próbkę jak ładnie poproszę?

    Do I2C chciałbym podłączyć przetwornik ADC (też Analoga), pamięć, przetwornik DAC. Dodatkowo 3 piny do różnych pomiarów. W takim układzie spokojnie wystarczy pinów które ma MEGA8535. Poczytam teraz notę katalogową tej pamięci. Spróbuję coś z tego wywnioskować.

    Masz rację odnośnie prędkośc. Ale to bardzo dobrze, że jest pewnien zapas. Być może uda się zrobić np. coś takiego, że będzie można odtworzyć dwa pliki i je zmiksować? To by się przydało.

    Pewne pytania przychodzą mi jeszcze do głowy:
    1. Czym się różni pamięć "Flash" od "DataFlash" ??
    2. Czy można do takiej pamięci wgrać zawartość pliku *.wav ? Gdyby jeszcze dało się odczytywać te pliki nie przez adresy ale przez nazwę to by było dokładnie coś takiego czego potrzebuję :-)
    3. Jeśli da się zrobić powyższe to pewnie da się wgrać jakikolwiek plik, także w jakiś sposób bardziej lub mniej spakowany. Gdzie mozna wyszukać jak wygląda algorytm pakowania/rozpakwywania?
    4. Jak na razie programuję w BASCOM. Czy są jakieś gotowe instrukcje które ułatwiają sprawę dostępu do pamięci po I2C?

    0
  • Pomocny post
    #4 08 Kwi 2006 21:08
    lbugiera
    Poziom 21  

    Ad.1 Odpowiedź ze strony producenta :

    Cytat:

    DataFlash® is the world's number one selling serial interface flash family. Introduced in 1997, Atmel's Dataflash families (45 series and the recently introduced 26 series) are feature rich, low pin count, sequential access families ideal for program code, data storage, Serial EEPROM replacement, and the next generation PC Bios Market.

    Czyli rózni się niewiele. Więcej w tym marketingu niz innowacji. Są to szeregowe pamięci o większych pojemnościach dedykowane do takich aplikacji jak twoja, tzn duża pojemność kosztem dłuższego czasu dostępu (interfejs szeregowy)

    Ad.2 Nie wiem co przedstawia soba plik wav. I jak to co przedstawia zamienić na strumień danych dla DAC'a. Nie znam się na tym.

    Ad.3 Radze jednak odwoływać się przez adres. Jeśli chcesz wgrywać pliki to musisz sobie zaimplementować jakis system plików, a to kolejna komplikacja. Lepiej napisac programik na PC, który wybrany plik prześle do AVR'a po RS'ie. A AVR wgra go do pamięci flash i zapisze sobie w swoim AVRowskim eepromie adres od którego dany plik się zaczyna.

    Z twoich postów wnioskuje, że nie jesteś zaawansowany w temacie, więc radze raczej upraszczac sobie problem niż go komplikować. Przed Tobą długa droga :) ... ale ciekawa.

    Pamiętaj, że jak wgrasz plik skompresowany do AVR'a to on będzie musiał sobie go rozpakować, a on może mieć na to za mało mocy obliczeniowej. Jeśli to maja być komendy głosowe, to myśle że wystarczy dźwięk mono, 8bitów i częstotliwości próbkowania 11kHz co da ci około 45 sek dźwięku w pamięci 512kB. Proponuje się zainsteresować starszymi formatami zapisu dźwięku takimi jak *.voc i własnie *.wav. Bo na mp3, wma, mpc itd to AVR jest raczej zasłaby (na pewno jeśli będziesz pisał w bascomie) no i trzeba algorytm dekompresji zaimplementować co pewnie nie jest najłatwiejsze, szczególnie dla początkującego.

    4. Nie znam sie na bascomie.

    Jak chcesz samplować od analoga to oni maja w swojej ofercie procki z DACami i ADC'ami z rdzeniem 51 i ARM7TDMI.

    Co do DAC'a to nie wiem dlaczego chcesz z interfejsem szeregowym. Wydaje mi się że lepiej będzie z równoległym. A jęsli już szeregowy to SPI a nie I2C bo to jest dosyc wolny interfejs. W seguro maja za 8 zeta jakiegoś 8bit 10Mhz więc 5 razy szybszy niż ten, który proponujesz. Ale ja sie na układach audio nie znam :/ (jeszcze :) )

    Nadal nie napisałeś co to ma być i po co.

    Boogie


    [/quote]

    0
  • #5 13 Kwi 2006 11:48
    greg_matrix
    Poziom 16  

    Masz rację- nie jestem w tym temacie zaawansowany. No ale właśnie dlatego pytam, że się na tym nie za bardzo znam. Kiedyś trzeba się nauczyć żeby umieć :-)

    Dzięki za cenne uwagi, mam teraz lepszą wizję mojego projektu. Oczywiście SPI, nie taka pamięć jak początkowo miałem w planie, inny przetwornik.

    Odnośnie zastosowania- to ma być coś w rodzaju komputerka pokładowego, który będzie informował (mówił) jakie są wartości mierzonych wielkości. Urządzenie będzie siedziało w pilotowanym przeze mnie samolocie RC :-) Mierzone będą temperatura powietrza, prędkość lotu, stan baterii, czas lotu od startu, może stan baku z paliwem... i co mi jeszcze przyjdzie do głowy. Docelowo jak to już będzie działało trzeba to wszystko będzie nadawać jakimś kanałem CB. Pełny wypas :-)

    Przyszedł mi do głowy pewnien pomysł jak wgrać i obsługiwać fragmenty dźwięku. System posługujący się nazwami rzeczywiście nie jest najlepszy. Trzeba to będzie zrobić tak jak sugerowałeś- zapisać adresy początków kolejnych komunikatów. Moja wizja jest taka: używam dwóch pinów:
    -- wejście ADC (sygnał audio)
    -- "normalne" cyfrowe wejście (sygnał sterujący)
    Do wejścia audio podaję sygnał z karty dźwiękowej. Komunikaty trzeba będzie wcześniej nagrać, obciąć i wyrównać głośność dla wszystkich plików. Każdy plik/komunikat będzie miał swój numerek. Nie można tego wgrywania zrobić byle jak, bo mikrokontroler nie będzie wiedział co z tym zrobić. Do tego by było użyte to drugie wejście. Tam pojawi się ciąg powiedzmu 8 odpowiednio zakodowanych "0" i "1". Pewnie dobrze by było dodać jakieś bity znacznikowe na początku i na końcu. To bedzie liczba 8-bitowa, czyli numer kolejnego pliku. Nie wiem czy to jest konieczne, ale w tym momencie mikrokontroler może na jakimś pinie wystawić taką samą sekwencję znacznikową na znak że jest gotowy. Wtedy załatwione zostałyby błedy. Z napisaniem czegoś takiego dla mikrokontrolera nie ma najmniejszego problemu- tu akurat czuję co i jak. Gorzej z oprogramowaniem PC- w tej kwestii muszę się trochę douczyć.

    Po pojawieniu się liczby na wejściu cyfrowym następowałby stan wysoki i trwał do końca odtwarzania pliku dźwiękowego. Tak poinformowany mikrokontroler będzie już wiedział, że ma próbkować sygnał na wejściu audio tak długo jak długo na wejściu sterującym będzie stan "1". Oczywiście jakieś milisekundowe marginesy. 8-bitowe próbki będą zapisywane jako kolejne bajty do pamięci. Adres początku każdego z komunikatów zapiszę sobie w jakiejś tablicy. W ten sposób wcale nie trzeba będzie znać konkretnego adresu w pamięci- wystarczy odwoływać się poprzez liczby zapisane w tablicy. Indeksy w tablicy będą się zgadzać ze zrobioną wcześniej numeracją.

    Żeby odtworzyć zapisane dane wystarczy wysyłać w odpowiednim tempie kolejne bajty po SPI do przetwornika. Miksowanie kilku komunikatów to zwyczajne dodawanie par liczb i wysyłanie ich sumy do DAC. Powinno się udać.

    Problemem który w tym momencie wydaje mi się największy jest napisanie programu dla PC. Potrzebuję zrobić takie coś, żeby na którymś pinie (np RS-a) pajawiały się odpowiednie stany a potem włączałby się odtwarzacz dźwięku (np .wav). Następnie kolejna sekwencja na pinie RS, odtwarzany kolejny plik itd... Czyli potrzebuję następującej wiedzy:
    a) jak wystawiać stany "0" "1" na czymś wystającym z PC
    2) jak z programu uruchomić odtwarzacz .wav

    Jak się tego dowiem to już będzie tylko z górki!!

    PS
    Idea szeregowych przetworników bardziej mi się podoba ze wzlędu na miniaturyzację- tak jak pisałem to będzie do modelu. Szeregowo i w moim przypadku obowiązkowo SMD :-)
    Nie myślałem nad procesorami z Analoga, bo nie potrafię ich programować... AVR-y to w ogóle pierwsze procesory jakie programuję, spodobał mi się dosyć BASCOM ze względu na prostotę- na razie chyba przy tym zostanę.

    0
  • #6 13 Kwi 2006 12:00
    myrcioch
    Poziom 18  

    Najprościej i najtaniej, to chyba zastosować kartę SD/MMC. Obsługa takich kart jak i FAT16 jest rozpracowana na wszelkie możliwe sposoby - wystarczy pogooglać. Komunikaty przygotujesz sobie na PC-cie i wgrasz na kartę jako normalne pliki.

    0
  • #7 13 Kwi 2006 14:08
    Prymulka
    Poziom 18  

    A nie prosciej sygnał audio z komputera dać na przetwornik i w czasie rzeczywistym zapisywać do pamięci? Początek i koniec komunikatu zapisywałbyś w eepromie.

    Pamięć dataflash można programować ISP na przykład za pomocą programatora dybkowskiego.

    0
  • #8 13 Kwi 2006 18:21
    greg_matrix
    Poziom 16  

    Cytat:
    A nie prosciej sygnał audio z komputera dać na przetwornik i w czasie rzeczywistym zapisywać do pamięci?

    Tak właśnie chcę zrobić. Problem polega na tym, że będzie tych plików powiedzmy 40 a może więcej i trzeba się będzie w tym jeszcze jakoś orientować- gdzie który się zaczyna i kończy.
    Na upartego można by odtworzyć wszystkie komunikaty jeden po drugim i tak je ciurkiem nagrać jak lecą. Potem metodą prób i błędów, odtwarzając po kawałku to co siedzi w pamięci, dałoby się odnaleźć początki kolejnych plików... ale to mi się wydaje bardzo nieeleganckie. Na pewno da się to zorganizować jakoś sprawniej.

    0
  • #9 13 Kwi 2006 19:06
    Prymulka
    Poziom 18  

    Oczywiście że się da. Pamięć dataflash jest podzielona na strony po 528 bajtów (512 + 16). W tym przypadku. W tym przypadku będą to 1024 strony. Zawsze możesz wybrać od której strony chcesz zacząć zapis (poczytaj w dokumentacji o "write buffer to main memory"). Tak samo możesz zacząć odczytywać od dowolnej strony (main memory page to buffer). Musisz tylko dokładnie wiedziećjak wyglądają polecenia po SPI do pamięci. Zawierają one kod rozkazu, numer strony i komórki na stronie. Musisz trochę postudiować dokumentacje :)
    Pozdro

    0
  Szukaj w 5mln produktów