úterý 30. prosince 2008

Problémy s atmega64

Atmega64 použitá v řídicím modulu mě zase trochu potrápila. Pořád jsem nemohl přijít na to, proč nefunguje ani jednoduchý program ovládající podsvětlení lcd. Pin spínající tranzistor zkrátka jakoby na nic nereagoval. Několikrát jsem překontrolovat nastavení všech registrů, fuse bitů a... Nic. Po řádné chvíli googlení se mi podařilo odhalit příčinu. Řešení je např. zde:
Za všechno může fuse bit m103c. Naprogramováním tohoto bitu (nastavením na nulu) se mikroprocesor uvede do režimu, kdy je kompatibilní se starším procesorem atmega103. Vše (téměř) funguje normálně - omezeno je jen několik funkcí. Mimo jiné lze například piny portu G používat jen jako vstupní atd. V datasheetu je tento kompatibilní mód dobře popsán, ale nikde ani slovo o tom, že je defaultně zapnutý.
By programming the M103C Fuse, the ATmega64 will be compatible with the ATmega103 regards to RAM, I/O pins and Interrupt Vectors as described above.
Stačí tedy jeden příkaz:
#avrdude -p m64 -c usbasp -U efuse:w:0xFF:m
a vše je rázem v pořádku. Atmega64 se pak chová (a hlavně funguje) jako atmega64 :-)


neděle 21. prosince 2008

Stav projektu k 21.12. 2008

O víkendu jsem se pustil do oživování řídicího modulu. Napájení propojek a smd součástek, včetně procesoru, bylo otázkou chvilky. Horší to už bylo s programováním... Pořídil jsem si programátor usbasp, z obchodu na stavebnice.com. Programátor přišel rychle, ale docela mě překvapilo, že v něm nebyl firmware (na to jsem přišel celkem rychle). Firmware jsem tedy nahrál pomocí ponyprogu na mém starém počítači, který má paralelní port.

Ovšem programátor se pořád nechtěl bavit s modulem. Vyzkoušel jsem tedy komunikaci s již plně oživeným modulem pro ovládání motorků a ono to funguje. Po dlouhém bádání (opravdu dlouhém) se mi podařilo identifikovat chybu. V datasheetu atmega64 je na straně 306 toto:
Even though the SPI Programming interface re-uses the SPI I/O module, there is one important difference: The MOSI/MISO pins that are mapped to PB2 and PB3 in the SPI I/O module are not used in the Programming interface. Instead, PE0 and PE1 are used for data in SPI Programming mode as shown in Table 127.
Viz také obrázek:


Dosud jsem pracoval pouze s attiny2313, atmega8 a atmega16 u kterých jsou programovací piny MISO a MOSI totožné se stejnojmennými piny rozhraní SPI. Proto mě nenapadlo, že to u atmega64 bude jiné. Tak aspoň jsem zase o něco moudřejší :-) ATmega64 je v řídicím modulu použitý z toho důvodu, že je to nejlevnější procesor od Atmelu s dvěma UARTy. Jeden je potřeba na komunikaci s podřízenými moduly a jeden na komunikaci s počítačem. Samozřejmě je tu i možnost použít soft UART. Ten ale není tak spolehlivý.

Programátor usbasp jsem si vybral z toho důvodu, že je podporován programem avrdude, který je možné použít jak ve Windows (WinAvr), tak na Linuxu. A navíc nebyl moc drahý. Třeba se někomu bude hodit ukázka používaných příkazů. Parametr ponyser stačí přepsat na usbasp, port není potřeba zadávat a jinak je to stejné. Pro výpočet potřebných fuse bitů používám online AVR Fuse Calculator.

Jako IDE na Linuxu používám Eclipse 3.3 Europe. Do něj stačí nainstalovat plugin pro vývoj C/C++ (CDT) a plugin pro AVR. Potom je možné vytvořený projekt nahrát do mikroprocesoru přímo z prostředí Eclipse. Příjemným pomocníkem je AVR Device Explorer - v něm je seznam registrů, přerušovací vektory a další užitečné informace.

Ještě předtím než můžeme programovat přímo z Eclipse je však potřeba mít v systému crossdev a vytvořit si verzi gcc pro avrka. S crossdev budete mít téměř zaručeně celou řadu problémů :-) Doporučuji najít si howto přímo pro danou distribuci. Dále je potřeba (alespoň u mě - je to zřejmě nějaký bug) v adresáři projektu debug vytvořit následující link (aby si linker nestěžoval):
ln -s /usr/lib64/binutils/avr/2.18/ldscripts ldscripts
Potom je ještě potřeba umožnit přístup k programátoru i non-root uživateli. To zařídíme nejlíp pomocí UDEV. Stačí jednoduché pravidlo. V adresáři /etc/udev/rules.d/ jsem vytvořil soubor 97-usbasp.rules a v něm jsou dva řádky:
# USBasp programmer
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="users", MODE="0660"
Pak už stačí jen pomocí příkazu udevadm control reload_rules donutit udev znovunačíst pravidla a i obyčejný uživatel může zvesela programovat...

pondělí 8. prosince 2008

DPS - ovládání motorů

Došlo mi, že tu vlastně ještě není schéma a deska modulu pro ovládání motorů.

Na schématu je vidět použitý procesor atmega8. Pro komunikaci po RS485 je použit obvod SN75176. Dále je na desce dvojitý h-most L298 (jeho použití možná nebylo zrovna nejlepším nápadem - musí se k němu připojovat vnější ochranné diody a ty zaberou hodně místa).



Hardware modulu umožňuje: číst stav dvou enkodérů, pomocí PWM řídit otáčky dvou stejnosměrných motorků (každý max. 2A), měřit proud, měřit teplotu motorů (konektory pro připojení dvou termistorů), komunikovat po RS485.

V současnosti už mám v modulu naprogramované čtení enkodérů a PID regulátor. Další fází bude implementace komunikačního protokolu.

DPS ke stažení
Program pro modul
Detailní popis modulu

DPS - řídicí modul

Dnes jsem dokončil návrh DPS pro řídicí modul. Na stránkách projektu si můžete přečíst detailní popis funkce tohoto modulu. Do nového roku mám velké předsevzetí - schémata začnu kreslit inteligentněji.
Protože budu potřebovat dva sériové kanály (jeden na komunikaci se slave moduly a jeden pro spojení s počítačem), použil jsem mikroprocesor atmega64. K desce také bude možné připojit joystick a tím ovládat robota přímo - bez počítače. Skoro celou DPS překrývá LCD - ten může být buď 16x4 nebo 20x4. Vpravo nahoře je vyvedeno SPI pro programování a jeden port procesoru. Zapojení tohoto konektoru je řešeno tak, aby na něj šly připojit nejrůznější již hotové školní moduly.
Diody u RS485 nejsou diody, ale transily - kvůli ochraně před ESD. A konektor CANNON15 pro připojení analogového joysticku bude samozřejmě v provedení 90˚, ale v Eaglu takový nemám a nechtělo se mi ho kreslit.

Jakmile se podaří desku oživit, začnu pracovat na implementaci komunikačního protokolu.

Odkazy:
Deska ke stažení.
Zapojení analogového joysticku.
Něco málo o využití gameportu.

Levné alfanumerické LCD v GME:
MC1604B-SYL (298 Kč), MC2004B-SYL/H (295 Kč).