Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Tiny Gad A- żegnajcie nudne wyświetlacze ;)

bobeer 19 Feb 2013 07:02 19749 23
Texa Poland
  • Tiny Gad A- żegnajcie nudne wyświetlacze ;) Tiny Gad A- żegnajcie nudne wyświetlacze ;)



    Tiny Gad A- żegnajcie nudne wyświetlacze ;)
    Prawie luxomierz na ATTINY13


    Nie da się ukryć, że z pewnych kontrowersyjnych ;) powodów szczególną sympatią darzę najmniejsze z procesorów atmela. Przedstawiona konstrukcja kolejny raz opiera się zatem o ten maleńki, ale jak się okazuje niemało potrafiący a przy tym najtańszy na naszym rynku procesor AVR.
    Tym razem postanowiłem odpowiedzieć na pytanie, czy można na 1kB pamięci programu zbudować jakikolwiek system umożliwiający podawanie zmierzonej wartości w sposób „audio słowny”.
    Ponieważ w tym samym czasie kończę projekt odtwarzacza plików wave na MEGA88, postanowiłem, że dla relaksu spróbuję przenieść część kodu na tego malucha. Ponieważ debugging ATTINY13, bez DW jest nieco utrudniony, dobrze się złożyło, że najbardziej czasochłonne fragmenty obsługi SD były już gotowe, i nie trzeba było go tracić na pisanie niezawodnych procedur obsługi protokołu SD spi do którego nawiasem mówiąc dokumentacja dostępna w internecie wydaje mi się lekko „upośledzona” zapewne z powodu 'simplified' . Bo jak wyjaśnić, że kartę SD w tryb SPI można zainicjować bez zmian stanu CS, i może on spokojnie przez cały czas pracy karty pozostać połączony do masy nawet podczas startu? W dokumentacji nic nie pisze żeby było to możliwe, a jednak. Wracając do mini systemu syntezy mowy ;). Ze sprzętowej strony, na płytce uniwersalnej znajduje się procesor, wzmacniacz audio, mosfet załączający zasilanie, i trochę elementów pasywnych, do tego karta na której są zapisane próbki. Ponieważ założyłem, że zrobię wszystko co możliwe, aby układ można było programować bez użycia programatora wysoko napięciowego (i każdy mógł sobie go uruchomić bez specjalnego sprzętu). Do wykorzystania pozostało jeszcze mniej portów procesora. Drugim założeniem było uzyskanie w miarę du żego sygnału sygnału do sterowania głośnikiem, ze względu na jego małe rozmiary, oraz niskie napięcie zasilania. Jak widać na schemacie procesor komunikuje się z kartą za pomocą 3 portów. Dodatkowo port połączony z DI karty jest używany również do pomiaru napięcia przez przetwornik AD.
    W tym miejscu wspomnę, iż najpierw próbowałem połączyć przetwornik z wejściem CLK karty, lecz okazało się, że to wyprowadzenie dalekie jest od stanu wysokiej impedancji. Na szczęście wyprowadzenie DI nie ma takiego problemu, i można prawie bezkarnie podawać na ten port napięcie do zmierzenia (0-1V). Wyprowadzenie CLK natomiast oprócz komunikacji z kartą posłużyło również, do sterowania tranzystorem załączającym zasilanie. Ponieważ z gadających mierników, za najbardziej przydatny uznałem światłomierz, na płytce znajduje się specjalizowany układ przetwornik natężenia światła na napięcie z logarytmiczną zależnością na wyjściu. Jeżeli uda mi się pożyczyć luxomierz, to uzupełnię program o przeliczanie surowego napięcia na luxy, oraz wykonam kalibrację dzielnika napięcia/prądu z czujnika światła (czynność niezbędna również ze względu na rozrzut parametrów napięcia odniesienia attiny13). W tym momencie urządzenie podaje słownie wartość zmierzoną przez ADC (wartość podawana jest w miliwoltach), która teoretycznie wynosi w przybliżeniu 220 miliwoltów dla 10lux, 1100mV - 100klux. Oczywiście zamiast czujnika oświetlenia, po małym przystosowaniu można mierzyć doprowadzone napięcie i cieszyć się gadającym woltomierzem, amperomierzem itp. ;). Ponieważ lubię twórczość pcb zaprojektowałem, jednak zastrzegam, iż nie zostało zrealizowane, i może zawierać błędy (bardzo małe prawdopodobieństwo biorąc pod uwagę minimalne skomplikowanie schematu / płytki). Na schemacie są dwa czujniki ze względu na wybór umiejscowienia czujnika na pcb (TOP/BOTTOM). Montujemy tylko jeden oczywiście.



    Słów parę o programie:
    Starałem się by był jak najmniejszy, jednak jestem pewien, że to nie szczyt możliwości minimalizacji rozmiaru kodu. Na ten moment pozostaje ponad 200B wolnego miejsca, co powinno zupełności wystarczyć do dopisania w przyszłości dodatkowych funkcjonalności. Po rozpoczęciu programu procesor mierzy najpierw napięcie przez ADC, następnie wykonywana jest inicjalizacja karty, na koniec wykonywany jest program zamieniający liczbę word na słowo mówione. Tutaj przybliżę nieco jak to jest rozwiązane i jakie mamy do dyspozycji próbki w pamięci flash karty.
    Posiadając teoretycznie nieograniczoną pamięć danych, zależy na jak najmniejszym obciążeniu pamięci rom procesora. Najkorzystniej było by umieścić wszystkie wartości słów odpowiadające liczbą, jako pojedyncze frazy tekstu. Niewątpliwą zaletą takiego rozwiązania była by prostota programu procesora oraz perfekcyjnie naturalna dykcja komunikatów wynikająca z braku składania pojedynczych słów- liczb z mniejszych części. Wiąże się to jednak z niedogodności w postaci dużej ilości zajętej pamięci na karcie (zakładając 128kB na komunikat 65535x128kB = ponad 8GB ! Danych dla 16bitowych sampli w SR 32kHz). Należało więc pójść na kompromis, więc użyłem 100 komunikatów o wartościach 0-99, 9 komunikatów o setkach (100-900), oraz 10 o tysiącach (1000-10000). Program w obecnej postaci nie może generować komunikatów >1023. Na przygotowanym obrazie karty SD ostatni komunikat to 10000 (obraz zostanie uzupełniony do 100000 jeśli luxomierz będzie miał taki zakres). Tak przygotowane etykiety nie zajmą więcej niż 32MB.

    O formacie i odtwarzaniu danych:
    Program odtwarzający dźwięk mimo deficytu zasobów posiada 32 bajtowy bufor próbek, który umożliwia poprawę jakości dźwięku (jak wynika z badań najbardziej jest to uciążliwe dla powolnych kart gdzie każde zaadresowanie kolejnego bloku danych wiąże się z opóźnieniem). Program zawsze najpierw buforuje dane, dopiero po zapełnieniu bufora jest uruchamiana procedura zamieniająca bajty na sample wysyłane do pwm-a. Format danych jak dla normalnych plików WAVE czyli intel najpierw LSB. Na zegarze procesora 16MHz można odtwarzać 16 bitowe sample o SR max 64kHz. Jednak ze względów praktycznych program używa samplowania 32kHz ( w takim formacie są zapisane próbki na karcie SD)

    Słów parę o zamianie słowo na słowo:
    Program bierze liczbę word i sprawdza czy jest ona większa od 1000, jeśli tak to odejmuje od niej ten tysiąc równocześnie zwiększając licznik, który wskaże miejsce sampla do odtworzenia z pamięci karty. Następnie sprawdza czy liczba tysięcy osiągnęła zero, jeśli nie odejmuje znowu 1000 i tak w kółko. (jeśli na starcie brak tysięcy licznik=0, program nie odtwarza żadnego słowa tysięcy). Następnie w ten sam sposób jest wskazywana etykieta z setkami. Liczby 0-99 są przeliczane nieco prościej, od razu mnożony jest offset komunikatu przez pozostałą wartość liczbowa 0-99. Oczywiście we wszystkich przypadkach ważny jest początkowy adres bloku karty dla danego zestawu etykiet. Taki sposób wydał mi się najbardziej efektywny jeśli zależy nam na rozmiarze kodu (jeśli ktoś zna lepszy proszę podać). Program rozpoznaje koniec komunikatu sprawdzając ilość próbek o wartości zerowej. Zwalnia to nas z zaopatrywania każdej etykiety słownej na końcu o specjalny znacznik końca. (W źródle programu znajduje się dokładniejsza mapa adresów gdzie jakie sample powinny się znajdować). Po odtworzeniu 1 2 lub 3 etykiet (jeśli liczba >999) program zatrzymuje się i zasilanie systemu zostaje odłączone. Następuje oczekiwanie na kolejne „wybudzenie”, co praktycznie oznacza podanie napięcia zasilania za pomocą włącznika.

    Na zakończenie wspomnę, iż szczególną uwagę położyłem na niezawodność działania i takie napisanie kodu, aby niemożliwe było zawieszenie jego działania bez względu na okoliczności. Oczywiście bez watchdoga i BOD nic by nie dały najwymyślniejsze zabiegi programowe.
    W praktyce można balansować napięciem zasilania, wyjmować i wkładać kartę, i nic niekorzystnego nie powinno nastąpić (mnie się nie udało powiesić procesora w ten sposób /nawet jeśli karta SD ulegnie zawieszeniu, to procesor po prostu po kilku nieudanych próbach inicjalizacji odłączy zasilanie/).
    Możliwości modyfikacji:
    Jak widać na schemacie lubię eksperymenty i niekonwencjonalne rozwiązania. Stąd min zastosowanie wzmacniacza słuchawkowego w klasie AB jako bufora kluczowanego sygnałem PWM o częstotliwości 64kHz pracujący w klasie D, było to również wynikiem braku komplementarnych mosfetów o niskim rdson, bo w taki sposób (4 tranzystory w mostek) należałoby to rozwiązać bardziej elegancko ;). Rozwiązanie ze wzmacniaczami operacyjnymi „mocy” jest dość efektywne, a napięcie na wyjściu po podaniu zasilania pozbawione uciążliwych clicków, picków, jednak ograniczamy się w tym rozwiązaniu do jakości 8bitowej- pwm na 64kHz co w praktyce przekłada się na sporo szumu i zniekształceń.
    Jeśli ktoś chciałby skorzystać z 16 bitowej rozdzielczości i lepszej jakości odtwarzania, to należy podać zewnętrzny sygnał zegara (20-25MHz), zrezygnować ze wzmacniacza w cyfrowej klasie i użyć każdego pwma osobno dla LSB oraz MSB (wymagana niewielka zmiana w programie+ wykorzystanie dodatkowego portu). Więcej na ten temat w następnym odcinku.

    Sample do „syntezera” wyeksportowałem z expressivo. (Gdybym miał lepszy głos nagrałbym swoje o wiele lepszej jakości – na samplach z expressivo słychać różne śmieci np. klikanie klawiatury – patrz sampel liczby „24,50” ).
    A może jesteś chętny do użyczenia swojego głosu (głos kobiecy byłby bardziej pożądany ze względu na zakres pracy miniaturowego głośnika)? Jeśli ktoś chce mieć inny głos, nic nie stoi na przeszkodzie. Rozlokowanie ponad 100 sampli na karcie SD zajmuje ponad godzinę, nagranie ich pewnie drugą. Jeszcze nawiązując do obrazu karty. Program nie obsługuje żadnego systemu plików i dane są zapisane „na surowo” w odpowiednich sektorach. Nie należy się przejmować, że karta po zapisaniu obrazu na komputerze będzie „pusta” bez żadnego pliku, po prostu domyślnie jest sformatowana w fat16 w trybie dysku FDD (popularne programy do edycji sektorów wyświetlają taką partycję w całości od bloku zerowego).

    Mimo iż ATTINY nie jest zasilany napięciem stabilizowanym, jego napięcie odniesienia jest wystarczająco stabilne do poprawnego działania ADC z 10 bitową rozdzielczością. Również SFH5711 nie przeszkadzają zmiany napięcia zasilania- na wyjściu daje stabilny prąd, który odkłada się w postaci napięcia na rezystorze. Napięcie zasilania układów powinno wynosić ~3V. Poniżej 2.5V układ zaczyna mieć problemy z działaniem, przekraczanie 4V nie jest zalecane ze względu na możliwość uszkodzenia karty SD. Układ można z powodzeniem zasilać z akumulatora li-io. (jeśli ktoś nie lęka się o kartę przy pełnym ogniwie). Średni pobór prądu w stanie aktywnym 30 – 100mA zależnie od amplitudy dźwięku. Wyłączony <100nA (prąd upływu mosfeta).


    W załącznikach znajdują się schemat .sch oraz płytka .brd (eagle), źródło programu w asemblerze .asm, oraz obraz .img, który trzeba zapisać na kartę od sektora 0 dowolnym programem umożliwiającym zapis obrazu bloków na dysk. Przed zapisem obrazu może być konieczne wcześniejsze sformatowanie karty w formacie 'USB-FDD mode', stąd dołączony bootice.exe


    Życzę wszystkim zainteresowanym przyjemnego i udanego budowania miniaturowych gadających mierników, pozytywek dzwonków drzwiowych i innych zabawek.



    Boberov 2013





    Przepraszam za słabą jakość audio

    Cool? Ranking DIY
    About Author
    bobeer
    Level 28  
    Offline 
  • Texa Poland
  • #2
    drzasiek
    CNC specialists
    Ty widzisz cokolwiek na tym schemacie? :) Straszne, oczy można sobie popsuć gdybyś codziennie tak pracował.
    Co do samego projektu, to z pewnością bardzo ciekawy.
    Komunikaty dźwiękowe to bardzo dobra alternatywa dla buzzera, ale jednak ciągle w większości przypadków nie dla wyświetlacza. Nie wyobrażam sobie pracy w pracowni, gdzie każdy coś mierzy gadającym miernikiem :)
  • Texa Poland
  • #3
    SylwekK
    Level 32  
    Hehe, do Attiny13 również pałam miłością :D Projekt świetny! Sam chcę się w wolnej chwili wziąć za syntezę dźwięku przez uC, ale ten ciągły brak czasu...

    Z tego co widzę kanały wyjścia audio zrobiłeś na PWM w przeciwfazie, a jak by to się zachowywało na jednym kanale PWM względem masy? Dźwięk bardzo by na jakości ucierpiał (i nie chodzi mi tu o głośność, bo tę można podciągnąć w inny sposób) ?

    bobeer wrote:
    Format danych jak dla normalnych plików WAVE czyli intel najpierw LSB. Na zegarze procesora 16MHz można odtwarzać 16 bitowe sample o SR max 64kHz. Jednak ze względów praktycznych program używa samplowania 32kHz


    Chyba nie nadążam... To sample są 8-o czy 16-o bitowe(?) , bo pisząc "najpierw LSB" wychodzi, że z górnej połówki też korzystasz z kolei na PWM wyrzucasz 8 bitów.... czy to znaczy, że wysyłana jest najpierw jedna połówka na PWM a następnie druga czy tylko z LSB korzystasz?
  • #4
    bobeer
    Level 28  
    Quote:
    Z tego co widzę kanały wyjścia audio zrobiłeś na PWM w przeciwfazie, a jak by to się zachowywało na jednym kanale PWM względem masy? Dźwięk bardzo by na jakości ucierpiał (i nie chodzi mi tu o głośność, bo tę można podciągnąć w inny sposób) ?

    Na jednym kanale byłby problem ze stukaniem przy załączaniu napięcia a tego chciałem uniknąć bo by mnie to wnerwiało :)
    Trzeba by użyć kondensatora do odseparowani połowy napięcia
    Trzeba by użyć cewki do odfiltrowania 64kHz - dużo miejsca by one zajęły
    Jeżeli nie chcemy cewki i kondensatora, to trzeba zrobić wzmacniacz mostkowy w klasie analogowej, ale za to dostajemy jeden wolny pwm który możemy użyć do poprawy rozdzielczości (ale do puki nie zwiększymy zegara to poprawa nie będzie zbyt duża)
    Quote:

    Chyba nie nadążam... To sample są 8-o czy 16-o bitowe(?) , bo pisząc "najpierw LSB" wychodzi, że z górnej połówki też korzystasz z kolei na PWM wyrzucasz 8 bitów.... czy to znaczy, że wysyłana jest najpierw jedna połówka na PWM a następnie druga czy tylko z LSB korzystasz?

    Dane są zapisane na SD w 16bit, ale pwmy wykorzystują tylko MSB
    (można to łatwo wywnioskować z kodu programu)
  • #6
    manekinen
    Level 29  
    Ok, jestem pod wrażeniem, również uwielbiam te maleństwa, tylko że męczę je na bascomie :) Fajnie że to pokazałeś może więcej osób zastanowi się dwa razy zanim opublikuje lampke rgb na atmega8, o zgrozo. Widziałem już różne cuda na attony13 (np gre z graficznym lcd od nokii) ale obsługa kart sd... co prawda bez obsługi systemu plików, no bo jak, ale... ho ho ho :)

    bobeer wrote:
    Bo jak wyjaśnić, że kartę SD w tryb SPI można zainicjować bez zmian stanu CS, i może on spokojnie przez cały czas pracy karty pozostać połączony do masy nawet podczas startu? W dokumentacji nic nie pisze żeby było to możliwe, a jednak.

    I z iloma kartami było to testowane?

    Wykorzystaj tę "zaletę" niestabilizowanego zasilania i zastosuj oversampling dla ADC, jeśli by się przydała większa rozdzielczość.
  • #7
    bobeer
    Level 28  
    Quote:
    Póki co na razie BASCOM, a asembler na AVR u mnie dopiero w powijakach

    No też się męczyłem z bascomem przez czas pewien, i powiem Ci, że fajnie było zwłaszcza jak 51ki się programowało. Ale biorąc pod uwagę fakt, że AVRy mają tak maleńko instrukcji, szkoda marnować potencjał twórczy. Odkąd zacząłem pisać w ASM naprawdę poczułem się jak ryba w wodzie. A rzeczy które w bascomie obchodziłem na około (operacje na bitach np.) tutaj załatwia się kilkoma rozkazami. Jeśli już musisz w języku wysokiego poziomu pisać, to pomyśl raczej o C, basic nie ma żadnej przyszłości (a i przyjemność po pewnym czasie zamienia się męczarnie, bo to za wolno, bo to za mało miejsca, bo to nie wiadomo co kompilator wyprodukował ;) ). Chciałbym zachęcić wszystkich którzy lubią programować, a utknęli przy bascomie, do nie lękania się asemblera, bo to jedyna możliwość pełnego zapanowania nad procesorkiem, a przyjemność o wiele większa jak wiemy dokładnie co się dzieje. Niestety wymaga mimo wszystko troche więcej czasu od programisty, oraz znajomość wnętrza procesora (praktycznie nonstop pracujesz z datasheetem) chyba że masz dobrą pamięć i kojarzysz co w jakim rejestrze. Po pewnym czasie masz już zbiorek swoich makr i podprogramów i zaczyna się robić całkiem z górki :)
    Pozdrawiam
  • #8
    drzasiek
    CNC specialists
    bobeer wrote:
    Niestety wymaga mimo wszystko troche więcej czasu od programisty, oraz znajomość wnętrza procesora (praktycznie nonstop pracujesz z datasheetem) chyba że masz dobrą pamięć i kojarzysz co w jakim rejestrze.

    I właśnie dlatego warto znać assembler, ale programować w C.
    Po co męczyć się, skoro można napisać ładnie i szybko, a kompilator przełoży to na assembler równie dobrze co sam programista. No ale to nie o tym temat.
  • #9
    bobeer
    Level 28  
    Quote:

    I z iloma kartami było to testowane?

    Wykorzystaj tę "zaletę" niestabilizowanego zasilania i zastosuj oversampling dla ADC, jeśli by się przydała większa rozdzielczość.


    Sprawdziłem z kilkoma kartami:
    1. SD V1 64MB sundisk
    2. SD V2 2GB kingston
    3. SD V2 128MB nn
    4. SD V1 128MB nn

    nie wkładałem wprawdzie 8GB HC, ale myśle, że jak tamte działają, ta też powinna (oczywiście program nie obsłuży, bo tam jest bajtowe adresowanie), mówimy konkretnie o tym czy się karta odpali w trybie SPI z zmasowanym CS.

    Odnośnie oversamplingu, to słuszne spostrzeżenie, jak wrócę do tematu, to na pewno to sprawdzę, bo i tak trzeba zrobić uśrednienie pomiarów, ponieważ domowe źródła światła dają zmodulowany strumień. Można też przy okazji zwiększyć pojemność kondensatora przed ADC.

    Dodano po 3 [minuty]:

    Quote:
    Po co męczyć się, skoro można napisać ładnie i szybko, a kompilator przełoży to na assembler równie dobrze co sam programista

    Gdyby kompilator robił to tak samo dobrze, to nikt by nie używał asemblera ;)
    Ciekawe dlaczego nikt mi znany do tej pory nie zmieścił obsługi karty SD w 1kB kodu ;) ?
    No ale nie o tym temat ;)
  • #10
    drzasiek
    CNC specialists
    bobeer wrote:

    Gdyby kompilator robił to tak samo dobrze, to nikt by nie używał asemblera ;)
    Ciekawe dlaczego nikt mi znany do tej pory nie zmieścił obsługi karty SD w 1kB kodu ;) ?

    ad1. Są ludzie, którzy piszą w asm, bo uważają, że mają większą kontrolę nad sprzętem, albo nie umieją/nie lubią C :) Podobnie są ludzie piszący w C bo nie umieją/nie lubią asm.
    ad2. A co to za różnica czy w C czy w asm jeśli chodzi o wielkość kodu wynikowego?
    Dobrze napisany program w C może być nawet mniejszy, bo kompilator zna lepsze sztuczki niż nie jeden programista asm :)
    No ale nie o tym temat ;)
  • #11
    maniek1818
    Level 22  
    bobeer wrote:
    Najkorzystniej było by umieścić wszystkie wartości słów odpowiadające liczbą, jako pojedyncze frazy tekstu. [...] Wiąże się to jednak z niedogodności w postaci dużej ilości zajętej pamięci na karcie (zakładając 128kB na komunikat 65535x128kB = ponad 8GB !

    Nie wspominając o konieczności zabawy z przygotowaniem takiej liczby komunikatów.
    Projekt podobny do woltomierza z książki Programowanie mikrokontrolerów PIC w języku C, Tomasza Jabłońskiego. Jednak układy ISD są trudniej dostępne niż karta pamięci.

    drzasiek wrote:
    kompilator zna lepsze sztuczki niż nie jeden programista asm

    Ja osobiście znam programistów mądrzejszych od kompilatora :P
  • #12
    ADI-mistrzu
    Level 30  
    Mam pytanie:
    Jest zbudowana obsługa partycji oraz ich formatów? Czy dane są wgrywane na żywca na kartę bez formatu?

    Kiedyś napisałem bootloader który program pobierał z kart SD, obsługiwał partycje i format FAT. Przeszukiwał kartę i co lepsze, udało mi się zmieścić nawet szyfrowanie, ale zajęło to niemal całe 2kB.

    I tak się zastanawiam czy Tobie tez udało się upchnąć obsługę np. FAT'u w tym i resztę opcji.
  • #13
    Brzozza93
    Level 15  
    Nigdy nie pomyślałbym, że da się coś takiego zrobić na attiny 13. Szacun. A może tak zamiast karty SD zastosować szeregowy flash z serii 25...? Jeśli się dobrze poszuka (np. MS Elektronik) wyjdzie taniej. Znaleźć je można także jako kość BIOS-u na nowych płytach głównych. Ich zaletą jest mniejszy pobór prądu. Jeśli zabraknie miejsca na 8-bitowe sample, jest cała mnogość metod kompresji niewymagających wielkiej mocy obliczeniowej - np. CVSD który brzmi przyzwoicie już @ 24-32 kbit/s i nie wymaga żadnych "lookup tables" (można go przetestować w SoX-ie).
  • #14
    bobeer
    Level 28  
    Quote:
    A może tak zamiast karty SD zastosować szeregowy flash z serii 25

    Akurat przed SD oprogramowałem podobny dataflash 45DB161B, Zaletą tego rozwiązania było by uproszczenie programu - myślę, że ze 200B mniej. Procedury inicjalizacji karty SD jednak trochę zabierają. Niestety rozwiązanie z taką pamięcią jest nieekonomiczne. 4MB to koszt w najlepszym razie 5zł. Za 5zł dostajesz 2GB pamięci na SD. karty 128MB to koszt 1zł.
    Przy 45DB161 z tego co pamiętam był jeden haczyk (albo ja źle interpretowałem dane z noty atmela) mianowicie, wersji 45DB161 (bez B na końcu) brakuje rozkazu sekwencyjnego odczytywania pamięci i po każdym odczycie sektora trzeba by było jeszcze raz wysyłać rozkaz adresowania, co znacząco obniżało by w pewnych zastosowaniach szybkość.
    Ale jest jedna dziedzina w której Dataflash bierze górę nad kartą.
    SD w spoczynku pobiera min 200uA (różne karty różnie 200-400). Więc w urządzeniach bateryjnych trzeba by mu odłączać zasilanie, co znowu przekłada się na zmarnowany czas na inicjalizację (rośnie znacząco pobór prądu takiego mikromocowego systemu).
    Dataflash po wykonaniu operacji pobiera kilka uA. I jest cały czas gotowy do działania. Na dodatek 45DB161B który testowałem bardzo łatwo było zawiesić (miał podobny problem jak ATMEGA88 z wejściem reset), ale to temat na inną okazję.
  • #15
    Andrzej_;)
    Level 14  
    Przepraszam za lamerskie pytanie....ale czy któryś z kolegów mógłby dokładnie wytłumaczyć jak działa ten obwód z mosfetem?

    - domyślam się że chodzi o to, że po podaniu masy za pomocą przycisku procesor załącza tranzystor i podtrzymuje zasilanie.....ale po co te diody itd?
  • #16
    SylwekK
    Level 32  
    bobeer wrote:
    (miał podobny problem jak ATMEGA88 z wejściem reset)


    A możesz coś więcej napisać o tym problemie, bo lubię tą megę, a (odpukać) jeszcze nic mi się dziwnego nie działo z programami pod tym prockeim.
  • #17
    Jatsekku2
    Level 12  
    A kiedy wartość jest odczytywana, co jakiś czas, czy podczas zmiany wartości, czy może jakieś wyzwalanie ?
  • #18
    bobeer
    Level 28  
    SylwekK wrote:
    bobeer wrote:
    (miał podobny problem jak ATMEGA88 z wejściem reset)


    A możesz coś więcej napisać o tym problemie, bo lubię tą megę, a (odpukać) jeszcze nic mi się dziwnego nie działo z programami pod tym prockeim.


    Some parts may get stuck in a reset state when a reset signal is applied when the
    internal reset state-machine isin a specific state. The internal reset state-machine is
    in this state for approximately 10 ns immediately before the part wakes up after a
    reset, and in a 10 ns window when altering the system clock prescaler. The problem
    is most often seen during In-System Programming of the device. There are theoreti-cal possibilities of this happening also in run-mode. The following three cases can
    trigger the device to get stuck in a reset-state:
    - Two succeeding resets are applied where the second reset occurs in the 10ns win-dow before the device is out of the reset-state caused by the first reset.
    - A reset is applied in a 10 ns window while the system clock prescaler value is
    updated by software.
    - Leaving SPI-programming mode generates an internal reset signal that can trigger
    this case.
    The two first cases can occur during normal operating mode, while the last case
    occurs only during programming of the device

    Dodano po 2 [minuty]:

    Andrzej_;) wrote:
    Przepraszam za lamerskie pytanie....ale czy któryś z kolegów mógłby dokładnie wytłumaczyć jak działa ten obwód z mosfetem?

    - domyślam się że chodzi o to, że po podaniu masy za pomocą przycisku procesor załącza tranzystor i podtrzymuje zasilanie.....ale po co te diody itd?


    Diody są potrzebne do zamienienia impulsów z portu clk na napięcie stałe na bramce mosfeta. Druga sprawa to odseparowanie masy układu od źródła mosfeta. Gdyby spróbować połączyć obie masy (mam tutaj na myśli fakt odseparowania mosfeta od części procesorowej poprzez kondensator 2n2), to tranzystor nie otwierał by się do końca i układ pobierałby 100uA-1mA prądu.

    Dodano po 2 [minuty]:

    Jatsekku2 wrote:
    A kiedy wartość jest odczytywana, co jakiś czas, czy podczas zmiany wartości, czy może jakieś wyzwalanie ?


    Procesor odczytuje napięcie na początku programu.
    Ale jeśli wymusisz cały czas napięcie zasilania (trzymasz przycisk itp), to co 4 sekundy WDT restartuje program i cały cykl się powtarza.
  • #19
    szulat
    Level 23  
    Jak na 1K to naprawdę genialne!

    Czy trik z podziałem 16 bit na dwa pwm o różnej "mocy" rzeczywiście polepsza jakość tak że to "słychać"? ja się bawiłem tylko prostym 8bit i odniosłem wrażenie że pogorszenie jakości dźwięku z samego faktu użycia pwm i konieczności filtrowania jest na tyle duże że kwantowanie do 8bit nie już takiego dużego znaczenia.

    A metoda przypomina mi mechanizm generowania dźwięku 14 bitowego na amidze (gdzie były przetworniki tylko 8 bit) :)
  • #20
    bobeer
    Level 28  
    Quote:
    Czy trik z podziałem 16 bit na dwa pwm o różnej "mocy" rzeczywiście polepsza jakość tak że to "słychać



    To jest próbka z ATMEGA16 z zegarem 35MHz i zsumowanymi pwmami. Program pobiera dane bez udziału bufora prosto z karty SD


    To samo, z buforem zegar 25MHz piszczenie to aliasing spowodowany bezpośrednim podaniem sygnału do karty w kompie, normalnie go nie słychać

    Zamiast pwm użyty TDA1545 bez buforowania próbek

    Orginał (Józef Skrzek Pamiętnik Karoliny remastered).

    Ośmiobitowych próbek nie mam, ale słychać wyraźnie, że takie dodanie LSB do MSB poprawia nieco jakość. Napisałem nieco, bo w rzeczywistości S/N jeszcze daleko do rzeczywistej jakości 16bit. Oceniam poprawę na jakieś 11 może 12bit realnego dac-a takiego składanego sampla z 2x pwm. W każdym razie, im szybszy PWM tym lepiej dla jakości.

    (Linki dałem do swojej strony, bo nieszczęśliwie serwer elektrody nie obsługuje plików wave a nie chciałem kompresować wiadomo dlaczego)
  • #21
    Freddy
    Level 43  
    Nie przesadzasz z tym zegarem 35MHz ?
  • #22
    szulat
    Level 23  
    bobeer wrote:
    Ośmiobitowych próbek nie mam, ale słychać wyraźnie, że takie dodanie LSB do MSB poprawia nieco jakość

    dzięki, właśnie o takie porównanie chodziło.
    zdecydowanie lepiej niż próbki 8 bitowe!
  • #23
    bobeer
    Level 28  
    Quote:
    Nie przesadzasz z tym zegarem 35MHz ?

    Eksperymentalnie AMTEGA16 poszła na takim zegarze (akurat miałem dwie sztuki obie działały) nawet z użytkowaniem usart i innych peryferiów. Ale stabilna praca bez przekłamań kończy się na około 25MHz.
    (Proszę nie rozwijać wątku w kierunku przetaktowywania procesorów)
  • #24
    aneuron
    Level 12  
    A na ATTiny85 też DIP8 z 8kB na program i 512B SRAM by nie dało radę tego uruchomić?
    Może nie ma co się ograniczać do 1kB pamięci programu, bo cena tych ATTiny85 też niewielka.

    Oczywiście trzeba by chyba przepinować, więc nie wiem czy nie lepiej jednak w C mieć oprogramowanie, bo łatwiej może później przenieść na inny uP... a wynikowy kod z listingu asemblera oczywiście tak czy inaczej zawsze się pobieżnie przegląda, coby zobaczyć co takiego sprytnego kompilator wygenerował i czy nie ma gdzieś jakiś błędów w kodzie C, kiepskich przypisań, braku rzutowania itp, itd.

    Bo bez karty SD chyba nie za bardzo da rady coś zsyntezować sensownie?

    BTW:
    drzasiek wrote:
    Ty widzisz cokolwiek na tym schemacie? :) Straszne, oczy mo¿na sobie popsuæ gdyby¶ codziennie tak pracowa³.

    Wystarczy ten obrazek otworzyć w darmowym GIMPIE np. i w zakładce "Colors" wybrać "Value Invert", dostajemy coś takiego co ładnie się drukuje i już widać czarno na białym jak to jest zrobione :)
    Tiny Gad A- żegnajcie nudne wyświetlacze ;)