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.