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
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Bootloader dla ATMEGA8

Post autor: Aro » 18 sie 2007, 9:36

Witam,
Potrzebuje bootloadera o jak najmniejszym rozmiarze czyli do 256B. Na necie nie znalazłem takiego "chudego", a przynajmniej na polskich stronach. Przepisałem z książki, ale niestety nie działa:( Pojawiają się błędy przy transmisji. Nie znam dobrze asemblera i nie mogę znaleźc błędów w programie. Bootloader przepisany z książki jest poniżej w załączniku.
Załączniki
bootloader.rar
(1.08 KiB) Pobrany 538 razy

ZbeeGin

Post autor: ZbeeGin » 18 sie 2007, 9:55

A czym taktowany jest procesor - wewnętrzny oscylator RC?

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 18 sie 2007, 11:49

Tak wewnętrzny 1MHz. Transmisje rs232 może prowadzic normalnie przy tym kwarcu. Zarówno w języku C jak i w bascomie z gotowymi funkcjami print nie było problemu. A w tym bootloaderze ponizej jest tak, że na terminalu bascoma wyświetla się prawidłowo "rs232ok" oraz po naciśnieciu przycisku "bootloader" i zaraz potem dwa dziwne znaczki zamiast "B?". Mimo tego próbowałem wrzucic program. Przy każdej zapisywanej lini na terminal powinien wędrowac "?" Nie było nic. Do flash'a tez nic się nie zapisało.

ZbeeGin

Post autor: ZbeeGin » 18 sie 2007, 15:20

Przeanalizowałem prolog bootloadera:

Kod: Zaznacz cały

_b_start:
   ldi   t,   re_h			
   !out  SPH, t
   ldi   t,   re_l
   !out  SPL, t		'ustaw adres stosu na $045F
   ldi   t,   $00		'normalna transmisja, bez trybu multicpu
   !out UCSRA, t
   ldi   t,   $18		'przerwania USART wyłączone, transmisja włączona w obie strony
   !out UCSRB, t
   ldi   t,   $86		'praca asynchroniczna, bez parzystości, 1 bit stopu, 8-bitów danych
   !out UCSRC, t
' ----------------------------------------
   ldi   t,   $00		'ustaw UBRRH (bity 11..8 jako 0000)
   !out $20 ,t
   ldi   t,   $12		'ustaw UBRRL (bity 7..0)
   !out $09, t
' ----------------------------------------
Spróbuj usunąć ten zaznaczony fragment, bo on ustawia nową prędkość transmisji równą 3289 bodów. Ale lepiej będzie zmienić to na:

Kod: Zaznacz cały

' ----------------------------------------
   ldi   t,   $00		'ustaw UBRRH (bity 11..8  UBRR)
   !out $20 ,t
   ldi   t,   $0c		'ustaw UBRRL (bity 7..0  UBRR)
   !out $09, t
' ----------------------------------------
Który ustawi prędkość taką samą jak podaną w dyrektywie $BAUD, czyli 4807 bodów.

Wyprzedzając Twoje pytanie to $BAUD także ustawi 4807 gdyż przy 1MHz nie da się dokładnie ustawić każdej standardowej prędkości transmisji.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 18 sie 2007, 19:09

Wielkie dzięki:)
Taki malutki błędzik, że nie zauważyłem. $0c=12. Zapomniałem zamienic dec na hex.
Dzisiaj już nie sprawdze, jutro dam znac czy działa, pozdro.

[ Dodano: 2007-08-19, 10:21 ]
Niestety, nie pomaga, zamiast dziwnych znaczków wyświetla ...jeszcze dziwniejsze. Może cos w ustawieniach nie tak?
Załączniki
ustawienia.JPG
ustawienia2.JPG

ZbeeGin

Post autor: ZbeeGin » 20 sie 2007, 19:34

Aro pisze:Niestety, nie pomaga, zamiast dziwnych znaczków wyświetla ...jeszcze dziwniejsze. Może cos w ustawieniach nie tak?
To znaczy jakie znaczki? Może mógłbyś stworzyć loga z transmisji, co się tam dzieje.

Spróbuj wyłączyć emulację terminala. Zmień TTY na None.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 20 sie 2007, 19:53

Nie ma opcji none:/
A oto co wyświetla:

Kod: Zaznacz cały

rs232ok
bootloaderCá

ZbeeGin

Post autor: ZbeeGin » 20 sie 2007, 19:56

A próbowałeś wogóle usunąc te dwie linie zmieniające baudrate (wpis w rejestr UBRR)?
Aro pisze:Przepisałem z książki, ale niestety nie działa
A tak właściwie to co to była za książka?

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 20 sie 2007, 20:13

Tak, wtedy nic sie nie wyświetla poza napisami "rs232" i "bootloader". Ale to i tak musi tam byc, inaczej trzebaby w każdej wczytywanej aplikacji to ustawiac. Oryginalnie było UBRRH i UBRRL, ale kompilator tego nie trawił więc zmieniłem na $20 i $09. Poszukałem tego w pliku hex i wygląda wporządku.

[ Dodano: 2007-08-20, 21:20 ]
A ksiązka to "Programowanie mikrokontrolerów AVR w jezyku Bascom" Marcina Wiązani. Autor pisze że jest zmodyfikowana wersja bootloadera dla ATMEGA8 z pakietu Bascom. Ja w swoim bascomie znalazłem tylko uniwersalny plik boot, ale zajmuje trochę za dużo miejsca.

ZbeeGin

Post autor: ZbeeGin » 20 sie 2007, 20:20

Aro pisze:Oryginalnie było UBRRH i UBRRL, ale kompilator tego nie trawił więc zmieniłem na $20 i $09.
W definicji z BASCOMa jest:
UBRRH =$20 ; Note! UCSRC equals UBRRH
UBRRHI =$20
(...)
UDR =$0c
UCSRA =$0b
USR =$0b
UCSRB =$0a
UCR =$0a
UCSRC =$20 ; Note! UCSRC equals UBRRH
UBRRL =$09
Muszę jeszcze raz przeanalizować ten kod. Coś mi się w nim nie podoba. Dziwne jest odbieranie jednej linii HEX, tak jakby o czymś programista zapomniał... :neutral:

pm36-2
-
Posty: 3
Rejestracja: 23 cze 2006, 21:09
Lokalizacja: Swarzędz k./Poznania

Post autor: pm36-2 » 21 sie 2007, 13:19

Po co się męczyć ? Ostatnio znalazłem bootloadera przez usb na atmege8. Oto adres:
http://www.fischl.de/avrusbboot/

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 21 sie 2007, 14:22

No tak, USB jest dobrym rozwiązaniem, ale... to zajmuje 2048Bajtów!!! A ja sie muszę zmiescic w 256B. No więc jedynym sensownym rozwiazaniem jest tu jakiś sprzętowy interfejs.

ZbeeGin

Post autor: ZbeeGin » 21 sie 2007, 17:08

Aro. Kupiłem sobie dziś ATMega8 (ostatni poszedł we właściwe ręce :) ) i przetestuje tego bootloadera. Nie wiem czy dziś jeszcze zdążę, bo w stykówce mam inny układzik (ATmega88 i boje z PWM).

W symulatorze z BASCOM-a wszystko wygląda prawie idealnie. Zgłasza się program i bootloader. Jeśli ręcznie wpiszę jedną linię hex to zostanie ona wpisana do SRAM i na tym niestety kończą się możliwości symulatora :sad: .

[ Dodano: 2007-08-22, 19:47 ]
Przetesotowałem. Twój bootloader też u Mnie nie działa. Ale problem jest większy: także bootloader Marcina Wiązani u mnie nie działa! Choć wysztko skonfigurowałem wg zaleceń z książki.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 22 sie 2007, 19:17

Cos mi się wydaje że prościej będzie napisac program od początku... 128linijek kodu, tylko jak na to patrze to nie wiem o co w tym biega :shock: , choc ogólne działanie bootloadera jest proste. UART->SRAM->SPM i po kłopocie. Ale i tak tego nie umiem przetrawic.

ZbeeGin

Post autor: ZbeeGin » 23 sie 2007, 15:15

Muszę w weekend spróbować odpalić UART z Mega8 z asemblera. Być może znajdę rozwiązanie tej zagadki, a przypuszczam, że to wszystko wina jego re-konfiguracji.

Jeszcze jednego nie sprawdziłem. Zabezpieczenia pamięci gdzie znajduje się bootloader. Nie dałem tam żadnych restrykcji, a nie jest wykluczone, że tutaj też może leżeć wina.
Aro pisze:tylko jak na to patrze to nie wiem o co w tym biega
W oryginalnym programie 8_33.BAS są kometarze...

ODPOWIEDZ