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

Ręczne wprowadzanie kodu binarnego do mikrokontrolera Attiny13 - możliwości i źródła informacji

krzysiekde3 11 Lis 2023 13:25 282 4
REKLAMA
  • #1 20809622
    krzysiekde3
    Poziom 6  

    Dzień dobry!
    Chciałem zapytać szanowne Grono Programistów o możliwość wpisania w mikrokontroler np. Attiny13 prostego programu realizującego ustawienie stanu 1 na pinie PB4. Robiłem to już milion razy w Arduino jak i w czystym C przy pomocy USBasp oraz płytki Arduino. Do rzeczy: chciałbym zrobić to metodą kamienia łupanego, czyli ręcznym wpisaniem zer i jedynek w odpowiedniej sekwencji na odpowiednie wejście uC. W związku z tym chcę zapytać o to, czy jest w ogóle taka możliwość (nie pytam o sens) i gdzie szukać informacji, jak miałaby ta sekwencja wyglądać? Czy informacje zawarte w nocie katalogowej są wystarczające?
  • REKLAMA
  • REKLAMA
  • #3 20809843
    tmf
    VIP Zasłużony dla elektroda
    W nocie ATTiny13 masz opis programowania, gdzie znajdziesz potrzebne informacje. Całkowicie ręcznie trudno będzie to zrobić, bo tam są chyba jakieś maksymalne czasy, kiedy MCU się spodziewa określonej akcji. Także technicznie da się to zrobić, jednak w praktyce lepiej napisać jakiś program. Np. użyj FT232 w trybie bit bang i na pC napisz sobie program, który będzie sterował MCU.
  • REKLAMA
  • #4 20809858
    gps79
    Poziom 35  
    Jak już będziesz miał kod binarny (lub HEX), to zacznij programować mikrokontroler zgodnie z procedurą opisaną w
    https://ww1.microchip.com/downloads/en/DeviceDoc/ATtiny13A-Data-Sheet-DS40002307A.pdf
    w rozdziale 16. Self-Programming the Flash
    co jest zwykle wykonywane przez programator.
    Możesz też zajrzeć do źródeł bootloadera Arduino, aby zobaczyć w jaki sposób odbywa się programowanie FLASH poprzez dane odbierane na porcie UART
    https://github.com/Optiboot/optiboot/tree/master/optiboot/bootloaders/optiboot

    Całość wymaga zrozumienia architektury AVR i języka assembler.
  • #5 21155360
    Sam Sung
    Poziom 33  
    tmf napisał:
    W nocie ATTiny13 masz opis programowania, gdzie znajdziesz potrzebne informacje. Całkowicie ręcznie trudno będzie to zrobić, bo tam są chyba jakieś maksymalne czasy, kiedy MCU się spodziewa określonej akcji.
    W nocie ATtiny13A w rozdziale 17.6.1 jest opisane Serial Programming i nie widzę tam żadnych maksymalnych czasów, są tylko minimalne, więc powinno się dać.
    Trzebaby zmajstrować ręczny programator z podciągami do jedynki, przełącznikiem do masy na nRST, przyciskiem chwilowym normalnie zwartym (do masy) na SCK, przyciskiem chwilowym na MOSI, diodą świecącą z opornikiem na MISO. I zapewnić, żeby żadne drgania styków nie przedostawały się na mikrokontroler...
    Wysyłając bit wciskamy (lub nie) przycisk na MOSI, żeby uzyskać stan bitu 0 albo 1, i naciskamy i trzymamy przycisk SCK. W tym momencie odczytujemy stan diody i to jest odpowiedź ATtiny. Następnie puszczamy przycisk SCK i cykl transferu jednego bitu jest zakończony.
    Po ośmiu takich cyklach mamy wysłany i odebrany jeden bajt, przy czym zaczynamy zawsze od najstarszego do najmłodszego bitu. Transmisja jest zorganizowana w paczki 4-bajtowe.
    Załóżmy, że mamy do wgrania bardzo krótki program (do 32 bajtów), który mieści się na jednej stronie pamięci flash. Żeby go zaflashować, musimy wykonać "power-up sequence", czyli włączyć zasilanie z nRST=0 (ew. po włączeniu podać 1 i spowrotem przełączyć na 0 linię nRST), a potem przesłać:
    1. Programming Enable, czyli sekwencję 1010 1100 0101 0011 xxxx xxxx xxxx xxxx (x=nieważne czy 0 czy 1) i upewnić się, że wysyłając trzeci bajt ATtiny odpowiada nam sekwencją 0101 0011 (czyli tym, co wysłaliśmy jako drugi bajt)
    2. Teraz dla każdego bajtu naszego programu musimy wysłać Load Program Memory Page - 0100 H000 000x xxxx xxxx bbbb iiii iiii, gdzie H to najmłodszy bit adresu bajtu na stronie, bbbb to adres słowa na stronie (inaczej po prostu adres bez najmłodszego bitu, który idzie do H), a iiii iiii to bajt instrukcji (programu, który wgrywamy). Czyli np.
    0100 0000 0000 0000 0000 0000 bajt0
    0100 1000 0000 0000 0000 0000 bajt1
    0100 0000 0000 0000 0000 0001 bajt2
    0100 1000 0000 0000 0000 0001 bajt3
    0100 0000 0000 0000 0000 0010 bajt4
    0100 1000 0000 0000 0000 0010 bajt5
    itd.
    3. Na koniec musimy wypalić stronę w pamięci wysyłając Write Program Memory Page - 0100 1100 0000 00aa bbbb xxxx xxxx xxxx, gdzie aabbbb jest numerem 32-bajtowej strony, czyli 0 (zatem 0100 1100 0000 0000 0000 0000 0000 0000)
    Czyli 32-bajtowy program zaflashujemy naciskając SCK zaledwie 34*4*8=1088 razy :)
    Aha: to przy założeniu, że pamięć jest czysta, bo jeśli nie, to między krokiem 1 a 2 trzeba ją skasować wysyłając Chip Erase - 1010 1100 100x xxxx xxxx xxxx xxxx xxxx.
    A na zakończenie wypadałoby jeszcze sekwencją komend Read Program Memory - 0010 H000 0000 000a bbbb bbbb oooo oooo sprawdzić, czy dostaniemy z ATtiny takie same oooo oooo, jakie powysyłaliśmy iiii iiii dla każdego adresu.
    Potem możemy przełączyć nRST na jedynkę i cieszyć się uruchomionym programem.
REKLAMA