Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 14 lip 2025, o 10:57


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
    Autor Wiadomość
    PostNapisane: 10 paź 2016, o 23:47 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    Witajcie.
    Napisałem funkcję do zapisu do EEPROM i odczytu z EEPROM.
    Problem w tym, że nie mogę sobie poradzić z odczytem z EEPROMa aż do wystąpienia znaku '\0'

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Mając takie funkcje można je wywołać np tak:w Setup zapis, a w LOOP odczyt
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    o ile zapis działa poprawnie to odczyt działa ale tylko dla pierwszych 10 znaków. Przecież funkcja do ... while najpierw wykonuje działania a potem sprawdza czy "string[i]!='\0'" jest NULL - tutaj wychodzi że jest inaczej.
    Niestety zmieniając formułę na
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    funkcja się zawiesza

    Tak docelowo to jeszcze inaczej zrobiłbym tą funkcję, ale po takiej zamianie w ogóle nie działa, a powinna zwrócić wskaźnik na początek łańcucha.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    No i na koniec pytanie o Arduino MEGA2560. Ile to ma pamięci EEPROM? W nocie jest podane że tylko 4KB czyli 4096bajtów.
    A próbując zapisać pod komórką 4097 zapisuje poprawnie, nawet pod adresem 5000000000 też zapisuje i odczytuje poprawnie.



    Ostatnio edytowano 11 paź 2016, o 14:55 przez iwi, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 06:56 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Po pierwsze ciągi znaków deklaruje się jako:
    char napis[] = "Ten napis zapisujemy do pamieci EEPROM";
    i to zdecydowanie nie to samo co:
    char * napis = "Ten napis zapisujemy do pamieci EEPROM";

    Po drugie w Twojej pętli:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    inkrementacja i występuje przed sprawdeniem waruknu, więc w ten sposób raczej nie sprawdzisz ostatnio odczytanego znaku (co było, jak się domyślam, Twoim zamiarem).

    Po trzecie w ostatniej funkcji:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    deklarujesz wewnątrz funkcji niezainicjowany wskaźnik do char, a później zapisujesz dane do lokalizacji, którą ten wskaźnik określa. Jak myślisz, gdzie te dane są zapisywane?

    A tak w ogóle kompilator nie dawał Ci żadnych ostrzeżeń?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 09:01 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    andrews napisał(a):
    A tak w ogóle kompilator nie dawał Ci żadnych ostrzeżeń?

    Nie ma żadnych ostrzeżeń w środowisku Arduino 1.6.2

    Myślałem że nie ma różnicy między *napis a napis[]. Zresztą parę dni temu oglądałem poradnik C++ odc 8 o stringach gdzie jest pokazany ten zapis jako równoważny.
    Niemniej obie wersje działają. Wyczytałem teraz że jeśli zapiszę
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    to teraz oprócz odczytu mogę robić zapis i zmianę tego napisu na inny, a jak zapiszę
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    to odczyt będzie działał, ale nie mogę tego napisu podmienić na inny.
    andrews napisał(a):
    inkrementacja i występuje przed sprawdzeniem warunku, więc w ten sposób raczej nie sprawdzisz ostatnio odczytanego znaku (co było, jak się domyślam, Twoim zamiarem).

    Tylko jak to obejść - jak dam inkrementację wcześniej to zacznie czytać od drugiej komórki, a tak jak jest to odczyta całego stringa bez znaku NULL - więc to mi wystarczy bo ten znak potem na końcu można dopisać. Tylko to tak teoretycznie bo muszę sprawdzić czy po zamianie na zmienną tablicową będzie to działać.


    Co do tej funkcji ostatniej to na razie się nią nie zajmuję bo w sumie nie ma znaczenia czy będę ten napis odczytywał w sposób taki czy taki, ważne aby działało a na razie nie działa.

    I jeszcze pytanie co do wielkości pamięci. dla uproszczenia - załóżmy że mamy Atmegę 8 z 512bajtowym EEPROM.
    Czy jeśli zrobię zapis do adresu 600 to zapisze do komórki (600-512) czyli defakto do 88 komórki pamięci



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 09:51 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    iwi napisał(a):
    Tylko jak to obejść - jak dam inkrementację wcześniej to zacznie czytać od drugiej komórki

    Możesz spróbować np. tak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    i myślę, że raczej niczego nie będziesz musiał dopisywać ;)

    iwi napisał(a):
    I jeszcze pytanie co do wielkości pamięci. dla uproszczenia - załóżmy że mamy Atmegę 8 z 512bajtowym EEPROM.
    Czy jeśli zrobię zapis do adresu 600 to zapisze do komórki (600-512) czyli defakto do 88 komórki pamięci

    Nie wiem do czego potrzebna Ci ta informacja. Na pewno nie zapiszesz niczego do adresów większych od pojemności pamięci EEPROM zadeklarowanej przez producenta w dokumentacji ;), choćby dlatego, że rejestr adresowy pamięci EEPROM (EEAR) ma maskowane bity powyżej pojemności pamięci, więc cokolwiek byś tam spróbował wpisać, adresem będzie zawsze pozostałość z dzielenia Twojego adresu przez pojemność pamięci EEPROM.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 11:14 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2596
    Pomógł: 129

    Nie wiem jak w Atmedze (obstawiam,ze podobnie), ale w zewnetrznych Epromach zapisze ci sie do adresu 88. W programatorach przy kostce o pojemnosci 128bajtow i odczycie jej jako 256 bajtowa dostaniesz dwa razy to samo.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 18:04 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    Dzięki. Po prostu chciałem inkrementowac adresy wpisywane do Eeprom i sprawdzać kiedy się pamięć przepełnia ale widzę że tak nie da rady.

    Co do tej inkrementacji w do...while to tak nie da rady w ogóle nie wychodzi z tej pętli.
    Zamieniłem też deklaracje na char[] ale nic to nie zmienia
    Ale sprawdzałem też zamiast char* jako String w końcu to c++ i po takim zapisie już nie można podmienić zmiennej napis2. Ptzy char* napis2 bez problemu można wpisać nowe wartości

    Wysłane z mojego Redmi 3 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 19:19 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    iwi napisał(a):
    Co do tej inkrementacji w do...while to tak nie da rady w ogóle nie wychodzi z tej pętli.

    Ta pętla jest we funkcji do odczytu i będzie działać ("wyjdzie z pętli") pod warunkiem, że ciąg znaków w EEPROM jest zakończony znakiem terminującym. Piszesz, że zapis jest poprawny, tylko jak to sprawdzasz, skoro odczyt nie działa poprawnie? Jesteś pewien, że Twoja funkcja eeprom_write_string() zapisuje poprawnie znak '\0' na końcu ciągu w EEPROM?

    Piszesz tak:
    iwi napisał(a):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Robisz tutaj dwa poważne błędy. Po pierwsze próbujesz skopiować tablicę o większym rozmiarze do tablicy o mniejszym rozmiarze (bez nadzoru nad przekroczeniem rozmiaru). Po drugie próbujesz pisać do tablicy zadeklarowanej poprzez wskaźnik (string literal), a tego się nie robi ani w C ani w C++.

    Cytuj:
    Zamieniłem też deklaracje na char[] ale nic to nie zmienia

    Skoro wiesz lepiej...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 paź 2016, o 21:29 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    andrews napisał(a):
    Skoro wiesz lepiej...

    Nie wiem dlatego się pytam. Mówię tylko że w tym programie nie widziałem różnicy w tym zapisie. Program działa identycznie źle w obu przypadkach. Ale już teraz wiem dlaczego - ponieważ wpisywałem ten sam napis bez czyszczenia EEPROM.
    Poprawny jest oczywiście zapis char napis[]="1234";

    Masz rację tez co do wielkości tablic. Tablica 2 nie może być mniejsza niż jeden.
    Zastanawia mnie tylko dlaczego jeśli napis2 zadeklaruję w ten sposób
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    czy tez w taki sposób
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    to po pierwszym obiegu pętli wychodzi z funkcji odczytawszy tylko pierwszą literę.

    Natomiast jeśli dam tak to działa poprawnie
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 paź 2016, o 12:05 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    Dziękuję za pomoc.
    Po wielu próbach odpuszczam sobie wyszukiwanie końca znaku stringa w EEPROM.
    Ponieważ taka funkcja może się przydać też do innych celów niekoniecznie odczytu stringa ale np kilku bajtów to myślę że najoptymalniejsze rozwiązanie z podaniem długości do odczytu. Przynajmniej będziemy wiedzieć co odczytujemy :)
    I tak na gotowo Funkcja Zapisu i Odczytu
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    i teraz wywołanie może wyglądać tak dla stringa napis:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    a odczyt przy zadeklarowanu wcześniej
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Próbowałem funkcję odczytu przerobić, żeby potem można było przypisywać zmienną np tak
    napis2 = eeprom_read_bytes(address_start, length)
    ale niestety to nie jest takie proste bo o ile w funkcji wszystko działało, ale po opuszczeniu funkcji wskaźnik do tej tablicy znikał.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 paź 2016, o 12:24 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2015
    Posty: 140
    Zbananowany użytkownik

    Pomógł: 18

    To co wstawiłeś tutaj, to sprawdzałeś w ogóle? Przecież te funkcje są bez sensu. CStringi, to chyba jeden z prostszych typów danych.

    To:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Zastanów się gdzie wstawiasz ten znak końca!

    Tu:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Ile wynosi ILE_BAJTOW?

    Stosowanie sizeof() do cstringów? Żeby zapisywać puste bajty do pamięci. EEPROM, ma ograniczoną ilość cykli.

    Więc może spróbuj tak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 paź 2016, o 13:37 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    Dziękuję za wyjaśnienia.
    Funkcje sprawdzałem przed skopiowaniem ich tutaj i działały. Jedyne co zapomniałem przekopiować to wielkość ILE_BAJTOW, ale to sobie każdy może wpisać ile potrzebuje.

    Twoje funkcje też działają, ale nie wiem dlaczego.
    Pierwsze pytanie. Skoro napis_1 deklarujemy jako tablicę to dlaczego w funkcji podajesz * data.
    Drugie pytanie. Jak to się dzieje że przy funkcji zapisu inkrementuje się po zmiennej "data".
    O ile zapis data[i] jest jasne że jeśli i się zmienia to przesuwa się po elementach o tyle u Ciebie jest po prostu wskaźnik na początek zmiennej. Powinno zapisać pierwszy znak do każdej komórki pamięci a zapisuje dobrze.
    Trzecie pytanie petla do while
    Jest warunek
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Jak to rozumieć? Czy to działa tak.
    Pierwsze wywołanie funkcji i sprawdzamy czy 'T' != '\0' jeśli tak to zostaje w pętli
    Drugie wywołanie funkcji i sprawdzamy czy 'e' != '\0' jeśli tak to zostaje w pętli
    Trzecie wywołanie funkcji i sprawdzamy czy 'n' != '\0' jeśli tak to zostaje w pętli itd. aż do
    Ostatnie wywołanie funkcji i sprawdzamy czy '\0' != '\0' tutaj wychodzi z pętli.

    Czemu tego nie zapisać prościej
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Oczywiście to nie będzie działało tak dobrze jak Twoje rozwiązanie, ale nie rozumiem dlaczego.

    No i na koniec pytanie o organizację pamięci EEPROM.
    Jak to rozwiązujecie sobie w programach.

    Powiedzmy, że zapisuję pierwszą zmienną do EEPROM. Potem wrzucam tą naszą napis_1 potem wrzucam jeszcze parę innych napisów.
    Żeby obliczyć początek każdego zapisu to muszę zrobic sobie jakieś notatki, żeby przez przypadek czegoś nie nadpisać a co najgorsze, żeby "ogon" nie zjadł "głowy" pamięci. Czy to się tak robi ręcznie czy można to jakoś zautomatyzować.
    Żeby było może jaśniej.
    Funkcja Serial.print wypisuje nam jakiś napis, dając raz jeszcze funkcję Serial.print wypisuje nam w tej samej linii następny napis - czyli gdzieś jest zapisana informacja o tym gdzie się skończył poprzedni wpis. Czy jest taka sama funkcja w zapisie do EEPROMa. Czyli zapis do EEPROM podając tylko zmienną a początek sobie obliczy sam i dorzuci nam w drugiej zmiennej adres i trzeciej zmiennej wielkość.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 paź 2016, o 14:29 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2015
    Posty: 140
    Zbananowany użytkownik

    Pomógł: 18

    Może zacznę od końca, chociaż ja nie jestem biegły w takich wyjaśnieniach.

    Pamięć EEPROM, to pamięc, która służy głównie do przechowywania rzadko modyfikowanych zmiennych. Może służyć też do ochrony danych, np w przypadku braku zasilania.

    Pamięć EEPROM przeważnie, jeśli nie zawsze organizujemy w sposób stały. Czyli przechowujemy gdzieś w programie adresy i rozmiary wszystkich przechowywanych zmiennych. W przypadku stringów, wystarczą tylko adresy, ale na każdy taki string musisz zarezerwować sobie odpowiednią ilość miejsca).

    Zamiast korzystać ze wskaźników, można to zapisać w notacji tablicowej (wyszło nawet prościej):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    iwi napisał(a):
    Pierwsze pytanie. Skoro napis_1 deklarujemy jako tablicę to dlaczego w funkcji podajesz * data.
    Ponieważ przekazując tablicę do funkcji, przekazujesz adres jej pierwszego elementu, czyli wskaźnik na pierwszy element.

    iwi napisał(a):
    Drugie pytanie. Jak to się dzieje że przy funkcji zapisu inkrementuje się po zmiennej "data".
    Inkrementuje wskaźnik, co oznacza, że poruszam się po kolejnych elementach przekazanej tablicy.

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Co do trzeciego pytania: To najpierw sprawdzany jest warunek, czy wskazywany obiekt jest różny od znaku '\0', a następnie inkrementowany jest wskaźnik i pętla jest kontynuowana lub nie w zależności od poprzedniego porównania.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 paź 2016, o 23:28 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2596
    Pomógł: 129

    Jak bedziesz często pisał do EEproma, to się w końcu wykrzaczy. Jak już musisz coś często zapisywać to wykorzystaj pamięć flash. Zamów sobie Yellowbooka - Mirek w nim porusza ten sposób. Dużo bardziej trwały i wcale nie taki trudny do opanowania.

    Sent from my Mi-4c



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 06:48 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    Dziekuje.
    1000razy zapis wytrzyma. w Eeprom chce przechowywac ustawienia zegara tj czas letni albo zimowy plus adresy ds18 b20. oraz jeszcze nazwy menu. odczyt z eeproma chyba nie jest szkodliwy



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 07:23 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2015
    Posty: 140
    Zbananowany użytkownik

    Pomógł: 18

    micky napisał(a):
    Jak bedziesz często pisał do EEproma, to się w końcu wykrzaczy. Jak już musisz coś często zapisywać to wykorzystaj pamięć flash.

    No nie zgodzę się z tym, skoro nota katalogowa od np. Atmega88 twierdzi, że:
    Cytuj:
    - Write/Erase cycles: 10,000 Flash/100,000 EEPROM
    - Data retention: 20 years at 85°C/100 years at 25°C
    EEPROM pozwala na 10 razy więcej cykli zapis/wyczyszczenie, a i działa znacznie dłużej w temperaturze pokojowej.

    Po za tym w przypadku zapisu do FLASH musisz zapisać całą stronę, więc dobrze jest, kiedy ilość danych jest bliska rozmiarowi tej strony.

    iwi napisał(a):
    odczyt z eeproma chyba nie jest szkodliwy
    Nie jest ;-)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 09:11 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    Sparrow-hawk napisał(a):
    No nie zgodzę się z tym, skoro nota katalogowa od np. Atmega88 twierdzi, że:

    Bo patrzysz tylko przez pryzmat jednej zależności a nigdy pewnie nie próbowałeś sposobu który opisuję w YB ;)

    Co za znaczenie może mieć ilość cykli zapisu, jeśli ktoś w procku dokona ich hmm nie wiem może 500 a może i nawet 2500 razy w ciągu życia projektu ? ;) Oczywiście jeśli ktoś przewiduje tych zapisów np 50 tys w ciągu życia projektu no to wtedy oczywistym jest że warto zdecydowanie wybrać EEPROM, chociaż życzę powodzenia z takim przebiegiem ;) ... Warto czasem realnie spojrzeć po prostu na różne przypadki i potrzeby ....

    Sparrow-hawk napisał(a):
    Po za tym w przypadku zapisu do FLASH musisz zapisać całą stronę, więc dobrze jest, kiedy ilość danych jest bliska rozmiarowi tej strony.

    I znowu - a co to za nakaz albo oograniczenie że ilość danych musi być bliska rozmiarowi strony ? ;) a kto mi zabroni zapisać 10 bajtów przy stronie o pojemności 128 bajtów ? ;) Albo co to za ograniczenie, że że trzeba zapisać całą stronę ? ... żadne ;) Tylko proszę nie podawaj mi argumentu, że szkoda pamięci Flash szczególnie gdy się używa procka w którym zostaje nam i tak mnóstwo wolnego miejsca w jakimś projekcie, który realizujemy.

    Nie kłócę się ani oczywiście nie przekonuję, że nagle warto w KAŻDYM przypadku stosować Flash zamiast EEPROM, zwracam uwagę na bardzo arcy-ciekawą wg mnie alternatywę, z której zresztą korzysta się także w większych np 32-bitowych prockach ;) bez żadnego tam "ale"

    No a niewątpliwą zaletą zapamiętania danych we Flash w stosunku do EEPROM jest wg mnie po tysiąckroć większa pewność ich utrzymania w ciągu życia projektu nawet w mało sprzyjających warunkach zewnętrznych. I tu jeśli chcesz to możemy się założyć o skrzynkę dobrego złocistego trunku ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 10:21 
    Offline
    Użytkownik

    Dołączył(a): 05 lis 2013
    Posty: 353
    Lokalizacja: Kraków
    Pomógł: 6

    micky napisał(a):
    Zamów sobie Yellowbooka

    Nie ma jeszcze w sklepie Yellowbooka :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 11:15 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2015
    Posty: 140
    Zbananowany użytkownik

    Pomógł: 18

    micky napisał(a):
    Jak bedziesz często pisał do EEproma, to się w końcu wykrzaczy. Jak już musisz coś często zapisywać to wykorzystaj pamięć flash
    Więc odniosłem się do słowa często sugerując, że często -> EEPROM, rzadko -> Flash, pytanie ile dla kogo to jest często, a ile rzadko. I że moim zdaniem patrząc na notę katalogową szybciej wykrzaczy się flash, a nie EEPROM.

    Co do rozmiaru strony strony to pisałem przecież o tym, że optymalnie będzie gdy rozmiar danych będzie bliski rozmiarowi strony, a nie o tym, że nas to w jakiś sposób ogranicza.
    mirekk36 napisał(a):
    po tysiąckroć większa pewność ich utrzymania w ciągu życia projektu nawet w mało sprzyjających warunkach zewnętrznych
    Dlatego pisałem o temperaturze pokojowej ;-)
    mirekk36 napisał(a):
    Nie kłócę się ani oczywiście nie przekonuję, że nagle warto w KAŻDYM przypadku stosować Flash zamiast EEPROM
    Ja też nie, chciałem jednak podkreślić, że są sytuacje, kiedy wykorzystanie pamięci EEPROM będzie bardziej korzystne, skoro już ją mamy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 11:23 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2596
    Pomógł: 129

    Rzeczywiście - masz rację co do ilości zapisu, tylko że ja mam trochę inne doświadczenia ze stabilnością zapisu do Eeproma. Co ciekawe, to w Microchipie ilość cykli jest większa.

    Sent from my Mi-4c



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 paź 2016, o 15:34 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    Sparrow-hawk napisał(a):
    chciałem jednak podkreślić, że są sytuacje, kiedy wykorzystanie pamięci EEPROM będzie bardziej korzystne, skoro już ją mamy.

    No oczywiście, z tym się trudno nie zgodzić - ot po prostu warto umieć dobrać sytuację do potrzeby albo potrzebę do sytuacji ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO