Stránka 1 z 2
atmega8 - bootloader
Napsal: 06 bře 2016, 11:41
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é...?
Napsal: 06 bře 2016, 11:52
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.
Napsal: 06 bře 2016, 11:54
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ť

Napsal: 06 bře 2016, 12:25
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.
Napsal: 06 bře 2016, 12:33
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é.
Napsal: 06 bře 2016, 12:38
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.
Napsal: 06 bře 2016, 12:46
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
Napsal: 06 bře 2016, 12:49
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ě.
Napsal: 06 bře 2016, 16:05
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
Napsal: 06 bře 2016, 16:32
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
Napsal: 06 bře 2016, 16:44
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.
Napsal: 06 bře 2016, 17:28
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).
Napsal: 06 bře 2016, 17:34
od lesana87
Já v těch fuse bitech vidím jednu nesrovnalost. SUT máš nastavené na BOD enabled, ale BOD máš disabled.
Napsal: 06 bře 2016, 18:29
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í
Napsal: 06 bře 2016, 19:51
od lesana87
Nastavení dolních fusebitů na 0xDF znamená nastavení režimu na obrázku, ale BOD je zakázaný.