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

[Rozwiązano] Zapisywanie komórki w pamięci EEPROM w XMEGA: błędy w symulatorze czy programie?

kte-bmw 22 Lut 2021 20:31 618 8
  • #1 19275343
    kte-bmw
    Poziom 6  
    Witam,
    Zacząłem przygodę z xmegą i po uporaniu się z portami próbuję teraz uporać się z eeprom-em. Odczyt zapisanej komórki eeprom czy to przez "NVM" czy "maping eeprom" jest ok. Gorzej jeśli chodzi o zapisanie komórki eeprom. Na razie nie mogę przetestować fizycznie bo padł mi programator a w symulatorze wartość bajtu nie wpisuje się do eeprom. Nie wiem czy jest jakiś błąd w programie czy w "symulatorze".
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    Może ktoś podpowie gdzie jest błąd
    Serdecznie dziękuję i pozdrawiam
  • #2 19276688
    tmf
    VIP Zasłużony dla elektroda
    Chętnie bym ci pomógł, ale używasz stałych, zamiast symboli i trzebaby to teraz zdekodować czytając notę procesora, Ogólnie zapis do EEPRON w XMEGA odbywa się blokami - czyli po zmapowaniu EEPROM do SRAM, modyfikujesz odpowiednie komórki (co ważne, muszą one być w obrębie jednej storny EEPROM), a nastęnie dokonujesz zapisu strony. Symulator działa ok, możesz bazować na jego wynikach.
    BTW, asembler? Nieźle :) Z ciekawości zapytam, dlaczego nie c?
  • #3 19276979
    kte-bmw
    Poziom 6  
    dlaczego nie c? po krótce: dawno, dawno temu w sterownikach do urządzeń które projektowaliśmy zastosowałem 8080 a wtedy dostępny był asembler. Później na przeszło 25 lat zmieniłem zawód i nie miałem nic do czynienia z elektroniką. A co oznacza 25 lat w elektronice....... Teraz nauka c to zbyt "pracochłonne zajęcie" , gdy już "pamięć nie taka" .Teraz to tylko hobbistyczna przygoda. Parę sterowniczków zaprojektowałem do zastosowania w swoich samochodach ale na atiny czy atmega-ch. Teraz chciałem poznać xmegę z ciekawości i zmienić sterownik nawadniania bo stary "fabryczny" trochę fiksuje. Trochę to przerost treści nad formą ale ciekawość to ciekawość, tym bardziej, że już dotarły do mnie płytki, i w zasadzie wszystko mam pomontowane.
    Wracając do tematu : faktycznie mogłem przypisać wartości do symboli ale to tylko fragmencik programu więc na tym etapie nie pomyślałem. Może coś źle zrozumiałem ale w przypadku mapowania eeprom nie mamy dostępu do bufora i możemy przesłać jedną zmienną do nvm_data0. Natomiast gdy nie mapujemy to dostępny jest bufor do którego wpisujemy zmienne, ale tylko te które chcemy, w obrębie strony i wtedy zapisujemy. Pomijam kasowanie bufora i eeprom przed zapisem. I tutaj jestem w kropce bo nie wiem co źle robię. Dlaczego wspomniałem o symulatorze ? bo w atmegach nie wszystko się "wpisywało" a później "fizycznie" działało ok. Tak na marginesie to xmega-a3bu
    Bardzo dziękuję za chęć pomocy i serdecznie pozdrawiam.
  • #4 19277299
    tmf
    VIP Zasłużony dla elektroda
    kte-bmw napisał:
    Teraz nauka c to zbyt "pracochłonne zajęcie" , gdy już "pamięć nie taka"

    Jednak mimo wszystko warto poświęcić trochę czasu i przejść np. na C. To zbyt skomplikowane procki, oferujące dużo pamięci i w efekcie stracisz mnóstwo czasu na pisanie programu w asemblerze.
    kte-bmw napisał:
    Może coś źle zrozumiałem ale w przypadku mapowania eeprom nie mamy dostępu do bufora i możemy przesłać jedną zmienną do nvm_data0. Natomiast gdy nie mapujemy to dostępny jest bufor do którego wpisujemy zmienne, ale tylko te które chcemy, w obrębie strony i wtedy zapisujemy.

    Mapowanie EEPROM nie ma nic do rzeczy. W XMEGA o ile odczyt możesz zrobić z pominięciem bufora, o tyle zapis zawsze odbywa się przez bufor. Zobacz na listę poleceń kontroler NVM - nie ma na niej polecenia zapisu bajtu do EEPROM, jest tylko polecenie zapisu strony. Więc poprawna kolejnośc powinna wyglądać tak:
    - zapis bajtu
    - zapis (z ew. kasowaniem) strony.
    Kontroler NVM automatycznie zapisuje w obrębie strony tylko te bajty, które faktycznie zostały zapisane w buforze, pozostałe ignoruje. Przykładowa sekwencja (w c) może wyglądać np. tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 19277389
    kte-bmw
    Poziom 6  
    Tak przeleciałem po łepkach notę. Bufor jest oczywiście zapisywany .
    When EEPROM memory mapping is enabled, loading a data byte into the EEPROM page buffer
    can be performed through direct or indirect store instructions. ...........................................................
    ................................................................................................................................................................................
    When the EEPROM is memory mapped, the EEPROM page buffer load and EEPROM read
    functionality from the NVM controller are disabled.
    Doskonale zdaję sobie sprawę, że powinienem znać c. Niestety po porażce z androidem (choć kiedyś z linuksem miałem jakiś kontakt) straciłem ochotę do nauki.... Wiem, że as zajmuje dużo czasu ale ja mam go aż nadto.
    Dziękuję, przeanalizuję sobie to co mi przesłałeś .
    Jeśli mogę to chciałbym dopytać o tą adresację.
    powiedzmy startujemy pierwszy raz i chcemy zapisać dwa bajty do eeprom. Zakładamy że strona ma 32 bajty, wszystkie bajty w eeprom mają 0xff. Adres pierwszej strony to 0x1000 drugiej 0x1020 itd. Ustawiamy adres pierwszej strony 0x1000 (odpowiednio addr0,1,2) i do bufora eeprom ładujemy bajt przez nvm_data0 . I teraz jest pytanie czy adres zostawiamy i wpisujemy kolejną daną czy adres zwiększmy o 1 i wpisujemy kolejną daną (właśnie nie bardzo wiem jak jest zorganizowany bufor) . Teraz ponownie wpisujemy adres początkowy strony i zapisujemy stronę ? czy już nie musimy wpisywać adresu bo w buforze jest już zapisany adres strony i dane ? ( ma to znaczenie czy bufor jest jeden czy każda strona ma swój własny bufor ? Bo jeśli jest jeden bufor to te dane które są w buforze możemy zapisać do dowolnej strony a jeśli każda ma swój bufor bądź bufor jest adresowany do strony to wtedy wystarczy zrobić wpis i adres jest wtedy bez znaczenia. Trochę to takie "masło maślane" ale istota zrozumienia działania eeprom jest istotna zarówno dla c jak i asm.
    Jeszcze raz dziękuję i pozdrawiam
  • #6 19278148
    tmf
    VIP Zasłużony dla elektroda
    Jest tylko jeden bufor dla całego EEPROM. W efekcie to gdzie jego zawartość zostanie zapisana zależy wyłącznie od rejestru adresowego NVM. Danych nie zapisujesz do rejestru danych NVM ale bezpośrednio w obszar pamięci do której jest mapowany EEPROM (niezależnie czy mapujesz, czy nie). Adresacja w tym obszarze jest normalna dla odczytu EEPROM, przy zapisie ten cały obszar możesz potraktować tak, jakby znaczenie miało tylko 5 najmniej znaczących bitów adresu - dla 32 bajtowej strony EEPROM.
  • #7 19278199
    kte-bmw
    Poziom 6  
    [Baaaaaardzo dziękuję właśnie o to mi chodziło , żeby zobaczyć gdzie popełniłem błąd :D . Coś z tłumaczeniem też mi nie wychodzi starość nie radość :(
    Jutro to poprawię, i dam znać .
    Pozdrawiam serdecznie.
  • #8 19282663
    kte-bmw
    Poziom 6  
    Trochę to trwało, ale miałem inne zajęcia w miedzy czasie. Dzisiaj kupiłem programator i sprawdziłem to wpisywanie do eeprom na "żywym organizmie". Okazuje się, że problem jest w symulatorze. Wynik nie jest widoczny i to czasami może być mylące. Nie mam pojęcia czy ten symulator jest taki sam dla c jak i dla asm. Przypomniało mi się , że z tym samym już walczyłem w 2001r gdy wpisy do eeprom do atmegi też w symulatorze nie były widoczne a to był AS4. Widać, że od tamtej pory a mamy AS7 nie udało im się to poprawić.
    Bardzo dziękuję Ci za chęć pomocy, a to właśnie zmusiło mnie do dokładnego przeczytania "obsługi" eeprom w xmedze. "Komórki" zapisują się zarówno z "poziomu NVM" jak i "maping". W zasadzie nie bardzo rozumiem po co jest ten zapis bufora i odczyt eeprom poprzez NVM skoro mamy "maping" a i tak kasowanie bufora, pamięci i wpis do eeprom jest przez NVM. Chyba, że jest jakieś "ułatwienie" dla DMA. Na razie nie jestem jeszcze na tym etapie.
    Dziękuję i pozdrawiam.
  • #9 19337157
    kte-bmw
    Poziom 6  
    Problem rozwiązany zgodnie z ostatnim postem.
REKLAMA