Projekt MCUmodul 89S52 v1.01 ke stažení

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:

  1. 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:

  1. 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:

  1. Stlačiť tlačidlo RST, rozopnúť spínač S1 a RST uvolniť.
  2. Po nabehnutí modulu zopnúť spínač S1.
  3. 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)

MCUmodul v1.01 portovaný na AT89C51AC2

Hannibal a pan Oleg Kowalczuk si dali tu práci a předělali MCUmodul verzi 1.01 pro modernější mikrokontrolér AT89C51AC2. Děkujeme!

Popis

„ Mám pre Vaše forum ešte jednu zaujímavosť - porarilo sa mi portovať MCUmodul - alikáciu, ktorú som Vám pred časom poslal - z povodného procesora AT89S52 na moderný kontrolér AT89C51AC2. Robil som to priamo v zdrojáku(iná možnosť nebola) - asi 5 dní (2 hodiny denne…) "

„ V podstate ide o to isté, len som “vypatchoval” dorazy rozsahu pamate pre užívatelský program na 1k programových krokov a vytvoril nové ovládače pre interné prístupy médií, (RAM a EEPROM) ktorými AT89C51AC2 disponuje. Tak isto je rozšírené menu o príkazy s nimi pracujúce a mierne upravený editor vkladania dát - nezabudne poslednú adresu prístupu (predtým sa vždy vynulovala) a je možné opustiť editovanie i bez vloženia inštrukcie (po zobrazení jej názvu:enter=pokračovanie v editovaní, iná klávesa= nepokračovať - verzia pre AT89S52 toto nemala). Doplnená je i tabuľka zobrazujúca názvy “riadiacich bitov” (po vylistovaní). "
mcumodul_c51ac2_v1_01-manual_a_stavebna_dokumentacia.pdf (5.21 MB)
mcumodul_c51ac2_v1_01-program.hex (90 KB)

Zdravím všetkých!

Chcela by som sa spýtať, či by táto aplikácia bežala aj na At…ED2. Nemám mikroprocesor At…AC2 a chcem si to iba vyskúšať, nom moc sa v ich datašetoch nevyznám :laughing: :laughing:

Ďakujem, Andrea.

nie si ty andrea R. ?

Hannibal byl tak laskav a zaslal mi aktualizaci konstrukce MCUmodul.

MCUmodul-AC2 (89C51AC2) v1.03 (update 1.03 lite)

Túto vec som dostal nedávno mailom od Olega Kowalczuka. Ide o verziu klasického MCUmodulu-AC2 (ktorý sme s Olegom upravili z pôvodného MCUmodulu-S52), “fúziovanú” s verziou MCS BASIC–52 (v1.31), ktorý už dávnejšie upravila pre beh na jadrách AT89C51XXX Y. Anastassiová (r.2003). Používala to ako učebný – výukový MCU-kit pre študentov. Oleg Kovalczuk obidva systémy spojil do jedného a vytvoril v celku peknú vecičku. Schému neuvádzam – je identická so zapojením MCUmodulu-AC2 (manuál je vo fóre stránok forum.mcontrollers.com/, sekcia 8051/8052). Obidva systémy majú oddelenú pamäť pre odzálohovanie vyvíjaného programu aplikácie a navzájom sa neovplyvňujú. Auto-run programu má len MCUmodul-AC2, preto je v úvodnom menu, zobrazenom po zapnutí, ako východiskový.

PRÍLOHA: podmienkové bity

[code]bit bajtu, názov (zobrazí iba list), funkcia / činnosť

17H/bit-0 ON_time_ nastaví MCU, ak je hociktorý spínací čas a deň zhodný s hodinami
17H/bit-1 OFF_time nastaví MCU ak je hociktorý vypínací čas a deň zhodný s hodinami
17H/bit-2 y/n_time nastavený = sú akceptované spínacie / vypínacie časy a dni
17H/bit-3 sndALARM nastaví MCU ak je hociktorý alarmový čas a deň zhodný s hodinami
17H/bit-4 y/nALARM nastavený = sú akceptované navolené alarmové časy a dni
17H/bit-5 sndALERT nastaví MCU po uplynutí času vzniku niektorého alertu
17H/bit-6 y/nALRT0 nastavený = port P1.0 spustí odpočítavanie času pre vznik alertu
17H/bit-7 y/nALRT1 nastavený = port P1.1 spustí odpočítavanie času pre vznik alertu

18H/bit-0 y/nALRT2 nastavený = port P1.2 spustí odpočítavanie času pre vznik alertu
18H/bit-1 y/nALRT3 nastavený = port P1.3 spustí odpočítavanie času pre vznik alertu
18H/bit-2 latch_CT nastavený = neprepisuje obsah počítadla do vyrovnávacej pamäte
18H/bit-3 clear_CT nastavený = drží obsah počítadla impulzov vynulovaný
18H/bit-4 run_TM0 nastavený = beží časovač 0
18H/bit-5 run_TM1 nastavený = beží časovač 1
18H/bit-6 run_TM2 nastavený = beží časovač 2
18H/bit-7 run_TM3 nastavený = beží časovač 3

19H/bit-0 convdisp spôsob, akým sa zobrazí na displeji stav A/D prevodu v dekad. sústave:
19H/bit-1 convdisp bit0 / bit1: 00=x,xx 01=xx,x 10=xxx 11=nepoužitý stav
19H/bit-2 PWMclock 0=f.OSC/6, 1=f.OSC/2 – časovanie pre PWM kanál
19H/bit-3 user_bit pre individuálne použitie (bity 0-3 neboli v MCUmodule-S52 použité)
19H/bit-4 zero_TM0 nastaví MCU, ak má počas behu nulovú hodnotu časovač 0
19H/bit-5 zero_TM1 nastaví MCU, ak má počas behu nulovú hodnotu časovač 1
19H/bit-6 zero_TM2 nastaví MCU, ak má počas behu nulovú hodnotu časovač 2
19H/bit-7 zero_TM3 nastaví MCU, ak má počas behu nulovú hodnotu časovač 3

1AH/bit-0 P1.0ALRT nastaví MCU, ak je alert zaznamenaný ako aktívny na vstupe P1.0
1AH/bit-1 P1.1ALRT nastaví MCU, ak je alert zaznamenaný ako aktívny na vstupe P1.1
1AH/bit-2 P1.2ALRT nastaví MCU, ak je alert zaznamenaný ako aktívny na vstupe P1.2
1AH/bit-3 P1.3ALRT nastaví MCU, ak je alert zaznamenaný ako aktívny na vstupe P1.3
1AH/bit-4 i/oPORT0 0=vstupný, 1=výstupný
1AH/bit-5 i/oPORT1 0=vstupný, 1=výstupný
1AH/bit-6 i/oPORT2 0=vstupný, 1=výstupný
1AH/bit-7 FLAG_bit nastavuje MCU použitím inkrementu, dekrementu, rotácií a porovnaní[/code]

PRÍLOHA: useflash rutiny

Sú to programové call rutiny vo FLASH MCU, vykonávajúce časti programu, ktoré by boli buď zdĺhavo realizovateľné
inštrukciami MCU modulu, alebo by ich nimi nebolo možné previesť vôbec. Tým, že sa zadáva ich hexa-adresa, (nie
názov) je možné vytvoriť ďalšie užívateľské podprogramy vo voľnej časti FLASH procesora (v lokácii 0x5000-
0x7FFFH, pre použitie sú: RB0, A, PSW, DPTR0 / DPRT1 a 10 úrovní SP). Starý MCUmodul (r. 2001) osadený
procesorom P89C668 vytvorený Y. Anastassiovou ich mal 50. Pre MCUmodul AC-2 sú k dispozícii adresy pre tieto:

[code]adresa, názov (zobrazí list), funkcia / činnosť

0EF5: sendCLCK vypíše na terminal hodiny HH:MM:SS
0EF8: sendDATE vypíše na terminal DEN/DAT.MES
0EB3: dispCLCK vypíše hodiny HH:MM:SS na display. Pozícia zobrazenia = adr.1BH
0EB6: dispDATE vypíše dátum DEN/DAT.MES na display. Pozícia zobrazenia = adr.1BH
0EB9: sendCRLF vyšle CR + LF na terminál
0EBC: jump_TTY ak je klávesnica terminálu uvolnená, tak návrat bez reakcie. Ak je prijatý serialom nejaký
znak, tak data na adr.1Bh sú brané ako nižšia adresa v stránke, z ktorej useflash voláme a
prevedie sa skok na túto adresu. Následne sa uloží prijatý znak z terminálu na adr.1Bh.
Táto rutina reaguje pomalšie, takže treba podržať dlhšie stlačenú klávesu na počítači (cca
1 sec.), aby terminálový program poslal po sebe opakovane viac znakov.
0EBF: send_TTY vyšle data z adresy 1Bh cez serial port.
0EC2: waiting_ časová prodleva, závisí od velkosti dát vložených pred tým na adr.1Bh (00h=minimálna,
FFh=maximálna - trvá viac ako minútu).
0EC5: jumpKEYB ak sú tlačidlá klávesničky uvolnené, tak návrat bez reakcie, inak je stav adresy 1Bh braný
ako nižšia adresa v stránke z ktorej useflash voláme a prevedie sa skok na túto adresu.
Zároveň uloží prijatý znak z klávesnice do adr. 1Bh.
0EC8: waitKEYB prijme bajt z klávesničky a ulozi na adr.1Bh. Ak je klávesnica nestlačená-uvolnená, čaká.
0ECB: wait TTY prijme znak z terminalu a uloži na adr.1Bh. Ak nieje žiadna klávesnica PC stlačená, čaká.
0ECE: editCLCK editor hodín. Pozícia zobrazenia = adr.1BH
0ED1: editDATE editor dátumu. Pozícia zobrazenia = adr.1BH
0ED4: editPRES editor nastavení predvolieb časovačov T0 – T3. Pozícia zobrazenia displeja = adr.1BH
0ED7: editTMRS editor časovačov T0 – T3. Pozícia zobrazenia displeja = adr.1BH
0EDA: edit_ON_ editor spínacích časov + dní. Pozícia zobrazenia displeja = adr.1BH
0EDD: edit_OFF editor vypínacích časov + dní. Pozícia zobrazenia displeja = adr.1BH
0EE0: editALAR editor alarmových časov + dní. Pozícia zobrazenia displeja = adr.1BH
0EE3: editDLAY editor zpoždení liniek alert pre vstupy P1.0 – P1.3 . Zobrazenie na displeji = adr.1BH
0EE6: disp_TM0 zobrazí na displeji stav časovača T0. Pozícia zobrazenia displeja = adr.1BH
0EE9: disp_TM1 zobrazí na displeji stav časovača T1. Pozícia zobrazenia displeja = adr.1BH
0EEC: disp_TM2 zobrazí na displeji stav časovača T2. Pozícia zobrazenia displeja = adr.1BH
0EEF: disp_TM3 zobrazí na displeji stav časovača T3. Pozícia zobrazenia displeja = adr.1BH
0EF2: disp_CT_ zobrazí na displeji stav počítadla CT. Pozícia zobrazenia displeja = adr.1BH
0FA0: A/D_conv obrazí na displeji A/D prevod. Pozícia zobrazenia displeja = adr.1BH
0FA3: dispconv zobrazí stav adr.6EH na displeji, ako A/D prevod. Pos. zobr. = adr.1BH
0FA6: PWM_mode vloží do PWM data z adr.6FH (adresy 6EH a 6FH neboli v MCUmodule-S52 použité)
0FA9: clr_P4.0 nuluje linku portu P4.0 – táto linka môže byť použitá iba ako výstupná
0FAC: set_P4.0 nastaví linku portu P4.0 – táto linka môže byť použitá iba ako výstupná
0FAF: cpl_P4.0 neguje linku portu P4.0 – táto linka môže byť použitá iba ako výstupná
0FB2: clr_P4.1 nuluje linku portu P4.1 – táto linka môže byť použitá iba ako výstupná
0FB5: set_P4.1 nastaví linku portu P4.1 – táto linka môže byť použitá iba ako výstupná
0FB8: cpl_P4.1 neguje linku portu P4.1 – táto linka môže byť použitá iba ako výstupná
0FBB: GENERmod spustí generátor (zastaví serial port – a naopak) na linke P1.0[/code]

PRÍLOHA: popis inštrukcií

Riadia činnosť funkcií MCU a obsluhu “podmienkových” príznakov. Inštrukcie vkladáme terminálom - pod číselným kódom vojdením do sequenceru na jednotlivé adresy pamäte SEEPROM, (x)=počet bajtov, ktoré inšttrukcia spotrebuje.

[code]kód, názov inštrukcie, funkcia / činnosť

00(?)disptext xx abcd…^ zobrazí text na displayi od adr.xx, ukončený symbolom ^ (vkladá ho automaticky)
01(?)termtext abcd…^ zobrazí text na termináli, ukončený symbolom ^ (vkladá ho automaticky)
02(3)dispbyte yy xx zobrazí bajt yy na displayi od adr.xx
03(2)termbyte yy zobrazí bajt yy na termináli
04(3)dispbits yy xx zobrazí 8 bitov bajtu yy na displayi od adr.xx
05(2)termbits yy zobrazí 8 bitov bajtu yy na termináli
06(3)dispchar yy xx zobrazí bajt yy jako ascII znak na displayi od adr.xx
07(2)termchar yy zobazí bajt yy jako ascII znak na termináli
08(4)ediDbyte yy xx zz edituje bajt yy na displayi od adr.xx v rozsahu 00-zz dekadicky
09(4)ediHbyte yy xx zz edituje bajt yy na displayi od adr.xx v rozsahu 00-zz hexa
0A(3)editbits yy xx edituje bity bajtu yy na displayi od adr.xx
0B(3)editchar yy xx edituje bajt yy zápisom hexa konštanty a jej ascII znaku na displ.adr.xx
0C(3)ediDbyte yy zz edituje bajt yy terminálom v rozsahu 00-zz dekadicky
0D(3)ediHbyte yy zz edituje bajt yy terminálom v rozsahu 00-zz hexa
0E(2)editbits yy edituje bity bajtu yy terminálom
0F(2)editchar yy edituje bajt yy zápisom hexa konštanty ascII znaku terminálom
10(2)init_sdk p inicializuje Dispay/Keyboard pre použitie portu Pp
11(2)modekeyb m volba módu editovania užívateľskej klávesnice: klasicky(10 tl), alebo inkrement(2 tl)
12(1)read_cfg načíta užívateľskú konfiguráciu do int.RAM MCU z EEPROM
13(1)save_cfg uloží užívateľskú konfiguráciu z int.RAM MCU do EEPROM
14(3)clr__bit b yy vymaž bit b bajtu yy
15(3)set__bit b yy nastav bit b bajtu yy
16(3)cpl__bit b yy neguj bit b bajtu yy
17(3)and_byte yy xx log.and bajtu yy s bajtom xx
18(3)orl_byte yy xx log.orl bajtu yy s bajtom xx
19(3)xor_byte yy xx log.xor bajtu yy s bajtom xx
1A(2)not_byte yy neguj bajt yy
1B(3)useflash aaaa vykoná ľubovoľný podprogram z FLASH MCU na adr.aaaa
1C(2)rotlbyte yy rotácia bajtu yy vľavo cez príznak: bit 7 → FLAG-bit → bitu 0
1D(2)rotrbyte yy rotácia bajtu yy vpravo cez príznak: bit 0 → FLAG-bit → bitu 7
1E(3)inc_byte yy n inkrement bajtu yy v hex/dec sústave
1F(3)dec_byte yy n dekrement bajtu yy v hex/dec sústave
20(3)movebyte yy xx presun obsahu bajtu xx do bajtu yy
21(3)loaddata yy dd zápis dát dd do bajtu yy
22(5)if_0=bit b yy aaaa ak je bit bajtu yy b=1, skok na adr.aaaa
23(5)if_1=bit b yy aaaa ak je bit bajtu yy b=0, skok na adr.aaaa
24(5)if_=byte yy xx aaaa ak je bajt yy zhodný s bajtom xx, skok na adr.aaaa
25(5)if_=data yy dd aaaa ak je bajt yy zhodný s dátami dd, skok na adr.aaaa
26(3)jump_adr aaaa skok na adr.aaaa
27(3)call_adr aaaa volanie na adr.aaaa
28(1) návrat z volania
29(1) ---- prázdna operácia bez významu[/code]

(x)= počet bajtov inštrukcie, b= bit 0-7, p= port 0,1,2, m= mód činnosti klávesnice 0-hexa /1-inkrement, n= pre inštr.1E a 1F: 1=desiatková / 0=hexa sústava, dd= datová konštanta 00-FFH, xx,yy= ak ide o adr.bajtu, tak rozsah: 00-FFH* pričom yy je cieľový bajt, ak ide o adr.displaya, napr. CM2016 (2x16 znakov), tak: 1.znak /1.riadok=00H, 2.znak /1.riadok=01H…0FH, a 1.znak / 2.riadok=40H, 2.znak/2.riadok=41H…4FH, zz= pre dec. sústavu: 00-99, pre hexa: 00-FFH, aaaa= adresa 0000-03FFH

(* - určité obmedzenia, týkajúce sa zákazu prístupu na niektoré RAM adresy, ktoré sú v použití programu procesora)

PRÍLOHA: BASIC-52

Interpreter Basic (modifikovaná verzia 1.31) je navrhnutý pre beh na jadre 8052 s externou RAMkou. Y. Anastassiová ho upravila pre beh v XRAM procesora a uvolnila porty P0 a P2 k použitiu. Vyžaduje minimum 1kB pamäte XRAM, pri ktorej je ale značne zlimitovaný. Beží v tzv. RAM-móde, vypustené (alebo zmenené) sú iba príkazy, ktoré pracovali s externou EPROM (jej napálenie/čítanie) a príkazy pracujúce s prerušeniami (prerušenia využíva iba MCUmodul-AC2 a v tomto použití pre basic moc veľké opodstatnenie nemajú). Použitie BASICu obsahuje kvantum príkazov, preto vážne doporučujem prečítať si original manuál k BASICU-52, kde je činnosť príkazov aj celého interpreteru výborne opísaná. Zmienim sa iba o úpravách, ktoré boli pre použitie BASICu-52 na jednočipovom mikrokontroléri urobené:

XFER: pôvodne slúžil na prenos dát medzi externými pamäťami EPROM a RAM, teraz prenesie program z internej EEPROM do XRAM; tento prenos nastáva aj automaticky – vždy po spustení interpreteru Basic.
PROG: uloží program z XRAM do internej EEPROM procesora.

Zrušené (zbytočné a nutne vypustené) príkazy sú iba tieto: ROM, RROM, PGM a FPROG (ten bol vypustený ešte pôvodnými autormi v tejto verzii interpreteru), a príkazy pracujúce s prerušeniami: CLOCK, ONTIME, ONEX1, RETI a IDLE.

Pribudli ďalšie inštrukcie, ktoré rozširujú možnosti využitia portov P0, P2 a P4 procesora (BASIC-52 ich neobsahoval):

P0: ovláda prístup (zápis, čítanie obsahu) k portu P0 P2: ovláda prístup (zápis, čítanie obsahu) k portu P2

pouzitie v programe - napr:

5 P2=200 10 if P0=100 then ... 15 ... 20 ... 30 end

Linky portu P4 – P4.0 a P4.1 je možné ovládať v BASICu-52 pomocou jeho inštrukcie „call xxxxh“.

call 0FA9h nuluje linku portu P4.0 – táto linka môže byť použitá iba ako výstupná call 0FACh nastaví linku portu P4.0 – táto linka môže byť použitá iba ako výstupná call 0FAFh neguje linku portu P4.0 – táto linka môže byť použitá iba ako výstupná call 0FB2h nuluje linku portu P4.1 – táto linka môže byť použitá iba ako výstupná call 0FB5h nastaví linku portu P4.1 – táto linka môže byť použitá iba ako výstupná call 0FB8h neguje linku portu P4.1 – táto linka môže byť použitá iba ako výstupná

pouzitie v programe - napr:

10 call 0FA9h 20 ... 30 ... 40 end

Test BASICu-52:

[code][MCS BASIC-52 v1.31]
READY

print mtop

1022 alokátor použiteľnej pamäte XRAM

print free

510 voľné bajty použiteľnej XRAM

print xtal

12000000 frekvencia kryštálu (logicky – fixne daná :-))[/code]

PRÍLOHA – Ďalšie inštrukcie BASICu-52

BASIC-52 bol vo viacerých verziách – v1.0, v1.1, v1.2, v1.3 a finálna v1.31, preto sa môže použitie niektorých príkazov v závislosti od popisu inštrukcií odlyšovať a nie všetky sú v minimálnom móde behu MCU funkčné.

[code]COMMAND: FUNCTION: USAGE EXAMPLE(S):

RUN Execute a program RUN
CONT CONTinue after a STOP or control-C CONT
LIST LIST program to the console device LIST LIST, LIST 10-50
LIST@ LIST program to user driver (version 1.1 only) LIST@, LIST@ 50
NEW erase the program stored in RAM NEW
NULL set NULL count after carriage return line feed NULL, NULL 4
RAM evoke RAM mode, current program in RAM RAM
BAUD set baud rate for line printer port BAUD 1200
CALL CALL assembly language program CALL 9000H
CLEAR CLEAR variables, interrupts and Strings CLEAR
CLEARS CLEAR Stacks CLEARS
DATA DATA to be read by READ statement DATA 100
READ READ data in DATA statement READ A
RESTORE RESTORE READ pointer RESTORE
DIM allocate memory for arrayed variables DIM A(20)
DO set up loop for WHILE or UNTIL DO
UNTIL test DO loop condition (loop if false) UNTIL A= 10
WHILE test DO loop condition (loop if true) WHILE A= B
END terminate program execution END
FOR-TO-{STEP} set up FOR-NEXT loop FOR A= 1 TO 5
NEXT test FOR-NEXT loop condition NEXT A
GOSUB execute subroutine GOSUB 1000
RETURN RETURN from subroutine RETURN
GOTO GOTO program line number GOTO 500
ON GOTO conditional GOTO ON A GOTO 5,20
ON GOSUB conditional GOSUB ON A GOSUB 2,6
IF-THEN-{ELSE} conditional test IF A<B THEN A=0
INPUT INPUT a string or variable INPUT A
LET assign a variable or string a value LET A= 10 (LET is optional)
ONERR ONERRor GOTO line number ONERR 1000
PRINT PRINT variables, strings or literals PRINT A (P. is shorthand for PRINT)
PRINT# PRINT to software serial port PRINT# A
PH0. PRINT HEX mode with zero suppression PH0. A
PH1. PRINT HEX mode with no zero suppression PH1. A
PH0. # PH0. to line printer PH0.# A
PH1. # PH1. to line printer PH1.# A
PRINT@ PRINT to user defined driver (version 1.1 only) PRINT@ 5*5
PH0.@ PH0. to user defined driver (version 1.1 only) PH0. @ XBY(5EH)
PH1.@ PH1. to user defined driver (version 1.1 only) PH1.@ A
PUSH PUSH expressions on argument stack PUSH 10, A
POP POP argument stack to variables POP A, B, C
PWM PULSE WIDTH MODULATION PWM 50, 50, 100
REM REMark REM DONE
STOP break program execution STOP
STRING allocate memory for STRlNGs STRING 50, 10
UI1 evoke User console Input routine UI1
UI0 evoke BASIC console Input routine UI0
UO1 evoke User console Output routine UO1
UO0 evoke BASIC console Output routine UO0
ST@ store top of stack at user specified location ST@ 1000H (version 1.1 only) ST@ A
LD@ load top of stack from user specified location LD@ 1000H(version 1.1 only) LD@ A

  • ADDITION 1 + 1
    / DIVISION 10 / 2
    ** EXPONENTATION 2 * * 4
  • MULTIPLICATION 4 * 4
  • SUBTRACTION 8 - 4
    .AND. LOGICAL AND 10.AND.5
    .OR. LOGICAL OR 2.0R.1
    .XOR. LOGICAL EXCLUSIVE OR 3.XOR.2
    ABS( ) ABSOLUTE VALUE ABS(-3)
    NOT( ) ONES COMPLEMENT NOT(0)
    INT( ) INTEGER INT(3.2)
    SGN( ) SIGN SGN( - 5)
    SQR( ) SQUARE ROOT SQR(100)
    RND RANDOM NUMBER RND
    LOG( ) NATURAL LOG LOG(10)
    EXP( ) “e” (2.7182818) TO THE X EXP(10)
    SIN( ) RETURNS THE SINE OF ARGUMENT SIN(3.14)
    COS( ) RETURNS THE COSINE OF ARGUMENT COS(0)
    TAN( ) RETURNS THE TANGENT OF ARGUMENT TAN(.707)
    ATN( ) RETURNS ARCTANGENT OF ARGUMENT ATN(1)
    CBY( ) READ PROGRAM MEMORY P. CBY(4000)
    DBY( ) READ/ASSIGN INTERNAL DATA DBY(99)=10
    XBY( ) READ/ASSIGN EXTERNAL DATA P. XBY(10)
    GET READ CONSOLE P. GET
    PORT1 READ/ASSIGN l/O PORT 1 (P1) PORT1=0FFH
    PCON READ/ASSIGN PCON REGISTER PCON=0
    RCAP2 READ/ASSIGN RCAP2 RCAP2=100
    T2CON READ/ASSIGN T2CON REGISTER P. T2CON
    TCON READ/ASSIGN TCON REGISTER TCON=10H
    TMOD READ/ASSIGN TMOD REGISTER P. TMOD
    TIMER0 READ/ASSIGN TIMER0 TIMER0=0
    TIMER1 READ/ASSIGN TIMER1 P. TIMER1
    TIMER2 READ/ASSIGN TIMER2 TIMER2=0FFH
    PI PI – 3.1415926 PI[/code]
    mcumodul_c51ac2_v1_03-manual.pdf (150 KB)
    mcumodul_c51ac2_v1_03-basic-52-manual.pdf (777 KB)
    mcumodul_c51ac2_v1_03-program.hex (56.3 KB)

Hannibal byl tak laskav a zaslal mi aktualizaci MCUmodulu 1.03.

MCUmodul-AC2 (89C51AC2) v1.03b (update 1.03b lite)

Dostal som od Olega Kowalczuka ďalšie “update” MCUmodulu (v1.03B), zmena spočíva iba v upravení prog.editoru tak, že teraz obsahuje fixných 128 riadkov (adr.00-7Fh) miesto 1024 bajtov pre programové kroky - tj. každý riadok má 8 byte. Zároveň bolo skrátené zadávanie adresy na 1BYTE(00-7Fh), čo zjednodušuje písanie a značne uľahčuje orientáciu, čomu dopomáhajú hlavne upravené “insert” a “delete” v menu editoru programu. Limitované sú iba inštrukcie TTY_text a DISPtext, ktoré umožňujú vložiť max.5(4) znaky textu. Pre dlhší text sa musí napísať viacero inštrukcií po sebe.

Nemal som čas to detailne testovať, autor prosí čitateľov fóra, aby v prípade postavenia konštrukcie nahlásili možné chyby súvisiace s problémami pri vkladaní inštrukcií, listovaní programu, používaní jednotlivých položiek menu, atd. Narýchlo som len urobil malú ukážku, pri ktorej mi MCUmodul šlapal bezchybne a na žiadny problém som nenarazil - viz. výpis z terminálu TeraTermPRO:

[code]Yasmine Anastassiou’2003

======================
= MICROKIT-52 FAMILY =

<1> MCUmodul-AC2 v1.03
<2> MCS BASIC-52 v1.31

default:<1>, waiting…1
[MCUmodul-AC2 v1.03]
MCU 1:>h

log ON/OFF change/remove password actual status of RAM MCU prog.editor

MCU 1:>sequ[ok]
00:h

edit
ist program
dres
ls adr->adr
ns free step
el next step
uit
ave
ead
able A/D

00:
00>TTY_text Nasta^
01>TTY_text v cas^
02>TTY_text :^
03>ediDbyte 12 0=>23
04>ediDbyte 11 0=>59
05>useflash :0EB9
06>call_adr :7C
07>jump_adr :06
08>
08:adr_7C
7C:
7C>loadbyte 1B 0D
7D>useflash :0EBF
7E>useflash :0EF5
7F>
00>
00:list
00:TTY_text Nasta^
01:TTY_text v cas^
02:TTY_text :^
03:ediDbyte [time hrs]12 0=>23
04:ediDbyte [time min]11 0=>59
05:useflash :sendCRLF
06:call_adr :7C
07:jump_adr :06
7C:loadbyte [USEFdata]1B data 0D
7D:useflash :send TTY
7E:useflash :sendCLCK
7F:
[ok]
00:quit[ok]
MCU 1:>Nastav cas:
MCU 2:>23
MCU 1:>
MCU 2:>59
MCU 1:>
23:59:20 (poznamka:cas bezi v riadku)[/code]
mcumodul_c51ac2_v1_03b-program.hex (56.8 KB)