mFC - modular Forth Computer ============================ 28.07.2009, amforth30mFC12, rekompilace, asm verze bitnames, pridan modul mmc 20.03.2009, amforth30mFC11, pridan modul RAM 30.01.2009, Lubos Pekny, www.forth.cz/Download/mFC/mFC.html Cilem je vytvorit a propojit male jednoduche moduly do systemu, jehoz moznosti se budou urcovat a rozsirovat pripojovanim dalsich modulu. Tak jak procesor mikropocitace spolupracuje s perifernimi obvody pro obraz, zvuk, pamet atd., tak tady by se moduly podelily o ruzne funkce, simulovaly by jednotlive periferni obvody a cely system by se tvaril jako jeden pocitac. Pouziti by tedy mohlo byt v simulaci mikropocitacu, robotice a nebo jen hrani si s elektronikou a jazykem Forth. Mechanicka konstrukce --------------------- Zakladem modulu je oboustranna deska plosnych spoju o rozmeru zhruba 41x51 mm. Jednotne umisteni konektoru umoznuje spojovat desky paralelne do vrstev. Konektry jsou dvourade 2x10 s rozteci 2.54 mm a to kolme koliky pro pripojeni kabelu, prime koliky a zasuvka pro vrstveni desek. Soucastky jsou vetsinou v provedeni SMD, ATmega - TQFP44, R a C - 1206. Prokovy jsem vytvoril z tenkeho dratku po rozpleteni licny. Asi centimetrove kousky jsem ohnul do tvaru U, pokud se jednalo o dvojity prokov, nebo do kapky u jednoducheho prokovu. Po protazeni otvory a ohnuti koncu dratku se vytvoril prokov typu O nebo Omega, ktere se dobre paji, protoze se nemusi pridrzovat. Z konektoru se nejdrive osadi na stranu 2 prima zasuvka a na presahujici vyvody se soucasne z druhe strany pripaji prime koliky. Az potom se osadi na stranu 2 kolme koliky. Kabely jsem pouzil ploche se samoreznym konektorem 2x10, nebo krizeny dvoudrat s dvoudutinkovou zasuvkou pro napajeni a komunikaci. amforth30mFC10 -------------- Je pouzit Forth pro procesory ATmega ve verzi amforth 3.0 (autor Matthias Trute) s modifikaci pro viceprocesorove rizeni a poloduplexni komunikaci. Ta vyzaduje jeden pin procesoru pro prepinani smeru komunikace. Na procesoru s full-duplexni komunikaci by tato verze mela rovnez pracovat, jen nebude vyuzito viceprocesorove rizeni a pin pro prepinani smeru. Dalsi modifikace je v pouziti slovniku (vocabulary), kdy slova muzeme tridit podle pouziti, verzi, atd. Napr. assembler, , , . Pokud je slovo v jine knihovne, je potreba nejdrive nastavit spravny slovnik. Pokud napiseme definitions , potom se prohleda slovnik , pak a slova ve slovniku forth nadefinovana pred temito slovniky. Nova slova budou v . V souboru !MakeFile.frt jsou uvedeny vsechny soubory, ktery se maji prihrat a definice potrebnych slov, ktera jsou napr. v jinych knihovnach. amforth30mFC12 -------------- Tato verze pouziva assembler v knihovnach bitnames, spi, ram, mmc, cimz se radikalne zrychlil pristup na porty I/O, SPI a rychlost cteni z SD karty stoupla z 30kB/s na 370kB/s (CID-CSD.txt). Obsluha SD karet Panasonic byla bezproblemova, noname karty se pri neopatrne manipulaci kousaly, nebo vubec nesly precist. Vsechny hex soubory byly znovu vytvoreny. HEX a EEP soubory pro Ponyprog ------------------------------ Preklad zdrojovych kodu udelan v AVR Studiu 4.12, assembler2. Poradi pridavani knihoven je v souboru makefile.frt: - assembler, , , , , , , Main.hex - amforth 3.0 mFC12, Atmega32, 16MHz, modif. half-duplex, vocabulary Main.eep - data eeprom Main_asm.hex - pridana knihovna assembler.frt Main_asm.eep - data eeprom Main_bit.hex - pridana knihovna bitnames.frt, I/O porty Main_bit.eep - data eeprom Main_spi.hex - pridana knihovna spi.frt, SPI port Main_spi.eep - data eeprom Main_mpc.hex - pridana knihovna mpc485.frt, multi-procesorova komunikace Main_mpc.eep - data eeprom Main_lcd.hex - pridana knihovna LCD20x4scr.frt, displej LCD20x4 Main_lcd.eep - data eeprom Main_kbd.hex - pridana knihovna keyboard.frt, klavesnice PS2 Main_kbd.eep - data eeprom Main_ram.hex - pridana knihovna ram.frt, modul RAM 512kB Main_ram.eep - data eeprom Main_mmc.hex - pridana knihovna mmc.frt, MMC/SD karta Main_mmc.eep - data eeprom Volne misto v pameti flash 12kB Security bity ------------- zaskrtnuty, naprogramovany - JTAGEN, CKOPT, BOOTSZ1,BOOTSZ0, BODEN, BODLEVEL Zmeny v knihovnach - mpc ------------------------ antic.asm - novy, testuje RX pin, pridano antikolizni zpozdeni pro vysilani TX echo.asm - novy, promenna echo, kontrolni soucet crc16 accept.asm - pridano zapnuti/vypnuti echa applturnkey.asm - pridana inicializace mpc_ID, echo, antic refill.asm - pridano testovani crc16 rx0.asm - pridan multi-procesorovy mod, promenna mpc_ID tx0.asm - pridan usart0_utx_isr, antikolizni zpozdeni amforth.asm - pridano cislo mpcID do eeprom, default $lA(154) atmega32.asm - povoleno preruseni TXC, prepne smer na prijem dict_minimum.inc - pridany soubory antic.asm, echo.asm Main.asm - nastaveni I/O pinu procesoru Zmeny v knihovnach - vocabulary ------------------------------- vocabul.asm - vocabulary, definitions, context, current, forth, assembler find.asm - prohleda context, current slovniky code.asm - pridano ... assembler ... colon.asm, end-code.asm - pridano ... current @ context ! ... XT_HEADCON nahradi XT_HEAD ve slovech: find, words XT_HEADCUR nahradi XT_HEAD ve slovech: docreate, does, immediate, recurse mpc485.frt - Multi-procesorova komunikace s poloduplexni RS485 -------------------------------------------------------------- Komunikace master-slave je textova se 7-bitovymi znaky, bit D7=0. Pro adresu je D7=1. Kdyz master vysle do site text ~end , potom moduly, ktere ho prijmou, se vypnou. Modul se zapne az po prijeti sveho identifikacniho cisla a bitu D7=1, tedy ID+$80. Napriklad modul ID:2 muzeme zapnout prikazem 2 ~call z jineho modulu, nebo stiskem alt+0130 z terminalu nebo alt+ctrl+shft+B z klavesnice PS2 v knihovne keyboard.frt. Pokud komunikujeme s modulem, muzeme zmenit jeho cislo ID, prednastavene je $1A (26, alt+0154, ctrl+alt+shft+Z). Prednastavene hodnoty v usart knihovne: echo off, antic off, crc off. Pokud se napr. drop zobrazi jako ddrroopp, potom vypnete echo prikazem -echo. Pokud se nezobrazuji zadne znaky, pak zapnete echo prikazem +echo. Prikazem +antic se zapne antikolize vysilani TX. Testuje se klid na lince a s urcitym zpozdenim, pokud je stale klid na lince, se spusti vysilani TX. Prikazem +crc se zapne kontrola kodem CRC, polynom je stejny jako pro protokol Modbus. Pokud je crc zapnuto, je mozne vysilat text pouze ze source editoru (Forfiter), nelze psat on-line (chybi crc a prijimaci modul text odmitne). -crc pro vypnuti kontroly musite tedy vyslat z editoru. ~line vysila/prijima crc kontrolu take. Format crc: text+D+xxxx , kde text jsou prikazy, D je byte $D=Cursor return, xxxx je crc kod zapsany jako hexadecimalni text. Blok je opakovane vysilan az do prijmu znaku $06 (ACK). Pokud je zapnuto vice modulu, potom jejich odpovedi se znakem CR zpusobi zacykleni. Vyslete ze source editoru prikaz ~end nebo +crc pro vypnuti modulu a preruseni smycky. mpc_ID - identificni cislo, modul ID = 0..127 c mpc_ID! - nastavi nove cislo ID ~id - precte cislo ID ~end - vypne modul a ten ceka na prijem sve adresy $80+ID (~end \ vypne moduly na lince, kdyz vysleme znak $82 (alt+0130), pak zapneme modul ID:2) c ~call - modul preda rizeni jinemu modulu, zapne modul c, sam se vypne c ~line - aktualni modul vyle prikazy modulu c (5 ~line 4 3 + . ~end \ aktualni modul vysle text 4 3 + . ~end do modulu ID:5) +echo, -echo - zapinani echa terminalu +crc, -crc - zapinani crc kontroly +antic, -antic - zapinani antikolize, pridava zpozdeni do TX, delayTX=(2+ID)/2 doby vysilaneho znaku. Problemy? --------- - kontrola kabelu, polarity (5V, RS485) - nastaveni slovniku, definitions ( , definitions) - nastaveni root, znameho vychoziho bodu (forth , forth ) - kontrola ID ( ~id . , 26 default) - kontrola crc, echo, echo.7 (neprijima prikazy, nezobrazuje prikazy, rezim slave) - slave ceka na ID (1A ~call, alt+0154, ctrl+alt+shft+Z pro vyslani ID) - appl_kbdlcd potrebuje mit zapnute echo z klavesnice (+echo) - ID a echo z eeprom se kopiruji do RAM az po restartu Testovano s prevodnikem FTDI USB-RS485, 2x mFC_CPU, win98, winXP, Forfiter.exe.