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.

Atmega32 - Przerwania ADC i zapis na kartę SD

core2k 19 Lis 2012 22:36 1272 7
  • #1 19 Lis 2012 22:36
    core2k
    Poziom 2  

    Mam taki problem wykonuje pomiar co 2ms i chce go zapisać na kartę SD. Z moich obliczeń wynika że pojedynczy zapis na kartę SD trwa ok. 40ms. Jak zapisywać w czasie rzeczywistym te pomiary ?. Ktoś polecił mi żebym stworzył dwa buffory. Tylko nie za bardzo wiem jaka by miała być zasada działania takiego rozwiązania. Czytałem trochę o "Cirual Buffer" ale nie za bardzo to rozumiem.

    Byłbym wdzięczny za pomoc.

    0 7
  • #2 19 Lis 2012 22:48
    piotrva
    Moderator na urlopie...

    Ale pojedynczy zapis czego na kartę SD trwa te 40ms? Jednej paczki danych z pomiarów? Jaki jest całkowity czas, w którym próbkowanie ma być wykonywane bez przerwy co te 2ms?
    Moim zdaniem trzeba realnie określić czas pomiaru, dane zrzucać do dodatkowej (odpowiednio dużej) pamięci RAM, i potem po serii pomiarów zatrzymywać dalsze i dane z RAM przepisywać na SD. Nawet milion buforów kołowych nie zniweluje Ci różnicy czasu, więc to jest zły trop.

    0
  • #3 19 Lis 2012 23:11
    core2k
    Poziom 2  

    Tak przerwanie ma być wykonywane bez przerwy co 2ms. Zapis jednego pomiaru trwa ok 40ms. Czyli nie da się w ten sposób tego zrobić ?

    0
  • #4 19 Lis 2012 23:29
    excray
    Poziom 39  

    core2k napisał:
    Tak przerwanie ma być wykonywane bez przerwy co 2ms. Zapis jednego pomiaru trwa ok 40ms. Czyli nie da się w ten sposób tego zrobić ?

    Jesteś tego absolutnie pewien? "Zapis jednego pomiaru trwa 40ms", czy "zapis trwa 40ms"? To kolosalna różnica. Bo w tym drugim przypadku zapisać możesz "naście pomiarów" za jednym zamachem. I wtedy nie ma problemu.

    0
  • #5 19 Lis 2012 23:33
    piotrva
    Moderator na urlopie...

    Nie ma szans. Chyba że zapis np. 100 pomiarów na raz zajmie mniej niż 200ms równolegle z prowadzeniem pomiarów (czyli prowadzenie pomiaru nie wydłuża czasu zapisu).
    Bo jak na razie masz sytuację - do bufora ładujesz co 2ms dane, a kasujesz na drugim końcu co 40ms. Czyli po każdych 40ms do bufora wpisałeś 20 pomiarów, a zdjąłeś tylko jeden. W ten sposób co 40ms przyrasta Ci 19 pomiarów, licząc na każdy 10-bitowy jedną zmienną 16-bit mamy 38 bajtów/40ms, czyli 950 bajtów na sekundę Ci przyrasta w buforze, (liczę wszystko dla sytuacji, w której pomiar nie wydłuża zapisu na kartę SD ani o 1 ns). Czyli pamięć m32 masz zapapcianą po nieco ponad 2s (licząc, ze wszystko inne Ci nie zajmuje ramu).

    Jak dołożysz zewnętrzny ram to też masz tę samą sytuację - w końcu po n sekundach masz n*950 bajtów oczekujących na zapis, i teraz licząc nawet, że nie robimy zapisu na sd w trakcie pomiarów, to mamy 1000*n bajtów na sekundę, czyli dla prowadzenia pomiaru przez minutę musisz zapewnić sobie pamięć ram o rozmiarze 64kB (starczy na nieco ponad 65 sekund). Po tym czasie musisz i tak pomiar przerwać i wszystko zapisać na kartę SD.

    A jeśli można spytać, co to za projekt?

    Dodano po 2 [minuty]:

    excray napisał:
    core2k napisał:
    Tak przerwanie ma być wykonywane bez przerwy co 2ms. Zapis jednego pomiaru trwa ok 40ms. Czyli nie da się w ten sposób tego zrobić ?

    Jesteś tego absolutnie pewien? "Zapis jednego pomiaru trwa 40ms", czy "zapis trwa 40ms"? To kolosalna różnica. Bo w tym drugim przypadku zapisać możesz "naście pomiarów" za jednym zamachem. I wtedy nie ma problemu.

    Tak, dokładnie mnie Kolega innymi słowami uprzedził w pytaniu ;-)

    0
  • #6 19 Lis 2012 23:53
    tmf
    Moderator Mikrokontrolery Projektowanie

    Panowie, skoro to karta SD to zapis strony (czyli 512 bajtów) trwa tyle ile trwa (może właśnie te 40 ms) + transfer. W takim wypadku czasu ma aż nadto. Czyli trzeba zrobić dwa bufory po 512 bajtów. Do jednego co 2 ms zapisuje ADC, w tym czasie (a mamy 512 ms) drugi bufor jest zapisywany na SD. Po wypełnienu pierwszego robimy przełączenie ADC na drugi bufor, a pierwszy zrzucamy na SD i tak w kółko.

    0
  • #7 20 Lis 2012 00:38
    GSM
    Poziom 25  

    Ja zaproponuję inne rozwiązanie (mniej pamięciożerne z punktu widzenia mikrokontrolera).
    Potrzebujemy bufor o wielkości wystarczającej na czas zapisu na kartę SD i komunikację z nią -> >=20 zapisów = 80 bajtów (zakładając 2b/pomiar).
    Pomiary wysyłamy stale do karty SD (jej bufora strony), po wysłaniu 512 bajtów, rozpoczynamy zapis na kartę, w trakcie jego trwania zapisujemy pomiary do bufora w RAM-ie mikrokontrolera. Po ukończeniu zapisu, zawartość lokalnego bufora wrzucamy do bufora karty i zaczynamy zabawę od początku.
    Minus jest taki, że jeśli karta by miała problemy (zapis nieudany), to tracimy ileś próbek.
    Oczywiście w m32 pamięci RAM jest dostatek. Można więc, tak jak kolega powyżej zasugerował, zrobić dwa bufory - rozwiązanie bezpieczniejsze. Jednakże nie zawsze mamy do dyspozycji tyle RAM-u.

    Kolega zapisuje bezpośrednio na kartę czy z użyciem jakiegoś (FAT) systemu plików?

    Pozdrawiam,
    GSM

    0
  • #8 20 Lis 2012 09:27
    mirekk36
    Poziom 42  

    Dokładnie takie rozwiązanie jak napisał wyżej już tmf, czyli np dwa bufory po 512 bajtów najspokojniej w świecie wystarczy do takiego celu o jaki pyta autor wątku. Powiem więcej, wykonywanie pomiarów co 2 ms to STRASZNIE POWOLNY proces i wystarczyłyby nawet dwa bufory po 256 a nawet po 128 jak nie 64 bajty żeby dokonywać zapisów na kartę SD i to jeszcze z użyciem FAT32. Poza tym do takiego celu wystarczyłaby zwykła nawet stara i powolna karta pamięci.

    A jeśli użyć szybkich kart pamięci np "Class 10", to można zapisywać na kartę bez przeszkód nawet dane próbkowane z częstotliwością 6kHz i nawet większą (nawet do 9kHz - 12kHz) bez żadnych strat. Poza tym im wyższa częstotliwość można zwiększyć nieco ilość tych buforów np 3x512 albo 4x512 i zrobić do nich dostęp cykliczny.

    Na dowód tego proszę sobie zobaczyć LINK, gdzie przy użyciu zwykłego procka ATmega644P oraz FatSF można zrobić nagrywanie na kartę pamięci dźwięków z próbkowaniem 9 kHz. (a nawet więcej). Cóż więc znaczy zrobienie tego z próbkowaniem 500Hz czyli 2ms ????

    dwa bufory i po sprawie - żaden, nawet najmniejszy kłopot i to z użyciem FAT32.

    Reasumując, w przerwaniu co 2ms odczytujesz próbki z ADC i zapisujesz je kolejno do pamięci RAM, podzielonej na 2 bufory. Gdy skończy się zapis do pierwszego bufora, w pętli głównej rozpoczynasz zapis na kartę pamięci tego pierwszego bufora, a w tym czasie przerwanie napełnia próbkami drugi bufor. Gdy napełni się drugi bufor próbkami, to cykl się powtarza, w pętli głównej rozpoczynasz zapis na kartę tego bufora, a w przerwaniu już rozpoczynasz zapis nowych próbek do pierwszego bufora. To bardzo ładnie działa.

    0