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

[c] Jak zapisać i odczytać integer w 24C256 używając I2C Fleury na ATMega8?

janoda 28 Sie 2013 21:31 1845 11
REKLAMA
  • #1 12679001
    janoda
    Poziom 10  
    Witam wszystkich!

    Mam pewien problem z obsługą biblioteki I2C niejakiego Petera Fleury.
    Nie mam zielonego pojęcia, jak zapisać w pamięci 24C256, zmienną typu integer, a następnie odczytać ją i wysłać poprzez UART, korzystając również z biblioteki Pana Fleury.

    Jeżeli jest zapis zmiennej:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    a następnie odczyt:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    i wysłanie odczytanej zmiennej przez UART:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zamiast zmiennej o wartości 5 pokazuje się zupełnie inna wartość - 17.

    Czy ktoś już miał do czynienia z w/w biblioteką?

    Pozdrawiam![/code]
  • REKLAMA
  • #2 12679101
    piotrva
    VIP Zasłużony dla elektroda
    Poczytaj co-nieco o typach zmiennych, bo to jak widać stwarza Ci problemy.
    Za pomocą tej biblioteki możesz zapisywać zmienne jednobajtowe - zmienna typu int (znana jako int16_t) zajmuje 2 bajty.
    Żeby ją zapisać powinieneś najpierw ją rozbić (najlepiej np. za pomocą unii) na 2 bajty i potem każdy z tych bajtów zapisać np. w 2 kolejnych komórkach eeprom.
    Odczyt analogicznie - pierwsze odczytujesz 2 komórki eeprom i potem w tej samej kolejności łączysz je za pomocą unii.

    Hasła do poczytania:
    http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html
    http://en.wikipedia.org/wiki/Union_type
  • #3 12680260
    janoda
    Poziom 10  
    Witam ponownie!

    Z podziałem typu int na dwa bajty chyba sobie poradziłem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    następnie zapis do 24C256
    Kod: text
    Zaloguj się, aby zobaczyć kod

    ale jak połączyć dwa bajty w typ int przy pomocy union?
    Wynalazłem coś takiego:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 12680348
    PJS
    Poziom 15  
    Po pierwsze:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


    pytanie: czy jest sens używać dodatkowo zmiennych: l, mlodszy, starszy?
  • #5 12680500
    janoda
    Poziom 10  
    Dlaczego w unii tablica "bajty" ma być jednoelementowa, a nie dwuelementowa? Poza tym, po odczycie z 24C256:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    pokazuje się inny wynik niż bym się spodziewał. Zamiast wartości 1199 odczytywana jest zupełnie inna wartość. Czy wynik odczytu należy w jakiś sposób przekonwertować?
  • REKLAMA
  • #6 12680850
    PJS
    Poziom 15  
    Zgadza się - zaćmiło mnie. Ma być dwuelementowa.

    Co do tego, że wartość się nie zgadza: czy odczytujesz wartości z tych samych komórek, do których je zapisałeś?
    Zapisujesz 1199, a ile odczytujesz? Czy nie czasem 44804?
  • REKLAMA
  • #7 12680911
    janoda
    Poziom 10  
    Mój kod wygląda następująco:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Teraz zapis:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odczyt:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wysłanie wyniku:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    W tym momencie tablica ma wartość nie wiedzieć czemu 2817.
    Jakieś pomysły?
  • #8 12680964
    BlueDraco
    Specjalista - Mikrokontrolery
    Ilu bajtów adresu wymaga ta pamięć i w którym miejscu je wysyłasz?
  • #9 12681206
    janoda
    Poziom 10  
    Obawiam się, że nie rozumiem pierwszej części pytania. Jeżeli natomiast chodzi moment zapisu, to powiedzmy, że to się odbywa zaraz po uruchomieniu uC.

    Jeżeli, w momencie zapisu, do adresu komórki dodam przesunięcie bitowe w prawo, to wszystko pięknie się zapisuje i odczytuje.

    Zapis:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odczyt:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #10 12681336
    tmf
    VIP Zasłużony dla elektroda
    W darmowych przykłądach do mojej książki masz gotowe kody współpracy z pamięcią EEPROM i FRAM po I2C. Mozesz je wykorzystać, a jak będziesz miał wątpliwości jak to działa to pytaj.
  • #11 12681443
    BlueDraco
    Specjalista - Mikrokontrolery
    No i zapewne o to chodziło. We wcześniejszej wersji kodu wysyłałeś jeden bajt, teraz wysyłasz dwa (i chyba tyle trzeba) - jest szansa, że to zadziała, tyle, że w opisie pamięci jest wyraźnie napisane, że najpierw wysyła się bardziej znaczący bajt adresu, a Ty wysyłasz najpierw mniej znaczący.
  • #12 12684248
    janoda
    Poziom 10  
    Witam!

    Na razie jestem w fazie testów i zawieszam temat.

    Dziękuję wszystkim zainteresowanym!

    Pozdrawiam!
REKLAMA