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

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

elektryku5 31 Sty 2013 21:53 3039 18
  • #1 11870890
    elektryku5
    Poziom 39  
    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:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    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 11871111
    BlueDraco
    Specjalista - Mikrokontrolery
    A my mamy zgadnąć, co to znaczy "nie działa" i jak wyglądają deklaracje zmiennych w Twoim programie, tak?
  • #3 11871155
    elektryku5
    Poziom 39  
    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ę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Potem przy pomocy itoa wysyłam zmienną int cykle_w na LCD, wpisana wartość testowa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    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 11871470
    BlueDraco
    Specjalista - Mikrokontrolery
    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.
  • #7 11872050
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11872238
    elektryku5
    Poziom 39  
    Co do drugiego, to racja, kompilator się czepia właśnie tej funkcji, co tam pozmieniać żeby ruszyło?
    
    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 11872475
    BlueDraco
    Specjalista - Mikrokontrolery
    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.
  • Pomocny post
    #10 11872573
    dondu
    Moderator na urlopie...
    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 11872829
    elektryku5
    Poziom 39  
    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 napisał:
    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:
    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 11872909
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11873040
    elektryku5
    Poziom 39  
    Jak to ma wyglądać?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    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 11873094
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11873212
    elektryku5
    Poziom 39  
    Przy takiej deklaracji nie skompilowało się, ale wpisałem coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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:
    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 11873232
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11873329
    elektryku5
    Poziom 39  
    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:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    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:
    main.c:208: warning: passing argument 1 of '__eewr_word_m8' discards qualifiers from pointer target type

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #18 11873521
    BlueDraco
    Specjalista - Mikrokontrolery
    no to daj (unsigned int *)a w wywołaniu procedur eeprom_xxx
  • #19 11873572
    elektryku5
    Poziom 39  
    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).

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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

    To też było pomocne https://www.elektroda.pl/rtvforum/topic1716196.html#8288074
REKLAMA