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

[AVR]Protokół ISP i adresowanie pamięci powyżej 128kB

manekinen 02 Maj 2011 11:08 3154 15
REKLAMA
  • #1 9460265
    manekinen
    Poziom 29  
    Hej.

    W nocie nie bardzo potrafię zrozumieć jak używać komendy "load extended address byte" przy adresowaniu pamięci flash większych jak 128kB (64K word) - może dla tego że praktycznie w ogóle tego nie wytłumaczyli :(

    Napisano jedynie że bajt ten służy do wybrania kolejnego "sektora" o wielkości 64Kword. Mam rozumieć że gdy w najmłodszy bit tego bajtu dam "0" to będę pracował na pierwszym sektorze a jak "1" to na kolejnym?

    Czy może to jest tak że ten bajt "extended" jest po prostu przedłużeniem dwu bajtowego adresu, i jego najmłodszego bitu należy używać jako 17-ego bitu adresu? Sugeruję się tutaj tym że w nocie Atmega2560 w "page size" podano że adres wordów w stronie (PCWORD) zwiera się od 6 do 0 bitu, a adres stron w pamięci (PCPAGE) zawiera się od 16 do 7 bitu - więc mamy 17 bitów adresu i nie wiadomo gdzie to upchać.

    Niestety nie mam tak "dużego" układu żeby dojść do tego metodą prób i błędów :(

    A może ktoś z Was już z tym walczył?

    Pozdrawiam :)
  • REKLAMA
  • #2 9462811
    Nawigator
    Poziom 33  
    manekinen napisał:

    W nocie


    a szczególnie w której?
    Robisz nowy programator?

    N.
  • Pomocny post
    #3 9464810
    BoskiDialer
    Poziom 34  
    "Load Extended Address" powoduje wpisanie wysłanego bajtu do wewnętrznego zatrzasku, który w ten sposób rozszerza długość adresu zadawanego pozostałymi poleceniami. Jeśli przy "Load Extended Address" podasz wartość 0, to pozostałe instrukcje operują na pamięci flash od 0 do 128KB, jak podasz 1 to od 128KB-256KB itd.. Jako że pamięć flash fizycznie zorganizowana jest w słowa o długości dwóch bajtów, tak więc np instrukcje "Load program memory page, High/low byte" używa się łącznie, bit 0 adresu wybiera jedną z tych dwóch instrukcji, bity 1-16 adresu przekazuje się jako adres, bity 17-24 przekazuje się pośrednio właśnie przez "Load Extended address". Łącznie adres ma 25 bitów (traktując pamięć flash jako zorganizowaną bajtami).
  • #4 9465008
    manekinen
    Poziom 29  
    O, wielkie dzięki! :)

    To może zapytam przy okazji o budowę adresu, bo tutaj też mam pewne wątpliwości. A widzę że Kolega w temacie :)

    W niektórych notach, w tabelce Serial Programming Instruction Set, w polach adresu jest tylko podane "adr MSB" i "adr LSB".

    W niektórych (np Attiny2313) te dane są pokazane w postaci binarnej i tam widać co gdzie należy wysłać. Reszta bitów oznaczona jako "X" czyli don't care - mogę sobie w nie wepchać co chcę i nic nie powinno się stać:
    [AVR]Protokół ISP i adresowanie pamięci powyżej 128kB

    W jeszcze innych notach (np Atmega16) reszta bitów jest oznaczona jako "0" czyli że muszę w tych miejscach wysyłać zera:
    [AVR]Protokół ISP i adresowanie pamięci powyżej 128kB

    Lepiej to widać przy instrukcjach programowania eepromu stronami ("a" to adres):
    [AVR]Protokół ISP i adresowanie pamięci powyżej 128kB

    I tu moje pytanie jak ten adres tworzyć. Obecnie gdy ładuję stronę danymi, to ze starszych bitów adresu wycinam dane związane z adresem strony we flashu tak aby wynosiły 0. Później gdy zapisuję stronę, to z adresu wywalam dane z młodszych bitów. I działa to dobrze. Czy nie mogę podawać całego adresu obojętnie z której komendy korzystam? Bo później przy data polling muszę ten adres z powrotem ładnie skleić do kupy i mieć pewność że trafię w ten sam bajt w pamięci który jako ostatni zapisywałem do strony. No i ogólnie kod rośnie.

    Podejrzałem plik konfiguracyjny avrdude i tam są wpisy dla każdego układu z osobna, dane sklejone tak jak nota przykazała, tzn bity adresu które nie są wykorzystywane są "x".

    Mam nadzieję że nie naplątałem zbytnio :)
  • REKLAMA
  • Pomocny post
    #5 9465149
    BoskiDialer
    Poziom 34  
    "adr MSB" możesz traktować jako górny bajt adresu (nie licząc rozszerzenia), "addr LSB" jako dolny bajt adresu, przy czym pamięć należy traktować jako zorganizowaną słowami - musisz przywyknąć, że pod jednym adresem mieszczą się dwa bajty, górny i dolny, a więc traktując pamięć jako zorganizowaną bajtami najniższy bit będzie przeznaczony do wyboru czy zapisać do górnego czy dolnego bajtu.

    Bity które są opisane jako don't care mogą być dowolne i można tam wysyłać co się chce. Przy zapisie stronami adres dzieli się jeszcze ze względu na stronę oraz adres wewnątrz strony: najpierw wpisuje się dane do zatrzasku poprzez "load program memory page", tam podaje się adres wewnątrz strony, później stronę zapisuje się w całości - do tego podaje się adres strony, pod którą ma być zapisana zawartość zatrzasku. Bity X w poleceniu "write program memory page" powodują, że adres dowolnego wyrazu wewnątrz strony identyfikuje odpowiednią stronę bez konieczności ucinania bitów adresu - są one [dolne bity] przesyłane, ale są ignorowane.

    Co do bitów, gdzie raz pojawiają się 0 a raz iksy, większość programatorów i tak traktuje te bity jako iksy, jako że tak jest prościej: wysyła się np 8 bajtów (przypuśćmy, że strona ma 4 słowa = 8 bajtów) pod adresy od 16 do 23 (mimo, że górna część adresu jest i tak ignorowana i dane lecą pod 0-7 do zatrzasku), potem realizuje się zapis strony pod adres 16. Czasem mając zmienną z adresem mniej operacji wykonuje się wysyłając adres ostatniego bajtu strony - efekt jest identyczny (kilka dolnych bitów adresu jest porzucana) a kod jest odrobinę prostszy.

    Przykładowo możesz sobie przeanalizować kod z usbasp, kod używający "Load Extended Address" znajdziesz w temacie https://www.elektroda.pl/rtvforum/topic1864344.html - ściślej plik firmware/isp.c, funkcje ispUpdateExtended (mój dodatek), ispWriteFlash, ispFlushPage i inne - są one dość proste, więc nie będziesz miał problemu ich zrozumieć.
    -- edit:
    Sam nie umiem się przyzwyczaić, że pamięć flash zorganizowana jest fizycznie słowami: zapis 8 bajtów począwszy od adresu 16(licząc bajtowo; 8 licząc słowami) wyglądał by tak:
    zapis wyrazu 8, bajt dolny i górny; zapis wyrazu 9 bajt dolny i górny, zapis do 10(lo/hi), zapis do 11(lo/hi) a potem zapisanie strony o adresie pierwszego wyrazu 8
  • #6 9465993
    manekinen
    Poziom 29  
    W ogóle, to jest ładnie namieszane z tym programowaniem szeregowym. Co układ, to inaczej trzeba go traktować. Jak by nie mogli się zdecydować na jedno :)

    Napisałeś:
    BoskiDialer napisał:
    instrukcje "Load program memory page, High/low byte" używa się łącznie, bit 0 adresu wybiera jedną z tych dwóch instrukcji

    i:
    BoskiDialer napisał:
    pod jednym adresem mieszczą się dwa bajty, górny i dolny, a więc traktując pamięć jako zorganizowaną bajtami najniższy bit będzie przeznaczony do wyboru czy zapisać do górnego czy dolnego bajtu


    Z początku nie mogłem załapać o co chodziło z tym pierwszym bitem adresu, bo z tego co zrozumiałem z noty to górną czy dolną połówkę słowa wybiera się trzecim bitem w pierwszym bajcie komendy ładowania danych do strony, daje się odpowiednio 40h lub 48h. Adres słowa w stronie wybiera się począwszy od bitu 0, więc adres słowa nie zmienia się dla dolnego/górnego bajtu - dolny/górny wybieram w pierwszym bajcie komendy a nie w adresie. Zarówno przy zapisie jak i przy odczycie. Ale zajrzałem do źródeł usbasp i już widzę jak to jest rozwiązane. Przyjęte jest adresowanie bajtami, i ten zerowy bit adresu leci właśnie do bajtu którym się wybiera dół/góra. Ja u siebie z góry przyjąłem adresowane słowami i cały adres leci tam gdzie powinien, bez przesuwania tego najmłodszego bitu - ale widzę że w usbasp jest to fajnie rozwiązane.

    Widzę też że usbasp obsługuje poll flash oraz delay, czemu nie potrafi odczytać flagi RDY? Sporo układów to ma. Nie wiem też co robi poll flash przy zapisie do strony (w ispWriteFlash), czyżby niektóre procesory tego wymagały? No ale to pytania chyba do autora raczej :)

    No ale ogólnie sporo się wyjasniło.

    Nawigator napisał:
    a szczególnie w której?
    Robisz nowy programator?

    W notach układów które posiadają przynajmniej 128kB pamięci flash, choć nie wiem po co tam to opisano skoro extended address jest potrzebny tylko w przypadku większych pamięci. Tak, robię własny programator. W zasadzie to już prawie zrobiony tylko to adresowanie muszę dobrze rozgryźć żeby jakieś kwiatki nie wychodziły.

    Pozdrawiam
  • #7 9466949
    BoskiDialer
    Poziom 34  
    W usbasp najniższy bit działa tak jak napisałeś: wybiera jedno z dwóch poleceń. W zasadzie to bardzo dużo ułatwia.

    Co do pollingu, jest to jedyne rozwiązanie przy ISP które umożliwia sprawdzenie, czy zapis dalej trwa - chyba, że coś pominąłem pisząc poprawki dla usbasp oraz robiąc kilka innych programatorów na użytek własny.

    Polling przy przy zapisie do strony (w ispWriteFlash) nie jest tym co myślisz - jakoby to było przy zapisie strony. Starsze avr'ki były programowane bajt po bajcie - nie istniało dla nich polecenie Write Page - polling przeprowadza się wtedy po każdym bajcie z osobna. Rozróżnienie jest na linijkach
    Kod: text
    Zaloguj się, aby zobaczyć kod

    które w przypadku zapisu stronami powoduje pominięcie przepytywania
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 9467017
    manekinen
    Poziom 29  
    To właśnie te staruszki AT90S są programowane bajt po bajcie. Mam to też zrobione, ale po prostu nie zauważyłem że komenda "write program memory" ma identyczną wartość co komenda "load program memory page".

    Istnieje jeszcze inny sposób na sprawdzenie czy zapis się zakończył, komenda "Poll RDY/BSY"

    F0h
    00h
    00h
    data out

    Gdzie najmłodszy bit w data out: 1-operacja jeszcze trwa, 0-gotowość do przyjęcia kolejnych danych. Jest to np w Attiny25/45/85, w niektórych notach też ta komenda jest w tabelce, ale jeśli nie wspomniano o tym w opisie programowania flash, to znaczy że komenda nie będzie działać (sprawdzałem w Atmega16, zwraca ciągle 0).

    Choć wątpię że to w jakiś sposób przyśpiesza to sprawdzenie, odczyt pewnie będzie trwał tyle samo czasu co wyciągnięcie któregoś bajtu z pamięci i porównanie.
  • #9 9467087
    BoskiDialer
    Poziom 34  
    Masz rację. Istnieje polecenie "Poll RDY/BSY", ale jest ono dość nowym nabytkiem do zestawu instrukcji ISP. Moja kolekcja pdf mówi, że m2561 zawiera tą instrukcję, m128 niestety nie, m32 nie, m644 tak, m8hva tak, m323 nie. tiny2313A tak, attiny2313 tak. Widocznie czytając dokumentacje częściej używałem tych, które nie zawierały informacji o tym poleceniu (jako wzorcowy zwykłem używać dokumentację do m128).
  • REKLAMA
  • #10 9470040
    Nawigator
    Poziom 33  
    Myślałem ze już wszystko o programatorach ISP zostało powiedziane a tak nie jest.
    Była dodatkowa nota Atmela - poradnik faq jak projektować isp ale po ostatnich "porządkach" na ich stronie nie podejmuję się jej odnaleźć.
    W tematycznych linkach mam tylko jeszcze http://www.fourwalledcubicle.com/ButtLoad.php może tam jeszcze jakieś wskazówki się trafią.

    N.
  • #11 9479145
    manekinen
    Poziom 29  
    Przejrzałem tego ButtLoad'a, za duży bałagan w źródłach jak dla mnie :)

    Super gdybyś odnalazł tą notę. W AVR910 jest trochę napisane ale to dosyć stare jest.

    Zauważyłem pewną niespójność, jedne procesory mają podane np 4ms w "minimum wait delay" dla operacji chip erase, a inne 9ms. No cóż, nie każdy który sprawdzałem nadążał czyścić pamięci w te 4ms. Gdy próbowałem po 4ms słać dane do flasha do nic się nie zapisywało. Pomaga dopiero 9ms. Trochę się z tym namęczyłem bo nagle połowa procesorów przestała mi się programować :(

    A tutaj wyniki moich wypocin, pamięć flash, target: Atmega644A
    Zapis 64kB ~6s
    Odczyt 64kB ~5s

    Myślę że nie jest źle :)

    Tak więc udało mi się to opanować, dzięki Panowie ;)

    Programator będzie za free, postaram się niedługo opublikować ;)

    Gdyby ktoś miał jakieś pytania to temat zostawiam otwarty, chętnie pomogę.

    Pozdrawiam!
  • Pomocny post
    #12 9480907
    Nawigator
    Poziom 33  
    Tej noty Atmela o ile pamiętam ze strony support atmel.no nie widzę a logować się do nich ponownie nie mam ochoty bo co chwilę zmieniają adresy.
    Kopii nie mam bo mi padł dysk na którym to miałem.
    Zresztą faktycznie to mogło być już przestarzałe.
    Zobacz tu kilka not od zawodowych twórców programatorów:
    http://www.equinox-tech.com/products/downloads.asp?details=52
    a to pewnie znasz:
    http://www.mikrocontroller-projekte.de/Mikrocontroller/AVR-Prog/AVR-Programmer.html
    A tak w ogóle co to za projekt który robisz?

    N.
  • #13 9584225
    manekinen
    Poziom 29  
    Obiecałem że pokażę co z tego wyszło, więc proszę:





    Jeszcze nie miałem jak przetestować tego rozszerzonego adresowania niestety :(

    Ale dodam że adresu nie dzielę na nr strony i na adres w stronie, tzn nie maskuję bitów które są oznaczone jako "x" - ślę cały adres i nie ma z tym żadnych problemów, przetestowałem z: tiny13, tiny2313, tiny45, mega8, mega88, mega16, mega32, mega328, mega644.

    A szczegóły - na stronie projektu http://diy.elektroda.eu/uprog-maly-szybki-przenosny-programator-avr-z-sd/

    Pozdrawiam i jeszcze raz dzięki za pomoc :)
  • #14 9585650
    Nawigator
    Poziom 33  
    Jak widzę doceniono Kolegę za wielką wodą, dobry projekt zawsze jest mile widziany:
    http://hackaday.com/2011/06/06/the-complete-avr-programmer-that-fits-in-your-pocket/
    I trochę autoreklamy nie zaszkodzi. Szczere gratulacje!

    N.

    P.S. Dobre wiadomości szybko się rozchodzą. Brawo!
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=107683
    To też pokazuje że warto mieć angielskie wersje swoich stron w sieci.

    N.
  • REKLAMA
  • #16 9715771
    manekinen
    Poziom 29  
    BoskiDialer napisał:
    "Load Extended Address" powoduje wpisanie wysłanego bajtu do wewnętrznego zatrzasku, który w ten sposób rozszerza długość adresu zadawanego pozostałymi poleceniami. Jeśli przy "Load Extended Address" podasz wartość 0, to pozostałe instrukcje operują na pamięci flash od 0 do 128KB, jak podasz 1 to od 128KB-256KB


    No i dokładnie tak to działa - dzisiaj to przetestowałem na M2560. Nie ma najmniejszych problemów. Wystarczy raz wysłać komendę i od tej pory działamy na wybranym "bloku" pamięci.

    Temat myślę że wyczerpany, jeszcze raz dzięki i zamykam :)

    //dodano (hmm to można edytować posty po zamknięciu tematu?)


    Po wysłaniu komendy "load extended address" TRZEBA odczekać kilka ms zanim rozpocznie się zapis do pamięci. W przeciwnym przypadku układ nie będzie jeszcze gotowy i pierwsze kilkanaście bajtów wyślemy co najwyżej w kosmos. Trochę mi to nerwów dzisiaj zjadło - gdy z włączonym debugowaniem układ się programował a bez niego już nie :)
REKLAMA