logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C] PetitFat jak dopisać dane do końca / początku pliku

oskar777 23 Sty 2012 20:06 3043 13
REKLAMA
  • #1 10438791
    oskar777

    Poziom 26  
    Witam Was mam taki problem z którym nie mogę sobie poradzić.
    Po wielu bojach udało mi się uruchomić PetitFat na atmega32
    Kod w skrócie wygląda tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod działa ale niestety przy każdym nowym uruchomieniu układu dane są nadpisywane.

    Druga sprawa po zapisie danych ostatni wiersz to kilkadziesiąt NULL
    Wiem, że trzeba skorzystać z pf_lseek ale w, którym miejscu? Jak wtedy będzie wyglądało pf_write(0,0,&br); gdzie ono będzie i czy w ogóle będzie?.

    Będę bardzo wdzięczny za pomoc w tym.

    Pozdrawiam
    Oskar
  • REKLAMA
  • #2 10438964
    polprzewodnikowy
    Poziom 26  
    Nie wiem czy to zadziała ale spróbuj szukać końca pliku. Pamiętaj że w PetitFs nie możesz rozszerzać pliku.
  • #3 10439142
    oskar777

    Poziom 26  
    To wiem chodzi o to jak to zrobić poprawnie, jeden zapis do 26 bajtów, mam po zapisie 10 260 bajtów teoretycznie zajęte wiec pf_lseek(261); powinno działać, niestety nie działa.
    Bardziej mi chodzi o działający fragment kodu, może ktoś ma...poczekam :/
  • #4 10439197
    polprzewodnikowy
    Poziom 26  
    Ty chcesz dopisać dane do końca pliku? Spróbuj może tak:
    res = pf_lseek(fs.fsize);
  • REKLAMA
  • #5 10439264
    oskar777

    Poziom 26  
    zapisuje np 10 pomiarów = 10 wierszy, po 10-tym wierszu chce dodać kolejne. Tak to się przedstawia.

    Naprawdę nikt nie wie jak zaktualizować plik? :(
  • Pomocny post
    #6 10448740
    aaadamw
    Poziom 16  
    a dlaczego nie użyjesz FatFS? Daje trochę więcej możliwości.

    a tu masz coś do Petit:
    pf_write(bufor, sizeof(bufor), &s1);

    z tego co pamiętam zmienna s1 mówi o pozycji w której ma być zapisana zmienna bufor. więc po ponownym uruchomieniu s1 jest resetowana i zawsze masz tu tą samą wartość.
    przed zapisem danych trzeba użyć pf_lseek(xxx) gdzie xxx to koniec porzedniego zapisu. xxx musisz zapisywać do epromu lub na początku danych na karcie po zapisie, a potem odczytywać przed kolejnym zapisie.
    dawno nie bawiłem się petitem więc mogę się mylić
  • #7 10449086
    oskar777

    Poziom 26  
    Dzięki za informacje, jutro będę testował to, co do fatfs może mi brakować miejsca.
    Przez koniec zapisu rozumiem to co mi wypluje &s1?, używając ją gdzieś ostatni raz w jakimś cyklu zapisów ?
  • #8 10449136
    mirekk36
    Poziom 42  
    aaadamw napisał:

    z tego co pamiętam zmienna s1 mówi o pozycji w której ma być zapisana zmienna bufor. więc po ponownym uruchomieniu s1 jest resetowana i zawsze masz tu tą samą wartość.


    To kolega coś bardzo bardzo źle pamięta. Tymczasem tu nie trzeba nic pamiętać, wystarczy zajrzeć do dokumentacji PetitFat na stronie autora, żeby zobaczyć, że w s1 nie ma być nic zapisane, tylko funkcja zwraca w niej ilość fizycznie odczytanych albo zapisanych (w przypadku operacji zapisu) bajtów

    aaadamw napisał:
    przed zapisem danych trzeba użyć pf_lseek(xxx) gdzie xxx to koniec porzedniego zapisu. xxx musisz zapisywać do epromu lub na początku danych na karcie po zapisie, a potem odczytywać przed kolejnym zapisie.
    dawno nie bawiłem się petitem więc mogę się mylić


    Ale to - to już takie troszkę jakby nad zbyt nieuczesane myśli, bo z tej samej dokumentacji także jednoznacznie wynika, że przede wszystkim nie można dokonać zapisu jakiejś tam ilości bajtów na granicy sektorów. Tymczasem z opisu twojej zabawy wynika, że to nieistotne i że udało ci się zapisywać za pomocą Petit'a dane ciurkiem, przechodząc funkcją pf_lseek() właśnie bezboleśnie przez granice sektorów. A to niemożliwe, tzn te przejścia przez granice sektorów, bo sam zapis jest możliwy oczywiście.

    Co np się stanie wg twojego opisu gdy zechcę wykonać pf_lseek(xxx) gdzie xxx będzie równe 501, a ja chcę zapisać 35 bajtów ?
  • REKLAMA
  • #9 10449680
    oskar777

    Poziom 26  
    Może inaczej, da się dopisać dane czy nie, bo nie wiem czy czas marnować Wasz i mój. Przeszukałem to forum, avrfreaks, pseudo forum chana i nic nie znalazłem było kilka postów na ten temat ale nikt nie dał odpowiedzi na to jak dopisać dane do istniejącego pliku. Więc albo jest to nie wykonalne albo owiane wielką tajemnicą? :(
  • #10 10458083
    mirekk36
    Poziom 42  
    oskar777 napisał:
    Więc albo jest to nie wykonalne albo owiane wielką tajemnicą? :(


    Chyba bardziej to drugie ;)

    Ja właśnie pracuję nad zapisem na potrzeby logera, który będzie mierzył temperaturę co kilkanaście minut czy tam godzin i zapisywał ją wraz z godziną i datą do pliku za pomocą PetitFat'a.

    Tylko niestety będzie znowu hmmm pewne ograniczenie. Będzie trzeba zapewnić minimalny czas pomiędzy zapisami rekordu danych (o długości od 1 do 512 bajtów) na poziomie od kilku sekund przy niedużym pliku do kilkunastu sekund albo nawet kilkudziesięciu np 40-45 sekund przy zapisie do ogromnego pliku rzędu wielu wielu megabajtów..... Drugie ograniczenie będzie takie, że można będzie zapisywać TYLKO dane tekstowe a nie binarne. Za to zapis tekstowy umożliwi praktycznie wprost tworzenie plików *.csv, które później pięknie będzie można wczytywać od razu do Excela i np wykresy robić.

    Ale generalnie już są pierwsze fajne efekty i to nawet fajne jeśli nie potrzeba szybko po sobie dokonywać zapisów. Jak dopracuję to pokażę efekt końcowy w DIY ;)
  • #11 10458563
    sorex86
    Poziom 15  
    Zrobilem cos podobnego ale na FATFs. Pomiar co 1s, a nastepnie zapis na karte gdy uzbiera sie 512 znakow. Jednak zastanawia mnie jedna rzecz:

    Zgrubie:
    w 512 znakow = 60 pomiarow
    czyli co 1min zapis na karte.
    1 dzien = zapisow 1440
    7 dni = 10080

    po jakim czasie ubije karte?:)

    kwartale?
  • #12 10458585
    mirekk36
    Poziom 42  
    No na FatFsie to nie mia żadnego problemu, można i szybciej niż sekundę zapisywać - dużo szybciej. Ale coś za coś - ilość straconego miejsca we Flash jest bezwzględnie większa niż w przypadku PetitFat ;) ... Więc jeśli pomiary mają być co dłuższy okres czasu to w takim przypadku wolę właśnie Petitka...

    Nie ubijesz karty ani po kwartale ani po roku. Tyle tylko że warto się zastanowić czy to ma sens? tzn zapis co 1 s w tak długich okresach czasu. Do czego taka rozdzielczość czasowa 1 s w skali kwartału czy roku ???
  • REKLAMA
  • #14 10459728
    sorex86
    Poziom 15  
    Musze wykonać serie pomiarowe co min 1s - max 5s przez okres 2-7 dni.
    Większy problem mam z pomiarem temperatury,. Dokładność rzędu 1-2C dla 400C. Każde 0.25C temperatury jest bardzo cenne. Co najgorsze wygląda na to, że max6675 jest do tego za słaby, a jego nowsza wersja nie 12 tylko 14 bitowa nie jest jeszcze dostępna na ebay/allegro max31855 ... I tak wiecej niz -+2 nie osiagne bez linearyzacji. Fajnie by bylo znalesc scalak co ma kompensacje zimnych koncow i wyjscie napieciowe;P
REKLAMA