Bootloader dla ATMEGA8

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 24 gru 2009, 19:22

snow pisze:Plik makefie masz w katalogu w którym kompilujesz i czy masz w nim poprawnie ustawione nazwy plików które chcesz kompilować?
plik makefile tworzę na podstawie kodu C więc nie ma szans żeby go tam nie było. zresztą zapisując go upewniam się czy zapisuję w katalogu który nazwałem bootloader dla atmega8.

w załączniku cały projekt spod WinAVR

udało mi się chyba w końcu wygenerować poprawny bootloader. kod na zakończenie jest taki:

Kod: Zaznacz cały

Size after:
AVR Memory Usage
----------------
Device: atmega8

Program:     330 bytes (4.0% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)


-------- end --------


> Process Exit Code: 0
> Time Taken: 00:00
więc chyba jest ok? dla potomnych w załączniku o nazwie bootloader HEX jest cały bootloader właśnie w pliku HEX.

niestety wyskoczył mi kolejny błąd tymrazem podczas próby załadowania bootloadera do atmegi, a to jego kod:

Kod: Zaznacz cały

Programming Flash memory:
avrdude -p atmega8 -P lpt1 -c usbasp -U flash:w:Bootloader.hex
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
make.exe: *** [program] Error 1

> Process Exit Code: 2
> Time Taken: 00:01
widać że brakuje USBasp, tylko skąd to wziąć? tylko że to trochę dziwne bo ja wyraźnie mam zanzaczone że ma załadować mi hex'a przez port LPT łączem ISP. macie jakies pomysły? bo załadowanie do bascoma nie działa. po załadowaniu pliku HEX do bufora bascoma i tak wyskakują same FF, co raczej znaczy że nic się nie załadowało. niżej screen jak to u mnie wygląda po załadowaniu do bascoma.
Załączniki
zaladowany plik HEX.JPG
bootloader HEX.zip
(573 Bajtów) Pobrany 722 razy
botloader dla atmega8.zip
(11.98 KiB) Pobrany 779 razy

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 24 gru 2009, 21:55

Witam,

Kod: Zaznacz cały

Program:     330 bytes (4.0% Full)
Nie ma szans, żeby bootloader USB zajmował tylko 330 bajtów.

W załączniku przesyłam plik HEX skompilowany u mnie.

Użyj bascoma i ISP do zaprogramowania proca.
Jeśli chodzi o fuse bity, chyba można to w wygodny sposób ustawić z poziomu bascoma.

Na zakończenie jeszcze jedna sprawa. Jeśli masz konwerter USB<->Serial (najlepiej w standardzie TTL) to polecam bootloader avr109. Powód jest taki, że bootloader USB, o którym rozmawiamy wymaga konkretnej wartości kwarcu (tj. 12MHz), zaś korzystając z avr109 komunikujesz się przez port szeregowy, gdzie obostrzenia są mniejsze.
Załączniki
avrusbboot.rar
(2.35 KiB) Pobrany 736 razy

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 24 gru 2009, 21:57

atelszewski pisze:Nie ma szans, żeby bootloader USB zajmował tylko 330 bajtów.
też się zdziwiłem bo to bootloader kolegi mk z forum elektroda i tam zajmuje mu on 512b
zaingerowałem bezpośrednio w plik makefile, a tam było że ma programować właśnie przez usb, a ja nie mam pojęcia jak to się zapisało. bootloader wszedł do procka. zobaczymy co to będzie.

dziękuję za Twoją wstawkę bootloadera.

a na marginesie to WinAVR pokazuje 330b, bo jak kliknę właściwości tego pliku HEX to jest 967b.

po załadowaniu mojego bootloadera do procka mam coś takiego:

Kod: Zaznacz cały

Reading | ################################################## | 100% 2.98s

avrdude: verifying ...
avrdude: 8010 bytes of flash verified

avrdude done.  Thank you.


> Process Exit Code: 0
> Time Taken: 00:07
no i na koniec dnia wrażeń i walki z nieszczęsnym bootloaderem, chyba zwaliłem sobie atmegę, bo prawdopodobnie źle wybrałem fuse bits w sekcji zegara.
na początku wziąłem gdzieś z końca ext crystal resonator hi freq i było ok, ale zachciało mi się kombinacji i wybrałem podobną opcję, ale ze środka i......
WinAVR pokazuje:

Kod: Zaznacz cały

Programming Flash memory:
avrdude -p atmega8 -P lpt1 -c stk200 -U flash:w:Bootloader.hex

avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.


avrdude done.  Thank you.

make.exe: *** [program] Error 1
ale już przynajmniej "trochę" jarzę o co chodzi z tym wszystkim. wszystkich pozdrawiam, wesołych świąt życzę i dziękuję za wskazówki i porady. do jutra.
Ostatnio zmieniony 25 gru 2009, 10:34 przez matrix, łącznie zmieniany 1 raz.

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 24 gru 2009, 22:42

Witam,

Kod: Zaznacz cały

avrdude: 8010 bytes of flash verified
Ciekawe, wyglądałoby na to, że cały flash się zapisał. Rzecz w tym, że bootloader jest umieszczany na końcu pamięci flash, więc tak duża wartość odnośnie weryfikowanego obszaru zapisu wskazuje, że wszystko powinno być poprawnie.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 24 gru 2009, 22:44

atelszewski pisze:Rzecz w tym, że bootloader jest umieszczany na końcu pamięci flash
no i to by się mocno zgadzało bo na początku nie widziałem nic w tabelce bascoma, więc myślałem że nic się nie zapisało, ale później zjechałem niżej i okazało się że jest tam zapis. na samym końcu pamięci flash.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 gru 2009, 9:56

No i oczywiście musi być BOOTRST zaprogramowany i bitami BOOTSZ trzeba wybrać ile na ten bootloader pamięci się przeznacza.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 25 gru 2009, 10:39

snow pisze:No i oczywiście musi być BOOTRST zaprogramowany
gdzie to ustawić? da się w WinAVR?
snow pisze:bitami BOOTSZ trzeba wybrać ile na ten bootloader pamięci się przeznacza
pamiętałem że da się to zrobić w bascomie w sekcji fusów, dlatego chciałem przez niego wgrać HEX'a. na pamięć bootloadera w bascomie ustawiłem za pierwszym razem słowo 1024b, ale WinAVR pokazał mi że ma tylko 330b więc zmieniłam to na 512. tylko jak mówiłem, chyba zwalilem sobie atmegę i na razie nici z testów aż do po świętach. :cry:

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 gru 2009, 11:16

WinAvr to jedynie kompilator (a w zasadzie gcc to kompilator a winavr to zbiór dodatkowych bibliotek pod kątem AVR). Do programowania używasz avrdude. Aby zaprogramować sobie ten bit musisz wpisać zawartość całego hfuse i lfuse przy programowaniu (pojedynczego bitu nie wiem jak zmienić, ale chyba się nie da). Tutaj masz kalkulator fusebitów: http://www.engbedded.com/fusecalc/ . Wybierasz sobie Atmega8 z listy. Po przeładowaniu strony na dole będziesz miał "Current settings" gdzie będą podane wartości hfuse i lfuse jakie musisz zaprogramować (zaraz po wybraniu są fabryczne ustawienia takie jak masz po zakupie nowego procesora). w "Feature configuration" zaznaczasz "Boot Reset vector Enabled (default address=$0000); [BOOTRST=0]" i pod nim wybierasz obszar pamięci jaki chcesz przeznaczyć na bootloader. Na górze są jeszcze ustawienia kwarcu i różne inne opcje. Jak już poustawiasz to patrzysz na dole w Current Settings jak trzeba fusebity zaprogramować.

Teraz pozostaje ci wydanie komendy (np. Start/Uruchom):
avrdude -p atmega8 -P lpt1 -c usbasp -U hfuse:w:0xD9:m -U lfuse:w:0xe1:m
W pogrubione miejsca wpisujesz wartości które odczytasz z Current Settings.

Drugim sposobem który ja stosuje gdyż wydaje mi się bezpieczniejszy to tryb terminala w avrdude. Odpalam:

Kod: Zaznacz cały

avrdude -p atmega8 -P lpt1 -c usbasp -t
poźniej odczytuje lfuse:

Kod: Zaznacz cały

dump lfuse

dla hfuse bedzie

Kod: Zaznacz cały

dump hfuse
i widze jakie mam aktualnie fusebity.
Następnie:

Kod: Zaznacz cały

write lfuse 0000 0xe1
co zapisuje do lfuse wartość 0xe1. Tak samo robimy dla hfuse:

Kod: Zaznacz cały

write hfuse 0000 0xd9
co zapisuje do hfuse wartość 0xd9.
Na koniec wpisujemy

Kod: Zaznacz cały

exit
i wychodzimy z programowania. Od tego momentu mamy zapisane nowe fusebity. Oczywiście są też na avrdude nakładki np. avrdude-gui gdzie można sobie wpisać w okienku wartości i je zapisać. Ja jakoś przywykłem do trybu terminalowego gdzie przez przypadek nie zaprogramuje sobie fusebitów jakimiś dziwnymi ustawieniami (co na przykład w ponyprogu mi się zdarzało).

Można też używać darmowego AvrStudio tam ustawianie fusebitów jest podobne do bascomowego z tego co pamiętam, chociaż co do AVRstudio i pisania w nim programów to ja mam złe doświadczenia albo nie umiem w tym pisać ;)


No to się rozpisałem :P
Ostatnio zmieniony 25 gru 2009, 11:38 przez snow, łącznie zmieniany 3 razy.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 25 gru 2009, 11:18

Matrix będziesz na skypie ???
Jak coś to ja jestem dziś cały dzień odezwij się mam parę pomysłów.
Spróbuj zaprogramować attiny2313 w taki sposób:

Kod: Zaznacz cały

do 
portd=255 
portd=0
loop 
end 
teraz podłącz którąś nogę do xtal2 w atmega8 i podepnij programator może da się odczytać sygnaturę.
PS. może to było xtal1 nie pamiętam ja tak odblokowałem swoje atmega128 jak fusy od kwarcu miałem źle ustawione.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 gru 2009, 11:27

Co do odblokowywania to z tego co pamiętam na noge XTAL1 trzeba podać sygnał ok. 6MHz (czy 1MHz) z generatora i powinno się udać wejść w tryb programowania i przywrócić fabryczne fusebity (o ile nie wyłączyło się resetu i ISP fusebitami).

EDIT: Pikczu mnie ubiegł ;) XTAL1 - przynajmniej w dokumentacji tak piszą.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 25 gru 2009, 11:34

Hehe ja tak odblokowałem dwie atmega128 tylko to było kilka miesięcy temu i juz nie pamiętam która to nóżka. A Kwarc najlepiej 8Mhz

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 25 gru 2009, 12:03

no niestety panowie. nie udało mi się odblokować tej atmegi. na pewno nie zablokowałem ani RST, ani SPI. jedyne co daje się zrobić to zapisać ROM, ale po zakończeniu zapisywania wyskakuje błąd:

Kod: Zaznacz cały

difference at 00000
programator na pewno działa bo programowałem attiny2313. no cóż, zdarzają się wypadki, tak?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 25 gru 2009, 13:05

Nie wiem jak w stk200 ale jak używałem avr studio do programowania i avr isp mk II tam była opcja ustawienia częstotliwości programatora.
Ta częstotliwość musiała być 4 razy mniejsza jak częstotliwość taktowania procesora.
Jelsi była inna to fusy zapisywały się same i chaotycznie, w momencie jak ty zmieniłeś fusy na jakieś ze środka listy wychodzi na to że procek jest ustawiony na częstotliwość niższą niż programatora, zastanawiam się teraz jak to zmienić w stk 200
Jakieś pomysły Panowie??????????????????

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 gru 2009, 14:37

w avrdude jest opcja "-i <delay_ms>" gdzie można sobie zdefiniować opóźnienia zegara ISP. Czy pomoże to nie wiem :)

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 26 gru 2009, 22:18

snow pisze:w avrdude jest opcja "-i <delay_ms>" gdzie można sobie zdefiniować opóźnienia zegara ISP
sorki ale nie bardzo kojarzę. gdzie to się wywołuje? aż tak dobrze nie znam WinAVR.

czy piny przez które wgrywa się bootloader mogą później służyć jako pełnowartościowe we/wy?

a przy okazji, czy można jakoś wyposażyć bootloader w unikalny system który będzie ropoznawał hexa? czyli widzę to tak że do jednego procka taki hex pasuje a do drugiego już nie. coś jak zabezpieczenie programów.

ODPOWIEDZ