OTP je u vývojářů hrozně neoblíbená zkratka. Znamená One Time Programmable a u mcu to znamená, že paměť programu je obvykle typu EPROM a není mazatelná a jde jí naprogramovat pouze jednou. Důvod použití OTP paměti je jediný - její proklatě nízká cena. Pro vývojáře, kteří si zvykli na metodu pokus-omyl, je to velmi velký problém, protože nemohou nahrát do Flash paměti mnoho různých verzí programu a tak odlaďovat správné řešení problému. V tomto článku bych chtěl poukázat na to, jak řešit použití OTP.

Možná řešení

V praxi jde použít tři možné přístupy:
  • odladit programy v SW simulátoru
  • odladit programy v HW emulátoru
  • naprogramovat OTP vícenásobně.


SW simulace - není překvapivé že nejčastěji jsou OTP paměti spojené s mcu, založené na běžných "malých" jádrech typu 51, Z80 či 6502. Proto existuje mnoho různých sotvérových simulátorů na simulaci běhu programu na těchto jádrech. Za pomocí těchto simulátorů se dá velké množství chyb odchytit a program pak náhrát do mcu s OTP pamětí až ve finální verzi. Nicméně SW je krásná věc, ale jak určitě víte je to stejné jako s teorií a praxí. Proto je určitě výhodné, po odladění na simulátoru ještě program ověřit pomocí následujícího způsobu.

HW emulace - je tvořena mcu se stejným jádrem jako má mcu s OTP pamětí, doplněné obvykle buď SRAM nebo FLASH pamětí. Do externí paměti se nahraje laděný program a pak se emulátor spustí a začne vykonávat nahraný program. Výhodou proti SW simulátoru je ta skutečnost, že provádění probíhá v reálném čase a proto můžete skutečně ověřit jak se bude chovat na daném místě mcu s OTP pamětí. Pokud ale nemáme HW emulátor tak nám nezbude nic jiného, než použít na ladění vlastní OTP čip. Ale i zde je jedna finta - OTP paměť lze využít opakovaně.

Opakované programování OTP pamětí. Vypadá to na oxymoron, ale ve skutečnosti to opravdu jde. EPROM paměť funguje ta, že před naprogramováním jsou všechny byty paměti nastaveny na 0xFF a při programování se mění hodnota bitu z "1" na "0". Opačně to bohužel nejde. Z uvedeného vyplývá, že můžeme opakovaně paměť programovat, ale dosáhneme jen stále většího počtu "0" v paměti, která na začátku obsahovala jen "1". Zde ukážu konkrétní příklad pro jádro 51, ale totéž můžete udělat pro jiná jádra. Důležité je si uvědomit že opcode 0x00 je NOP, tedy No Operation - mcu jen přeskočí tuto instrukci bez toho že by vykonal nějakou jinou činnost. A druhá finta je to, že opcode 0xFF je MOV R7,A - což pro nás není nijak závažný kód.

První verzi programu vytvoříme tak, že před program nahrajeme následující kousek kódu:

ORG 0
   MOV R7,A
   MOV R7,A
   MOV R7,A
   MOV R7,A
   MOV R7,A
   MOV R7,A
ORG 7H

a pak normálně pokračujeme v laděném programu. Pomocí MOV R7,A jsme si vytvořili místo pro budoucí úpravy. Pokud nalezneme chybu v programu a potřebujeme nahrát novou verzi (předpokládejme že ta první se nám vešla do 1FF bajtů), tak pro druhou verzi opravíme program následujícím způsobem:

ORG 0H
   LJMP #200H

ORG 200H
a zde bude námi laděný program.

Po překladu se LJMP #200H přeloží jako 02 02 00 a tyto tři bajty přepíší původní FF FF FF na začátku paměti. Instrukce pak provádění programu skokem přenese na nový začátek a program se pak provádí dál. Předpokládejme, že i nyní se nalezla v programu chyba a potřebujeme ladit další verzi. Jak tedy budeme pokračovat? Musíme změnit začátek takto:

ORG 0H
   NOP
   NOP
   NOP
   LJMP #400H

ORG 400H
a zde bude laděný program.
První část programu se přeloží jako 00 00 00 (to je 3x NOP a to nám přepíše ten původní skok LJMP #200H) a pak následuje přeložený skok: 02 04 00 (což přepíše v paměti umístěné FF FF FF).

Zde uvedený postup je možné aplikovat i vícekrát, pokud je dostatečně velká OTP paměť v mcu. Úplně stejným způsobem je možné ošetřit i přerušení. Tj. odkaz na přerušení vede na rutinu, která začíná sadou PUSH A a pak opakovaně MOV R7,A (což se přeloží jako FF). Tyto předem připravené FF se pak přepíší při ladění dalších verzí skokem na nové umístění přerušovací rutiny (pokud je v ní chyba a je třeba nová verze - v opačném případě se může použít stávající obsah paměti).


Závěr

Jak určitě správně poznamená jeden z našich pilných čtenářů, zde uvedená metoda vícenásobného programování mcu s OTP pamětí je pracná a jde spíše o z nouze ctnost. Laděním pomocí HW emulátoru je jistě jednodušší a pohodlnější (zejména pokud mcu obsahuje debug jednotku). Zde prezentovaný způsob vícenásobného použití OTP paměti je pro pilné Indy a pro nás spíše programátorská perlička.