atmega8 - bootloader

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

atmega8 - bootloader

#1 Příspěvek od Dan555 »

Zdravím. Snažím se do atmega8A nahrát bootloader, abych ho mohl programovat pomocí signálů DTR, RX a TX (UART). Pokud bootloader (určený pro atmega328) nahraji do atmega328p pomocí prostředí arduino IDE (volba Vypálit zavaděč), je vše v pořádku, následně přes UART tento obvod komunikuje. Pokud ale stejným postupem v prostředí arduino IDE nahraji bootloader do atmega8A (s volbou čipu atmega8 a s příslušným bootloaderem pro atmega8), program sice nahrávat přes UART lze (volba "Nahrát" neskončí chybou, ale obvyklou hláškou - konec nahrávání - takže je asi vše ok), jenže se nespustí žádný program. Ještě dodám, že přes SPI program do atmega8A nahraji v pohodě (jenže si tím zruším bootloader). Obvod se zdá být v pořádku (dělají to všechny mé atmega8A obvody), pcb s externím krystalem 16MHz je pro jiný typ mikročipu funkční, prostě nemohu přijít na to, kde dělám chybu. Bootloader se v atmega8A zdá být naprogramovaný, díval jsem se na výpis jeho paměti. Nesetkali jste se s tím někdo také...?
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#2 Příspěvek od FHonza »

první co mně napadá: zkontroluj fuse byty. Při nahrávání bootloaderu přes Arduino IDE se mění podle vybrané desky. Potom při nahrávání samotného programu IDE předpokládá, že jsou nastavené tak, jak je napsáno u příslušné desky.

Osobně když se už rozhodnu použít Arduino, tak vůbec bootloader nepoužívám. Když máš programátor, tak je to vcelku zbytečný. Stačí v IDE nastavit příslušný programátor (menu Nástroje -> programátor). Potom po kompilaci nahrát *.hex příkazem Projekt -> Nahrát pomocí programátoru.
Má to tu výhodu že se IDE nesnaží měnit fuse. Takže např. u ATMega8 jdou použít i porty PB6 a PB7.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#3 Příspěvek od FHonza »

Jeejda píše:No, to bude zřejmě tím, že program přeložený pro ATmega328 prostě nelze cpát do ATmega8.


Myslím že tohle problém nebude, Dan555 píše "s volbou čipu atmega8 a s příslušným bootloaderem pro atmega8", tím se vybere správný bootloader.

Edit:
Jeejda: odpusť :)
Naposledy upravil(a) FHonza dne 06 bře 2016, 12:04, celkem upraveno 1 x.
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

#4 Příspěvek od Dan555 »

Jeejda píše:Nenapsal jsi jestli máš originální desku a jakou přesně, nebo nějakou dělanou? Býval problém s USB externím převodníkem, pokud neměl vyveden tuším ještě DTR, tak bylo třeba po nahrátí programu resetovat MCU ručně v nějakém vymezeném intervalu, jinak se to nerozběhlo. Já zkoušel ATmegu8 na dělaným Arduinu Serial přímo přes hw COM port a tam to šlapalo dobře.

Pak zbývá ještě obligátní knížecí rada - kup ATmegu328P.


Ne, o koupi nejde. Mám oba druhy obvodů, jde mi o to, že mi to prostě nefunguje a fungovat by mělo. Navíc atmegy8 mám do projektů, kde si vystačím s pár kB paměti, v takoém případě je jejich poloviční cena příjemným pocitem. :-)
Na převodníku vyvedený DTR mám, mám jej zapojený v sérii s kondenzátorem 100n na reset pin atmegy - a ten mám přes 10k rezistor připojený na Ucc. Takhle to funguje s obvody atmega328p. Leda by to s atmega8A takhle zapojit nešlo... Vida, zkusím...
Desku mám samovýrobu, vlastně jen MCU s krystalem 16MHz (atmega8A by 16MHz podle datasheetu zvládat měla) a s piny vyvedenými na kolíkové lišty. Takové hodně minimalistické zapojení, kde jsem problém nepředpokládal zejména proto, že s atmega328p tahle deska funguje.
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

#5 Příspěvek od Dan555 »

FHonza píše:první co mně napadá: zkontroluj fuse byty. Při nahrávání bootloaderu přes Arduino IDE se mění podle vybrané desky. Potom při nahrávání samotného programu IDE předpokládá, že jsou nastavené tak, jak je napsáno u příslušné desky.

Osobně když se už rozhodnu použít Arduino, tak vůbec bootloader nepoužívám. Když máš programátor, tak je to vcelku zbytečný. Stačí v IDE nastavit příslušný programátor (menu Nástroje -> programátor). Potom po kompilaci nahrát *.hex příkazem Projekt -> Nahrát pomocí programátoru.
Má to tu výhodu že se IDE nesnaží měnit fuse. Takže např. u ATMega8 jdou použít i porty PB6 a PB7.


Občas mám zapojení, které ladím složené, ale místo pro SPI konektor se mi tam už nevejde. Tak si vyvedu jen UART a ladím to přes něj. Takhle mi to fungovalo s atmega328p.

Naprogramované pojistky obvodu jsem přečetl jiným programem, jsou nastavené na L-fuse: DF a H-fuse:CA , podle všeho by měly být správné.
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

#6 Příspěvek od Dan555 »

Ono se to opravu tváří tak, že bootloader (použil jsem ten z IDE, ale zkoušel jsem i optiboot) přijme přes UART program, ale nespustí ho. Je mi to záhadou, nezaznamenali jste někdo obdobné obtíže? Ještě zkusím přepnout pojistky na vnitřních 8MHz, ale nevím, jestli tahle frekvence zvládne obsloužit UART.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#7 Příspěvek od FHonza »

L: 0xdf a H: 0xca je dobře když je připojen 16Mz krystal. Teď jsem to vyzkoušel na nepájivém poli a funguje mně to prostou výměnou procesorů (a samozřejmě volbou desky).

Jakou verzi IDE používáš, resp. jaký bootloader do mega8 nahráváš ? Já tam mám ATmegaBOOT-prod-firmware-2009-11-07.hex
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#8 Příspěvek od FHonza »

Dan555 píše:Ještě zkusím přepnout pojistky na vnitřních 8MHz


Nezapomeň změnit frekvenci v boards.txt, jinak to nebude fungovat určitě.
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#9 Příspěvek od frpr666 »

    1. programovací adaptér na Atmely a vypálit bootloader do tolika Atmega8 kolik je potřeba.
    2. nastavit fuse bity: SPM is not allowed to write to the Boot Loader section
    3. vesele používat Atmega8 s bootloaderem
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

#10 Příspěvek od Dan555 »

frpr666 píše:
    1. programovací adaptér na Atmely a vypálit bootloader do tolika Atmega8 kolik je potřeba.
    2. nastavit fuse bity: SPM is not allowed to write to the Boot Loader section
    3. vesele používat Atmega8 s bootloaderem


Omlouvám se, ale nerozumím bodu 2
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

#11 Příspěvek od Dan555 »

FHonza píše:L: 0xdf a H: 0xca je dobře když je připojen 16Mz krystal. Teď jsem to vyzkoušel na nepájivém poli a funguje mně to prostou výměnou procesorů (a samozřejmě volbou desky).

Jakou verzi IDE používáš, resp. jaký bootloader do mega8 nahráváš ? Já tam mám ATmegaBOOT-prod-firmware-2009-11-07.hex


Zkoušel jsem tam nahrát oba bootloadery z IDE (+ ještě i optiboot), tenhle i ATmegaBOOT.hex, výsledek byl stejně bezútěšný. Problém by ale mohl být v IDE, nejspíše mám špatný proces pálení bootloaderu, protože abych to dokázal i pro atmega8, musel jsem předtím modifikovat některé soubory (dle nějakého zahraničního návodu) - mé originál prostředí IDE totiž vypálit bootloader do atmega8 původně nedokázalo, hlásilo chybu, neboť se snažilo zapsat i extended fuses pojistky, které ale atmega8 nemá.
Napadají mne v současnosti dvě cesty:

1. požádat o zaslání hex obsahu tvého fungujícího mega8, včetně nastavení pojistek - vypálil bych to v jiném programu než IDE (mám na to Extreme Burner) - a pak by se vidělo, kde je problém

2. požádat o zaslání modifikace boards.txt, která pro atmega8 v tvém IDE funguje, abych si atmega8 do IDE přidal znovu a regulérně. Prozatím používám modifikovanou volbu "arduino NG or older", protože jedině tam jsem nalezl typ obvodu atmega8

Oba tyhle body nedokážu vygooglit, resp. nalezené (povětšinou zahraniční) návody nefungují. Jo a používám prostředí 1.6.5-r2.
Uživatelský avatar
Dan555
Příspěvky: 36
Registrován: 03 bře 2016, 00:00

#12 Příspěvek od Dan555 »

Rád bych se podělil o nové informace:

- přes UART do atmega8 už nahrávat dokáži. A to teprve tehdy, až jsem do ní vypálil ATmegaBOOT-prod-firmware-2009-11-07.hex
- po nahrání programu se ale program hned nespustí, ale trvá to ještě asi 5 sec
- v sérii s DTR zapojený kondenzátor 100n nefunguje. Musím reset před nahráváním vyvolat ručně, pak mám na nahrání cca 8 sec

Sice to funguje, ale ten reset se mi nějak nezdá. Asi hardwarová odlišnost oproti atmega328. Přesto mám pořád pocit, že ten můj bootloader je nějaký divný. Po nahrání se totiž program nespustí hned, ale jakoby to čekalo na dokončení nějaké časovací smyčky.

Pro kontrolu: Namísto atmega8 jsem do svého zapojení vložil atmega328 a vše funguje jak má (s příslušným nastavením).
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#13 Příspěvek od lesana87 »

Já v těch fuse bitech vidím jednu nesrovnalost. SUT máš nastavené na BOD enabled, ale BOD máš disabled.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#14 Příspěvek od FHonza »

Když je nastaveno L: 0xDF a H: 0xCA (jak jsem psal), tak je nastaveno:
SUT
SPIEN
BOOTSZ1
BOOTRST
CKOPT

takže bych řek že fuse jsou správně.

A ještě pro jistotu, takhle vypadá funkční část boards.txt (společná deska pro megu168 a 8, liší se pouze volba procesoru):

Kód: Vybrat vše

##############################################################

atmegang.name=Arduino NG or older

atmegang.upload.tool=avrdude
atmegang.upload.protocol=arduino
atmegang.upload.speed=19200

atmegang.bootloader.tool=avrdude
atmegang.bootloader.unlock_bits=0x3F
atmegang.bootloader.lock_bits=0x0F

atmegang.build.mcu=atmegang
atmegang.build.f_cpu=16000000L
atmegang.build.board=AVR_NG
atmegang.build.core=arduino
atmegang.build.variant=standard

## Arduino NG or older w/ ATmega168
## --------------------------------
atmegang.menu.cpu.atmega168=ATmega168

atmegang.menu.cpu.atmega168.upload.maximum_size=14336
atmegang.menu.cpu.atmega168.upload.maximum_data_size=1024

atmegang.menu.cpu.atmega168.bootloader.low_fuses=0xff
atmegang.menu.cpu.atmega168.bootloader.high_fuses=0xdd
atmegang.menu.cpu.atmega168.bootloader.extended_fuses=0x00
atmegang.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex

atmegang.menu.cpu.atmega168.build.mcu=atmega168

## Arduino NG or older w/ ATmega8
## ------------------------------
atmegang.menu.cpu.atmega8=ATmega8

atmegang.menu.cpu.atmega8.upload.maximum_size=7168
atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024

atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xdf
atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca
atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex

atmegang.menu.cpu.atmega8.build.mcu=atmega8


Edit: Je to pro IDE 1.6.7, pro starší nebude funkční
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#15 Příspěvek od lesana87 »

Nastavení dolních fusebitů na 0xDF znamená nastavení režimu na obrázku, ale BOD je zakázaný.
Přílohy
fuses.png
(10.75 KiB) Staženo 123 x
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“