Witam,
Buduję rejestrator ADC z zapisem/odczytem na kartę SD.Układ oparty jest na procesorze Atmega 1284P. Taktowany jest zewnętrznym kwarcem 16MHz. Cały układ pracuje na napięciu 5V poza kartą SD (zasilanie 3.3V + 74LCV125D). Od strony elektronicznej-hardware'owej wszystko pracuje prawidłowo, problemem jest oprogramowanie.
Urządzenie składa się z wyświetlacza, potencjometrów (ADC), przycisków zrobionych na drabince rezystorów oraz podświetlania przycisków za pomocą diód led.
Wyświetlacz 4x40 i podświetlanie przycisków mam zrobione na 3 rejestrach przesuwnych. Dane wysyłam za pomocą sprzętowego SPI.
Na sprzętowym SPI mam również podłączoną kartę SD, na którą chciałbym zapisywać dane.
Na karcie SD chciałbym rejestrować sygnał z 5 kanałów ADC w krótkich odstępach czasowych( np. co 1ms – zależy mi na dokładności) i zapisywać je na karcie SD w formacie .csv. Później chciałbym te dane odtwarzać i sterować wypełnieniem wyjść PWM z taką samą prędkością jak zapis nie zakłócając tym samym pracy wyświetlacza, czy też podświetlania klawiszy.
Udało mi się zainicjować bibliotekę FatFS od Elm-chana. Przetestowałem ją i działa mi zapis na kartę, jak również odtwarzanie na przykładzie ze strony elm-chana z konsolą po RS232.
Poradziłem sobie z odpaleniem wszystkiego razem, działającym przełączaniem kanałów SPI, LCD przyciski itp.
Wszystko działa poza poprawnością zapisu z buforów na kartę.
Szczegółowe założenia jakimi się kierowałem:
Chciałbym zapisywać wartości poszczególnych kanałów adc w przerywaniach ADC do buforów. Gdy skończy się zapis danych z kanałów adc do bufora 1 rozpoczyna się zapis na kartę SD z bufora 1 i w trakcie zapisu na kartę wykonywany jest zapis wartości adc do bufora 2. Gdy skończy się zapis na kartę SD z bufora 1 następuje zapis na kartę z bufora 2 oraz zapis wartości z adc do bufora 1. No i tak w kółko dzięki ustawianiu odpowiednich flag o przepełnieniu bądź o zezwoleniu na zapełnianie się poszczególnych buforów.
W tym celu stworzyłem przykładową ramkę danych buforów o rozmiarze 512 w których zapisywane mają być wiersze/pomiary - (493 komórki) wyglądające w następujący sposób:
Aktualnie zapis działa jednak w taki sposób, że gdy kręcę potencjometrem wartości adc zmieniają się w zapisie co 17 wierszy (czyli co bufor) skokowo choć czasem zdarzy się zapis różnych wartrości w 17 pomiarach w buforze 1 lub 2 . Chciałbym uzyskać w poszczególnych wierszach bufora również wartości pomiędzy tymi skokami. Poniżej przykład zapisywanych danych obecnie:
ADC mam ustawione następująco:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Pomiędzy kanałami ADC przełączam się po przez funkcję switch(channel) w przerywaniach od ADC. Przełączanie i zapisywanie do zmiennych adc0,adc1,adc2...itd działa poprawnie.
Mam wrażenie, że przerywania (od ADC) za szybko zapełniają bufory.
Zależy mi na zapisie ok 1000 wierszy danych na sekundę lub więcej nie tracąc wartości pośrednich tak jak dzieje mi się teraz.
Proszę Was o odpowiedz na pytania:
Kiedy zapisywać dane do buforów i gdzie najlepiej to wykonywać czy w przerywaniach czy w pętli głównej?
Jeśli w przerywaniach to: Czy zapełnianie bufora 1 i 2 mam wykonywać w przerywaniach od ADC czy np od Timera?
Czy przetwornik ADC powinien być ustawiony w tryb Free Running Mode?(gdzieś na forach znalazłem taką podpowiedź)
Myślałem również nad buforami kołowymi i kolejkach FIFO....ale nie wiem czy w moim przypadku jest to konieczne.
Bardzo proszę o wskazówki i pomoc.
P.S.
Przeglądałem projekt Pana Mirka - Wav recordera i wiem, że prędkość z częstotliwością 1kHz jest jak najbardziej osiągalna.