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

ATmega32 - Jak utworzyć funkcje zapisu i odczytu dla EEPROM AT24C64D?

cyber90 04 Gru 2013 14:14 1590 8
  • #1 13023805
    cyber90
    Poziom 15  
    Witam mam program obsługujący pamięć AT24C64D, nie udało mi się zrobić to sprzętowo więc trzeba było programowo. Udało się wysłać do pamięci jeden bajt i odczytać na wyświetlaczu wszystko wygląda tak jak powinno. Teraz chcę utworzyć funkcję Zapisu i odczytu:

    void EEPROM_zapis(unsigned char adres, unsigned char dane)

    unsigned char EEPROM_odczyt(unsigned char adres)


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


    Program powyżej działa teraz tak jak pisałem wyżej chcę napisać funkcje odczytu i zapisu w których podaje wartość i adres.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wgrywając ten program na wyświetlaczu pojawia się 0. Funkcje są chyba dobrze napisane nie wiem może typ funkcji nie taki jaki powinien?
  • #3 13023970
    cyber90
    Poziom 15  
    Pętli głównej tzn? Narazię chcę zapisać jedną komórkę pamięci i ją odczytać. Możesz jaśniej?
  • #4 13023987
    dondu
    Moderator na urlopie...
    W aktualnej wersji programy wykonują co mają wykonać, a następnie z powodu braku pętli głównej, wykonują dodane na końcu przez kompilator:
    - wyłączenie przerwań globalnych,
    - pętlę nieskończoną,
    efektem obserwowanym jest "zawieszenie" się programu.

    Nie ma to wpływu na sam zapis, który próbujesz zrealizować. Po prostu program mikrokontrolera nie może się kończyć. Musi być jakaś pętla nieskończona. Jeżeli jej nie dodasz na końcu main(), to zrobi to za Ciebie kompilator w sposób który podałem wyżej.

    Pętla główna może być pusta lub nie, w zależności od projektu. W Twoim przypadku na razie po prostu dodaj:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 13024670
    cyber90
    Poziom 15  
    Ok jest pętla na końcu programu, ale to nie rozwiązuję problemu. Dodam jeszcze że pojawia się ostrzeżenie podawane przez kompilator:
    ../EEPROM_program.c:207: warning: 'aaa' is used uninitialized in this function

    i wskazuje na linię:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 13024903
    el2010tmp
    Poziom 25  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    aaa wewnątrz funkcji EEPROM_odczyt(); to nie to samo aaa co w int main(void);
    - to dwie różne zmienne.
  • #7 13025282
    cyber90
    Poziom 15  
    Dzięki el2010tmp masz rację. Teraz pokombinuję żeby uruchomić to sprzętowo.
  • #8 13025291
    michailbialkov
    Poziom 9  
    itoa jak wejście przyjmuje liczbę całkowitą, a zwraca char (Int TO Ascii). A z tego co widzę, to twoja zmienna aaa jest typu char.
  • #9 13040891
    cyber90
    Poziom 15  
    Wracam do tematu ponieważ dalej mam problem. Moje funkcje zapisu i odczytu zawierają zmienną adres typu unsigned char co daje mi możliwość zapisu 255 komórek adresu. Również jest błąd ponieważ nadpisuję dwa razu część młodszą i starszą. Chcę zapisać wyświetlacz LCD z pamięci EEPROM. Wyświetlacz posiada 1024 komórek (jedna komórka 8 bitów).

    Zapis i odczyt pamięci wygląda tak:
    ATmega32 - Jak utworzyć funkcje zapisu i odczytu dla EEPROM AT24C64D?

    Korzystając z funkcji poprzednio napisanych:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


    Otrzymuję błędne wyświetlenie. Wiem że muszę zmienić typ adresu, ale mam problem jak w obu funkcjach wpisać najpierw pierwszą część adresu rozumiem że to jest MSB i drugą część adresu. Moje funkcje po przerobieniu wyglądają tak:

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


    Ale również na LCD otrzymuję tym razem jakieś krzaki nie spójne wogóle. Próbowałem też na odwrót najpierw młodszą a potem starszą:

    i2c_write(adres & 0xFF);
    i2c_write(adres>>8);


    Również nie działa tak jak powinno. Może ktoś doradzić co robię źle?
REKLAMA