Neregistrovaný, ale o to známější uživatel fóra Hannibal (známý z tématu o emulátoru EMA51, zvukového generátoru, mikro fotbalu, Sféry, Helleny-51 (single-board computer), postupu pro crack a LED kostky) byl tak hodný a zaslal mi hotovou konstrukci MCU-modulu.
MCUmodul v1.01
Ide o aplikáciu pre ludí, ktorí nevedia programovať v assembleri/C-čku, no radi by si z času na čas niečo jednoduché pomocou MCU “zbastlili”.
Je to vec pochádzajúca z rokov 1993-1995, má ju na svedomí bývalý tým
ASYAsoftware - už som to (r.2008) publikoval aj v P.E.
Popis
„ Túto stavebnicu som vymyslela pre mójho 58-ročného otca. Rád stavia elektro-konštrukcie s MCU, no už sa nedokáže kóli veku naučiť assembler. Chce vidieť výsledky svojej práce, a to okamžite, napísaním niekolko riadkov programu, čo v assembleri nieje možné. Preto je MCUmodul určený pre laikov, nie programátorov… "
Yasmine Anastassiou
UPOZORNENIE
Póvodní autori nepovolujú stavbu MCUmodulu pre žiadne komerčné účely, len pre individuálne použitie. Nikto z autorov nenesie zodpovednosť za žiadne škody nijakého druhu spósobené používaním MCUmodulu. Díky patrí M.Stephanopulovi, za poskytnutie dokumentácie, obrázkov, popisu i samotného SW upraveného pre súčasné kontroléry rady-52.
MCU modul (S52vi.oi)
AUTOR: Yasmine Anastassiová (1993) update: Markus Stephanopulos (1995) & “Hannibal” (2010)
Tento modul (póvodne navrhnutý pre kontrolér - I8752) je zaujímavou alternativou, ako možno zostaviť pomocou 8 súčiastok základ aplikácie s programom - a to bez nutnosti ovládania assembleru (či jazyka C), pričom k činnosti postačí len bežný terminálový program (bez napal’ovačky čipov) a PC. Uživatel’ ale musí mať skúsenosti s logickými funkciami a binárnou/hexa sústavou. Jeho použitie móže byť v róznych zapojeniach s LED, rózne blikače, časové spínače, hodiny, alarmy, ovládanie osvetlení, ako jednoduché PLC, hračky, atd… Výhody/nevýhody tohoto modulu sú nasledovné:
- velmi jednoduchá, rýchlo zostavitelná stavebnica s malým počtom súčiastok a malou spotrebou
- pre použitie nie je potrebné ovládať assembler, nenáročnost’ na vývojový čas a hardware
- vstavaná obsluha riadenia základných užívatelských periférií: klávesnica, display, terminál, zvuk
- simulované funkcie s prednastavenými reakciami, možnost zálohovania dát do SEEPROM
- velmi malá rýchlosť vykonávania inštrukcií (cca 30/sec pri 12Mhz), vhodné pouze pre riadenie časovo
nenáročných činností a procesov
vel’mi jednoduchá forma prevedenia zvukových návěstí alarm a alert, nízká freq. zvuku
obr. 1 - základné zapojenie MCUmodulu.
Schéma zapojenia
Schéma je na obr.1. Podla póvodného popisu zostavila Y.Anastassiová hardwarovo čo najjednoduhšie možné zapojenie. SW využíva len jadro 8052, dajú sa použiť typy Atmel AT89C52/S52, alebo Philips P89C52. Pre použitie rýchlejších MCU napr: AT89C51RD2, alebo P89C66x, je táto aplikácia z mójho pohladu zbytočnosť -tieto obvody sú drahšie, tým pádom už je na mieste riešiť pre ne konkrétny program v asembleri, alebo C aby boli korektne využité a nakoniec - ani najrýchlejšie MCU rady-51 sa samo o sebe v úlohe simulácie nevyrovná možnostiam súčasných moderných PLC.
Je to ale iba mój názor - díky Y.Anastassiovej už v r.2002 existovali podstatne dokonalejšie modifikácie MCU modulov, určené pre vyššie spomínané obvody, umožňujúce ovládať grafické LCD displeje a pripojenú bežnú PC klávesnicu.
Funkcie
Modul simuluje (alebo obsahuje) nasledovné funkcie:
- Hodiny real. času (24 hod. cyklus) / dátum na 1 bežný (nepriestupný) rok.
- Nastavenie 7 spínacích / vypínacích časov s výberom dňa v týždni.
- 2 alarmy s výberom dňa v týždni.
- 4 linky jednoduchého alertu (poplach s nastavitelnou prodlevou).
- 4 časovače do 24hod s auto-reloadom obsahu z predvolieb.
- Počítadlo impulzov.
- Nastavitelný generátor*.
- Nastavitelný sériový port (1k2 - 19k2).
- Program pre cca. 4k krokov.
- Jednoduché užívatelské heslo* (relatívna možnosť zapojiť viac MCU na spoločnú zbernicu).
- 3 paralelné porty.
(*pridal M.Stephanopulos)
Pripojenie na počítač
Činnost’ modulu je závislá od „programu v SEEPROM", z ktorej beží. Ten vytvorí užívatel na základe požadovanej činnosti zariadenia, na ktorého prvky bude modul pripojený. Modul programujeme pripojením do serial-portu počítača. Menu terminálu je relatívne zložité a neviem ho presne opísať: pre potreby pripojenia stačí previesť „serial" a „terminal" nastavenia, viz. obr.2. Doporučená velkost bufferu terminálu je 1 - 4kB, aby sme mali k dispozícii aj tzv. „históriu" prevádzaných akcií. Časové spoždenia medzi vysielanými / prijatými znakmi nie sú nutné. Defaultná rýchlosť serial-portu modulu je 9600BD.
obr.2 - nastavenia terminálu: AmigaOS
obr.2 - nastavenia terminálu: Windows
Vyskúšané to bolo na dvoch platformách: AmigaOS3.x (program DreamTerm, Term4.8 - www.ayera.com). Pripojenie modulu na počítač je možné urobiť pomocou obvodu MAX232 (doporučené), alebo (len skúšobne) z bežných súčiastok - obr.3.
obr.3
Po prvom spustení MCUmodulu (alebo vloženej čistej SEEPROM, či rozopnutom spínači S1 - viz. schéma) sa objaví nasledujúce hlásenie:
Opustíme ho dvomi spósobmi: “c” znamená pokračovat’, pričom MCU vytvoří a uloží do SEEPROM default-nú konfiguráciu čo trvá cca. 5sec (pri nasledujúcom spustení naskočí normálně), a “r”: reset MCU v případe, že nějaký zákmit pri zapnutí napájania spósobil chybné načítanie už predtým správne používanej SEEPROM (stalo sa mi to pri 50 pokusoch dvakrát).
term 4.8 (3.10.97)
Menu
Menu vyvoláme stlačením „h" (help), pričom sa objaví na termináli ponuka možností. Užívatelské heslo móže byť nastavené, ak chceme zabrániť prístupu dát do/z MCU modulu. Nemá vplyv na beh programu, no MCU “odpovedá” terminálu iba vtedy, ak je zhoda uloženého a prístupového hesla. Po prvom zapnutí je modul aktívny, reaguje na terminál a heslo zadané nieje. Screenshot ukážky komunikácie s počítačom je na obr.4. Na termináli je volba nového hesla po prvom spustení (heslo v tomto prípade a teda aj meno MCU je “andrea”), odhlásenie, prihlásenie, zmena hesla na iné a odstránenie hesla (Stephanopulos to urobil i použitím AREXX-u).
obr.4
Možné pripojenie periférií
Linky všetkých portov reagujú na log. nulu. K MCUmodulu (obr.5) možu byť připojené štyri linky alert (výstraha), dve akustické návestia, dva typy klávesnic a LCD display. Alarm / alert sú oddelené z dovodu možnosti pripojenia výstrahy na externý zosilňovač. Klávesnica može byť terminál (počítač), hexa (10 tlačidiel),
alebo inkrementálna (iba tlačidlá 0 a 1 = select/enter). Ako display použiva typy alfa-numerických LCD (napr. CM2016, CM2020): 2 riadky po 16, alebo 20 znakov. Display a klávesnica vždy používajú súčasne jeden port.
obr.5 - Periférie k MCU modulu. „x" je čislo portu: 0, 1, alebo 2
Písanie programu
Zapojenia s ukážkami programov spravil Markus Stephanopulos, povodne ich bolo ovel’a viac - no z dovodu nedostatku času som vybral iba niečo. Komentáre a úpravy textu v programoch som spravil pre lepši prehl’ad.
Do sequenceru skočíme zo základnej pozicie. Sequencer sa zastaví a jeho ukazovatel’ adries je nulový. V prvom rade sa uistite že je pamať čistá - najlepšie je ju zmazať celú, pretože niektoré bajty, ktoré MCU nepouživa nie sú zobrazované na termináli - no program može narazenim na ne robiť hlúposti. Predpokladajme, že heslo (meno) MCUmodulu nieje vložené. Takže urobime tieto kroky:
[code]MCU 1:>
MCU 1:>sequ[ok]
0000:cls_0000
0000:cls_0000?
0000:cls_0000? [ok]
0000:
MCU modul zapnutý
s, enter (iná klávesa = zrušiť)
c, 0, 0, enter, 0, 0, enter (zmazanie celej SEEPROM)
enter
SEEPROM zmazaná
0000: 0000>10 0000>init_sdk 0000>init_sdk 2
enter (editovanie)
1, 0, enter (čislo prikazu)
enter
2
0002> 0002>00 0002>disptext 0002>disptext adr_04
0002>disptext adr_04 Hello!A
adresa je 0002, lebo príkaz “spotreboval” dva bajty památe SEEPROM
0, 0, enter
enter
0, 4, enter
H, e, l, l, o, !, enter (znak A znamená koniec textu a vkladá ho automaticky)
000B> 000B> 000B:
000B:list[ok]
adresa je 000B, lebo príkaz “spotreboval” 9 bajtov památe SEEPROM enter
l, enter (list - výpis programu, začína vždy od adresy 0000)
0000:init_sdk port 2 1. riadok programu: inicializácia použitia displeja + klávesnice na porte 2
0002:disptext adr_04 Hello 2. riadok programu: vypísanie textu od adresy 04 (horný riadok)
000B - - -
000C - - -
00BA - - -
00BB stlačením lubovolnej klávesy móžeme výpis prerušiť
[ok]
00BC:
00BC:quit[ok] q, enter
MCU 1:> štart programu (vždy od adresy 0000)
[/code]
Alfa-numerický displej 2x16 znakov, pripojený na porte 2 - pre program výpisu textu na určenej pozícii displeja stačili 2 riadky. Horný riadok u 2-riadkových LCD začína adresou 00, spodný adresou 40.
UPOZORNENIE:
Je treba si uvedomiť, že MCU modul je značne zastaraná aplikácia určená pre jednoduché použitie a nemožno zrovnávať editor programu s kompilátorom, ktorý automaticky kontroluje správnosť a upozorní na každú chybu. Pri úprave údajov v SEEPROM neexistuje žiadna kontrola správnosti, preto je nutné dodržať tieto zásady:
Pri mazaní príkazov pomocou cls_xxxx vkladajte len adresy zobrazujúce sa na termináli počítača po “vylistovaní”, nie neexistujúce, inak móže dójsť k odmazaniu len časti (nie celého) príkazu, alebo bloku príkazov a tým pádom k pomýleniu vykonávania programu zo SEEPROM. Tak isto - insert/delete používajte iba na vkladanie/mazanie prázdnych miest (bajtov), nie príkazov programu!
Rovnako pri používaní príkazov obsahujúcich adresu skoku vkladajte len adresy zobrazujúce sa na termináli po “vylistovaní”, nie neexistujúce, inak sa vykonávanie programu móže pomýliť, tak isto pre príkaz useflash používajte len doporučené adresy rutín! Program ju nájde a v „liste" sa objaví potom namiesto adresy jej názov.
Aplikácie
Jednoduché hodiny s LCD displejom a klávesničkou, pripojenými podla obrázkov zapojení na port P1 MCU.
[code]0000:init_sdk port 1 inicializuje/zmaže display + klávesničku pre použitie na porte P1 výpis textu
0002:disptext adr_00 DEMO-hodinyA výpis textu
0010:loadbyte 1B data 44 vloženie začiatku zobrazenia pre FLASH-utilitu
0013:useflash :dispCLCK FLASH-util: zobrazí hodiny HH:MM:SS
0016:loadbyte 1B data 28 vloženie adresy skoku v stránke na adr.xx28 pre FLASH-utilitu
0019:useflash :jumpKEYB FLASH-util: skočí v stránke ak bude stlačené tlačidlo klávesničky
001C:jump_adr :0010 skok nazad do zobrazovacieho cyklu
0028:disptext adr_00 Nastav cas:A výpis textu
0036:loadbyte 1B data 44 vloženie začiatku zobrazenia pre FLASH-utilitu FLASH-util: edituje hodiny HH:MM:SS skok nazad do cyklu
0039:useflash :editCLCK
003C:jump_adr :0000
Ak je 10 - tlačidlová klávesnica zbytočne velká, stačí upraviť povodný program a pripojiť len tlačidlá 0 a 1.
MCU 1:>sequ[ok]
0000:adr_0039
0039:
0039:ins?[ok] 0039:ins?[ok] 0039:
0039>modekeyb 1
003B> 003B:list
(0 = Hexa:10 tlačidiel, 1 = Duo: dve tlačidlá)
0036:loadbyte 1B data 44 0039:modekeyb D 003B:useflash :editCLCK 003E:jump_adr :0000 [ok]
Zvuková signalizácia po dopočítaní časovača 1 z predvoleného času na nulovú hodnotu. Vypína sa klávesničkou.
0000:init_sdk port 1
0002:disptext adr_05 TIMER1A 000B:disptext adr_42 cas A 0012:loadbyte 1B data 46 0015:useflash :editTMRS 0018:movebyte 90 byte 75 001B:orl_byte 90 byte 74 001E:if_=byte 90 data 00:0000 0023:loadbyte 73 data 00 0026:set_bit 5 byte 18 0029:useflash :disp TM1 002C:if_0=bit 5 byte 19:0029 0031:set_bit 5 byte 17 0034:useflash :waitKEYB 0037:clr__bit 5 byte 18 003A:clr__bit 5 byte 19 003D:jump_adr :0000
inicializuje/zmaže display + klávesničku pre použitie na porte P1 výpis textu výpis textu
vloženie začiatku zobrazenia pre FLASH-utilitu
FLASH-util: edituje obsahy časovača 0,1,2, alebo 3 stlačením tlačidla
kontrola, či sú vložené údaje do časovača 1
kontrola, či sú vložené údaje do časovača 1
ak je časovač 1 aj po vložení údajov stále nulový, skok nazad na začiatok vynulovanie sekúnd časovača 1 štart časovača 1
FLASH-util: zobrazí stav časovača 1 (na tej istej pozícii, ako jeho editovnie)
ak časovač nedosiahol nulovú hodnotu, skok nazad do cyklu
časovač je nulový, zapnutie zvuku na výstupe pre „alert"
zvuk píska, čaká sa na stlačenie nejakého tlačidla obsluhy…
vypnutie časovača 1
vypnutie zvuku
návrat nazad do cyklu
TIMER1
cas DD0:Q0
TIMER1
Časovač po dosiahnutí 00:00:00 „zdanlivo" stojí. Dochádza však pri jeho vynulovaní k prednastaveniu obsahu predvol’by do časovača a tá je nulová. Ak by bola nastavená na určitý čas, mohol by sa časovač využívat na upozorňovanie opakujúcich sa časových úsekov.
LED efekt “kid raider” - pendlujúci svetelný bod z lava do prava a nazad. LEDky sú pripojené na port P2.
0000:set_bit 6 byte 1A 0003:set_bit 7 byte 1A 0006:loadbyte 3F data FE
nastav port 2 ako výstup nastav bit FLAG na 1 rozsvietenie prvej LED diody
0009:rotlbyte 3F 000B:if_1=bit 7 byte 1A:0009 0010:rotrbyte 3F 0012:if_1=bit 7 byte 1A:0010
0017:jump_adr :0006
rotácia portu 2 o 1 pozíciu vlavo
ak nebola presiahnutá 8-sma dioda, vráť sa na 0009
rotácia portu 2 o 1 pozíciu vpravo
ak nebola presiahnutá prvá dioda, vráť sa na 0010
skok do východiskovej pozície rozsvietenia[/code]
Pripojenie LED diod na port P2.
Z 15 aplikácií som vyskúšal len 3 uvedené ( viac sa mi nechcelo © ), k čomu som si zhotovil malý „prototyp". V závere manuálu je uvedených niekolko info pre prípadných záujemcov a tabulka prílohy pre písanie programov.
Obrázok prototypu na univerzálnych doškách pl.spoja.
Info
Činnosti sequenceru v súvislosti s terminálom, ak je MCU: 1. odhlásený, 2. prihlásený a 3. prihlásený a vójdem do niektorej položky - pas_ pwd_ …atd:
- MCU normálne pracuje, vykonáva program, ale prípadné reakcie na terminál sú blokované. 2. MCU normálne pracuje, vykonáva program a reakcie na terminál sú zobrazované na monitore. 3. Vojdením do akejkolVek položky sa vykonávanie programu pozastaví, po opustení položky pokračuje ďalej. Pri vojdení /vyskočení zo sequenceru sa program zastaví /reštartuje od adr. 0000H.
Je možné pripojiť i inú (vačšiu/menšiu) pamať k MCU?
Vyhovujú všetky typy SEEPROM typu AT24Cxxx (32,64,128,256,512), žial’ kapacita programovej -užívatelskej pamate sa nad 4kB nezvýši. Pamať vydrží cca. 100k zápisov s dobou pamatania okolo 40 rokov
Čo znamená jednotka za názvom (heslom) MCU: MCU xxxxxxxx 1:>
Je to indikácia oznamujúca, že prípadné dáta budú vysielané smerom k terminálu. Ak by sme použili príkaz zadania hodnoty opačne - teda z terminálu do MCU, indikátor sa zmení na dvojku - tj. MCU čaká a požaduje vloženie dát: “MCU xxxxxxxx 2:>”. Zmena jednotky na dvojku nenastane iba v prípade použitia niektorých volaní “volného” snímania useflash rutín, ktoré slúžia pre vetvenie programu.
Info o použití portov:
Každý port nakonfigurujeme ako vstupný / výstupný nastavením riadiaceho bitu v prípade, že je používaný ako bežný vstup / výstup. Príkaz “initsdk” ho obsadzuje pre riadenie displaya / klávesničky, pričom mu budú presmerovávané všetky činnosti s nimi súvisiace - v tomto prípade dáta čítané /zapisované na adrtesu portu budú bez reakcie na fyzické piny puzdra obvodu. Port P1 má okrem toho ešte snímanie liniek “alert”, ktoré sa aktivujú nastavením ich príslušných bitov. Ak port P1 používa display / klávesnička, linky alertu sú i napriek aktivovaniu ignorované. Pri používaní portu ako vstup / výstup sú však normálne brané v úvahu - preto ak je P1 nastavený ako výstupný, treba si dať pozor, aby nedošlo k vyvolaniu funkcie alert vlastným užívatelským programom. Port P0 je otvorený kolektor, preto ho treba ošetriť “pull-up” 10kQ rezistormi na vetvu +5V. Ak je niektorý port používaný ako výstupný, pred zmenou na vstupný do neho treba vložiť data FFH. Dóvod = architektúra 8051.
Čo je konfigurácia (CFG):
Príkazy pracujúce s konfiguráciou ukladajú data z RAM MCU do SEEPROM: predvolby podsvitu displaya, dočasovania, dáta spínacích /vypínacích /alarmových časov a dní ich použitia, predvolby spoždení liniek funkcie alert a predvolby timerov 0-3. Neukladá sa údaj o baudovej rýchlosti serial portu.
Kolko úrovní má simulovaný zásobník pre adresy volania (CALL)? 15 ponorení.
Je v aplikácii MCUmodul počítané s možnosťou vloženia nezmyselných dát?
MCU prevádza automaticky kontrolu správnosti. Ak dátum, alebo mesiac presahujú logicky správnu hodnotu, budú nahradené údajom 01. Pre deň: 00-06 (po-ne). Iný údaj vložený na pozíciu dňa bude = 00. Hodiny: 00-23, minuty / sekundy: 00-59, časovania alarmov: 00-99. Iný údaj na týchto pozíciách bude nahradený hodnotou 00.
Tipy & triky
Program sa zacykloval a MCU nereaguje na terminál:
- Stlačiť tlačidlo RST, rozopnúť spínač S1 a RST uvolniť. 2. Po nabehnutí modulu stlačiť klávesy “s” a “enter”. |!p 3. Zopnúť spínač S1, a príkazmi terminálu pre sequencer problém v programe nájsť a odstrániť.
Čo robiť, ak zabudnem heslo:
- Stlačiť tlačidlo RST, rozopnúť spínač S1 a RST uvolniť.
- Po nabehnutí modulu zopnúť spínač S1.
- Stlačiť klávesy “w”, “enter”, “enter”.
mcumodul_s52_v1_01-manual_a_stavebna_dokumentacia.pdf (2.62 MB)
mcumodul_s52_v1_01-program.hex (22.5 KB)