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.

atmega 328, karat SD 2GB - nie mogę zapisać większej ilości znaków do pliku txt

slasuc 13 Maj 2014 18:36 1086 5
  • #1 13 Maj 2014 18:36
    slasuc
    Poziom 8  

    Witam,

    korzystając z atmegi328 i Arduino IDE chciałem zrobić data logger. Ogólnie udało mi się (mała ilość znaków), ale kiedy dochodzi do zapisania większej ilości znaków do pliku txt poprzednie zostają zastąpione "krzaczkami", a na karcie pojawiają się pliki o dziwnych nazwach i rozszerzeniach. Poniżej kod programu oraz treść pliku data2.txt i zawartość karty:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    atmega 328, karat SD 2GB - nie mogę zapisać większej ilości znaków do pliku txt

    zawartość pliku:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Strzelam, że mam do czynienie z jakimś przepełnieniem pamięci/bufora. Po prostu plik już ma za dużo znaków, które się nie mieszczą w pamięci uC i stąd "wykrzaczanie". Jestem początkujący i proszę o pomoc. W czym tkwi problem? Jak mógłbym zapisać w pliku 345600 (4 razy na sekundę przez dobę) odczytów wejścia analogowego?

    Dodam jeszcze, że używam karty SD EMTEC 2GB, sformatowanej: system FAT, rozmiar jed. alokacji 32KB.

    0 5
  • #2 14 Maj 2014 16:05
    slasuc
    Poziom 8  

    Problem rozwiązany. Nie wiem co było jego przyczyną, ale po przepisaniu programu i połączeniu płytki na nowo wszystko "sztymuje".

    0
  • #3 14 Maj 2014 18:32
    Brutus_gsm
    Poziom 25  

    Powodem może być złe zasilanie układu lub nieodpowiednie połączenie uC<->SD. Warto dokładnie przyjrzeć się temu problemowi, żeby później nie wrócił w najmniej odpowiednim momencie. Nie napisałeś nic o schemacie układu.

    0
  • #4 14 Maj 2014 19:07
    slasuc
    Poziom 8  

    Połączyłem uC do karty SD tak (bez rezystorów podciągających):

    uC <-> SD:
    19 <-> 5 (SCK)
    18 <-> 7 (MISO)
    17 <-> 2 (MOSI)
    16 <-> 1 (chip select)
    GND <-> 3
    GND <-> 6
    VCC (3V3) <-> 4

    Do zasilania układu używam modułu zasilającego od LC Technology, takiego jaki jest w zestawach dla początkujących. Ale przyznaję bez bicia, że nie filtruje zasilania kondensatorami tak jak to powinno być zrobione :oops: Tutaj nie szukałbym błędu ponieważ dla mniejsze ilości tekstu (kilkadziesiąt lini) wszytko działało.

    Myślę, że błędu trzeba szukać w programie. Przepisany wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I teraz wszystko gra. Na karcie powstaje plik zawierający kilkaset linii (kilkadziesiąt KB) i żadnych anomalii.

    Przyczyną najprawdopodobniej jest to, że w wersji pierwszej, której dotyczył problem umieściłem linię:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    przed:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    A dokumentacja biblioteki wyraźnie mówi:
    Cytat:
    Note that even if you don't use the hardware SS pin, it must be left as an output or the SD library won't work.


    Co o tym myślisz? Czy zidentyfikowałem swój błąd poprawnie?

    0
  • #5 14 Maj 2014 19:23
    Brutus_gsm
    Poziom 25  

    slasuc napisał:
    Tutaj nie szukałbym błędu ponieważ dla mniejsze ilości tekstu (kilkadziesiąt lini) wszytko działało.

    To nie ma znaczenia. Błędy wynikające z niepoprawnego zasilania pojawiają się w najmniej spodziewanym momencie. Być może rozwiązałeś jeden problem, ale pojawić się ich może jeszcze kilka i znowu będziesz spędzał długie godziny na ich rozwiązanie. A wystarczy kilka elementów.

    Problem zapewne wynikał faktycznie z braku ustawienia pinu jako wyjściowy, ale po co stwarzać sobie dodatkowe możliwości do potencjalnych błędów?

    0
  • #6 14 Maj 2014 20:07
    slasuc
    Poziom 8  

    Brutus_gsm napisał:
    Problem zapewne wynikał faktycznie z braku ustawienia pinu jako wyjściowy, ale po co stwarzać sobie dodatkowe możliwości do potencjalnych błędów?


    Na pewno to poprawię, tymczasem problem jest rozwiązany. Temat można zamknąć.

    0