Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega8 - Program nie chce zapisać ani odczytać zmiennej powyżej 8bit z eeprom.

elektryku5 31 Jan 2013 21:53 2919 18
  • #1
    elektryku5
    Level 38  
    Problem jak w temacie, potrzebuję w eeprom zapisać kilka wartości, niestety nie mogę użyć większej liczby niż 255.

    Prubuję to zrobić przez:

    Code: c
    Log in, to see the code


    Nie działa, a skoro słowo to powinienem mieć 16 bitów na liczbę, niestety jest tylko 8 i nie umiem tego przeskoczyć.

    Code: c
    Log in, to see the code


    Z drugą możliwością jest to samo...

    Poza tym po operacji eeprom_write_block mam co innego niż zadałem w programie w pliku .eep zgranym z atmegi.
  • #2
    BlueDraco
    MCUs specialist
    A my mamy zgadnąć, co to znaczy "nie działa" i jak wyglądają deklaracje zmiennych w Twoim programie, tak?
  • #3
    elektryku5
    Level 38  
    Jakoś udało mi się zmusić do działania eeprom_write_word, po zczytaniu .eep dostaję wpisaną przez program liczbę w kolejności little endian, czyli to się zgadza, ale już z odczytem nie jest tak fajnie, daję:
    Code: c
    Log in, to see the code


    Potem przy pomocy itoa wysyłam zmienną int cykle_w na LCD, wpisana wartość testowa:
    Code: c
    Log in, to see the code

    Czyli powinno się zgadzać, bo taka liczba jeszcze mieści się w int.


    EDIT:

    Chyba itoa coś krzaczy, bo po przypisaniu 0x7530 od razu pod zmienną na wyświetlaczu mam co innego.

    EDIT2:

    Strasznie nawalone w tym kodzie, ale może teraz ktoś będzie wiedział o co chodzi, w tej chwili mogę sobie dodawać przyciskami, kiedy przekroczę 255, to mam 0 i od nowa...

    Code: c
    Log in, to see the code


    Ma ktoś jakiś pomysł? Ten powyższy kod nie dość, że nie dopuszcza >255, to jeszcze (jak przed chwilą zważyłem) trzyma tylko do wyłączenia zasilania...
    Widzę tam błąd z ==, ale i tak pewnie nie zadziała po zamianie, bo coś tam głębiej nie hula... (Po tej zmianie pamięć trzyma, ale dalej nie można przekroczyć tego 255.)
  • #4
    BlueDraco
    MCUs specialist
    A deklaracji zmiennych znów nie podałeś. Nie da się zgadnąć, co jest źle w kodzie, jeśli nie wiadomo, jak zadeklarowane są zmienne.
  • #5
    elektryku5
    Level 38  
    Code: c
    Log in, to see the code


    Tak to mniej więcej wygląda, mam nadzieję, że reszta programu nie ma wpływu na ten "błąd".
  • #7
    BlueDraco
    MCUs specialist
    Popatrz, do czego to Cię ogranicza:
    cykle=cykle_w;
    itoa(cykle, buffer, 10);

    Podejrzewam też, że przekazujesz złe typy argumentów do eeprom_cośtam_word, a kompilator kwiczy, ale Ty to ignorujesz.
  • #8
    elektryku5
    Level 38  
    Co do drugiego, to racja, kompilator się czepia właśnie tej funkcji, co tam pozmieniać żeby ruszyło?
    Code:

    main.c:146: warning: passing argument 1 of '__eerd_word_m8' makes pointer from integer without a cast
    main.c:181: warning: large integer implicitly truncated to unsigned type
    main.c:195: warning: implicit declaration of function 'itoa'
    main.c:204: warning: passing argument 1 of '__eerd_word_m8' makes pointer from integer without a cast
    main.c:204: warning: passing argument 1 of '__eewr_word_m8' makes pointer from integer without a cast

  • #9
    BlueDraco
    MCUs specialist
    A co do pierwszego? Podstawiasz 16 bitów na 8 i dziwisz się, że nie możesz dostać wartości powyżej 255..

    Jeśli kompilator błaga o wskaźnik, a Ty się uparłeś przy liczbach, to daj przynajmniej
    (int *)adres.

    Czyść kod, aż będzie bez ostrzeżeń - to dobra rada dla początkujących, ale nie tylko. Kiedy ostatnie w wolnej chwili zacząłem wyrzucać z dużego projektu wszystkie ostrzeżenia, to dzięki tym ostrzeżeniom znalazłem dwa paskudne błędy, które jakoś nie zdążyły się ujawnić w działaniu urządzenia.
  • Helpful post
    #10
    dondu
    Moderator on vacation ...
    Twój problem wynika bezpośrednio z ignorowania warningów i dlatego zaliczasz 10 stopień piekiełka.
    A jeżeli sobie z tym nie radzisz, to trzeba to napisać i pokazać już w pierwszym poście.

    Nie odpowiedziałeś na moje pierwsze pytanie - ciągnąć Ciebie za język trzeba ... a czas Ci leci ...
  • #11
    elektryku5
    Level 38  
    Jeszcze dodałbym 6ty, znaczy się projekt był na początku banalny, ale chciało się większej funkcjonalności...

    Co do pierwszego pytania, to sam się zastanawiam, bo jakoś nie umiem tego znaleźć w winavr (tools/options/ na szybko przeleciałem, ale nie widzę nic o optymalizacji).


    BlueDraco wrote:
    A co do pierwszego? Podstawiasz 16 bitów na 8 i dziwisz się, że nie możesz dostać wartości powyżej 255..

    Jeśli kompilator błaga o wskaźnik, a Ty się uparłeś przy liczbach, to daj przynajmniej
    (int *)adres.

    Czyść kod, aż będzie bez ostrzeżeń - to dobra rada dla początkujących, ale nie tylko. Kiedy ostatnie w wolnej chwili zacząłem wyrzucać z dużego projektu wszystkie ostrzeżenia, to dzięki tym ostrzeżeniom znalazłem dwa paskudne błędy, które jakoś nie zdążyły się ujawnić w działaniu urządzenia.


    Dziwi mnie, to skoro word powinno mieć 16 bitów:
    Code:
    eeprom_read_word ( *adres ) - czyta 16 bitową zawartość pamięci spod adresu adres.

    http://avr.elektroda.eu/node/3


    Swoją drogą, jeśli ma ktoś fajnego tutoriala, to chętnie bym poczytał, bo większość jest po angielsku, wprawdzie coś tam rozumiem, ale wszystko jeszcze bardziej się komplikuje i są warningi, resztę wskazówek postaram się również wprowadzić...

    edit

    Dopisałem (int *)adres, ale dalej jest to samo.
  • #12
    BlueDraco
    MCUs specialist
    Te funkcje oczekują parametru typu wskaźnik na int, a ty najpierw dawałeś liczbę, a teraz próbujesz też liczbę - zapisaną w komórce o adresie adres.
  • #13
    elektryku5
    Level 38  
    Jak to ma wyglądać?

    Code: c
    Log in, to see the code


    Tak zrobiłem, ale nie wiem czy dobrze zrozumiałem Twoją podpowiedź, bo nadal mam to samo...


    PS Uczę się na błędach, jakoś tak bardziej wolę praktykę niż teorie, tym bardziej w innym języku.
  • #14
    BlueDraco
    MCUs specialist
    Tak uczciwie, to powinno być jakoś tak:

    int eeprom a; // deklaracja danej w pamięci eeprom

    eeprom_write_word(&a, cykle_w);

    cykle_w = eeprom_read_word(&a);
  • #15
    elektryku5
    Level 38  
    Przy takiej deklaracji nie skompilowało się, ale wpisałem coś takiego:
    Code: c
    Log in, to see the code

    Reszta spasowała, warningi od funkcji z eepromu znikły, no ale jednak dalej mnie coś ogranicza do 8 bitów...

    EDIT:

    Sorry, teraz zauważyłem:
    Code:
    main.c:204: warning: pointer targets in passing argument 1 of '__eerd_word_m8' differ in signedness
    
    main.c:204: warning: pointer targets in passing argument 1 of '__eewr_word_m8' differ in signedness
  • #16
    BlueDraco
    MCUs specialist
    Kompilator krzyczy o konflikcie signed/unsigned - zmień typ i będzie po krzyku. Czy to tak trudno sprawdzić prototyp funkcji i zapisane w nim typy argumentów w odpowiednim pliku nagłówkowym?
  • #17
    elektryku5
    Level 38  
    Po zmianie cykle_w z int na unsigned int, nie ma tych błędów, ale potrzebuję w tej zmiennej przechować też wartości ujemne, zresztą nawet mimo tej zmiany nie mogę przekroczyć 255, nie wiem już czy to coś z tą funkcją, czy mam tak nawalone w kodzie.

    EDIT:

    Jednak to była wina itoa, zadeklarowałem ją tak:

    Code: c
    Log in, to see the code


    Teraz mogę dawać duże liczby, ale proszę nie zamykać tematu, bo znów coś się może przytrafić, znaczy się chce żeby nie było unsigned, bo liczby ujemne też mi są potrzebne.

    EDIT:

    Wprawdzie mam jednego warninga, ale działa jak powinno:
    Code:
    main.c:208: warning: passing argument 1 of '__eewr_word_m8' discards qualifiers from pointer target type

    Code: c
    Log in, to see the code
  • Helpful post
    #18
    BlueDraco
    MCUs specialist
    no to daj (unsigned int *)a w wywołaniu procedur eeprom_xxx
  • #19
    elektryku5
    Level 38  
    Dałem do procedury zapisu, bo w pozostałych było ok, teraz nie ma już żadnych ostrzeżeń o eepromie, ale plik wyjściowy nie uległ zmianie (po weryfikacji z tym co już miałem wgranego, czyli z tym wspomnianym ostrzeżeniem).

    Code: c
    Log in, to see the code


    Na pierwszy rzut oka program działa, więc dziękuję wszystkim za pomoc.

    To też było pomocne https://www.elektroda.pl/rtvforum/viewtopic.php?p=8288074#8288074