A také jak změnit typ jednochipu.

Tímto malým pojednáním bych rád pomohl všem příznivcům především jednochipů na otázku z nadpisu.

Krystaly.

Protože jsem chtěl udělat pro zájemce konverzi programu pro řízení krokových motorů na lacinější chip, přepsal jsem program pro PIC16C621A. Zběžně jsem prolétl datasheet jak původní PIC16C84, tak PIC16C621A, zhodnotil, že bude stačit vypnout komparátory na cílovém chipu a zbytek programu, až na definiční INC soubor, mohu ponechat. Program je tak jednoduchý, že nepoužívá ani proměnné, takže nebylo třeba ani se zabývat tím, že PIC16C621A má univerzálně použitelné registry o něco výše. Párkráte jsem tedy ťukl do klávesnice, vypálil PIC pomocí IC-PROG a vložil jej do patice po původním PIC16C84. Spustil napájení a NIC. Všechno jsem znovu zkontroloval, znovu prošel datasheety a nic jsem neviděl špatně. Vyměnil jsem tedy krystal a všechno se rozběhlo. Tedy co jsem tím chtěl říci.

  • To že jeden PIC běhá s kusem krystalu neznamená, že jiný typ ba dokonce kus stejného typu s ním poběží také.
  • Rozdíl mezi HS a XT konfigurací je v zesílení, pro kmitočty na hranici mezi doporučeními volím raději HS.
  • Krystal je třeba vyměnit, hraním si s kapacitami u něj ztrácíte jen čas, málo kdy to začne pracovat.
  • Kupujte vždy nejméně 2 ks krystalů. Z 25ks 24MHz krystalů v miniaturním provedení se mi nepodařilo s AT89C2051-24PI snad každý čtvrtý rozkmitat. Všechny jsem kupoval v GM a problémy nastaly při změně ceny z 25Kč v maloobchodě na 20Kč a když začalo být značení na pouzdru nekontrastní, tedy ne černé jako dříve. Předpokládám změnu dodavatele krystalů a pokud se tím mělo uspořit, pak mi to moc neuspořilo. Podotýkám, že krystaly jsou zdravé a v zapojení oscilátoru s tranzistorem je krásně rozkmitáte, ale k Atmelům se prostě jejich parametry nelíbí. Ještě bych rád dodal, že všechny testované kusy Atmelů běžely za podmínek vhodných pro tak vysoké taktování, tj. přesně 5V napájení.
  • Pozor na krystaly na vyšší harmonické. Pokud není krystal na "fundamental", poběží Vám jednochip třeba jen na třetině požadované frekvence (pokud je pro třetí harmonickou) a pak nesedí jak časování, tak sériové přenosy a nebo se něco nestíhá, ačkoli by normálně mělo. Při frekvencích do 20MHz se s krystaly na vyšších harmonických nesetkávám, ale možná je to jen mými obvyklými dodavateli, kolik a jakých krystalů se ve světě vyrábí definovat nedokážu.

Konfigurace chipu.

Než vypálíte konfigurační bity, uvědomte si, že ne vždy jsou obsaženy v HEX souboru. Proto u své konstrukce jejich nastavení dobře promyslete a u cizích si důkladně pročtěte popis. Říkám důkladně, protože z některých dotazů je mi naprosto jasné, že pisatel je jen líný číst. Tedy jejich nastavení si ověřte ve vypalovacím programu a správně je nastavte.

  • WDT povolené u PIC v programu, který WDT nenuluje bude PIC vytrvale resetovat.
  • Vypalovací programy mají zaškrtnutí konfiguračních bitů většinou logicky, tedy povolit/zakázat a nemusí tato logika odpovídat tomu, je-li bit fyzicky nulován či ponechán v 1.
  • U AT89C5x s použitím externí paměti programu si dobře rozmyslete zamčení všech LOCK bitů. Mají totiž vliv na dostupnost oné externí paměti programu a dostupnost interní paměti programu z programu prováděného z externí paměti. Zase platí přemýšlet a číst.
  • Pokud ještě není aplikace důkladně otestována, nezamykejte ochrany proti čtení u OTP chipů. Pokud totiž program nepoběží jak má, můžete např. u PIC vynulovat stávající program, tedy udělat z něj NOP instrukce a po kompilaci programu se začátkem někde výše si jej vypálit znovu do ještě nevypálené části paměti a tedy jeden OTP jednochip použít pro několik zkoušek programu. Jen malé procento programů pro PIC zabere celou paměť programu a i kdyby v chipu napuštěném špatným programem zbylo jen pár bajtů, vždycky se najde aplikace, jak jej někde využít i kdyby to mělo být až za rok či dva, ten chip Vám v šuplíku tolik místa nezabere.
  • Pokud budete dodatečně program zamykat proti čtení, nenechte se rozladit chybou při vypalování kontrolního součtu. Ten prostě bude špatně a ničemu to nevadí. Osobně preferuji možnost žádné kontrolní součty nevypalovat, ale to je otázka vypalovacího programu a možností jeho nastavení.

Konverze na jiný typ.

Spousta programů psaných pro určitý jednochip, lze bez velkých úprav použít pro jednochip jiný. Tak napřiklad program psaný pro oblíbený PIC16F84A s FLASH pamětí lze použít pro o polovinu lacinější jednochip s OTP pamětí. Je ale třeba:

  • Zkontrolovat, zda všechny věci použité programem jako EEPROM dat, u některých typů ADC atd. jsou na zamýšleném chipu taktéž k dispozici. Často právě ona EEPROM pro data se u PIC16x84x nevyužívá a podobný OTP chip bez ní stojí polovinu.
  • Zkontrolovat rozložení pinů původního a nového chipu.
  • Zkontrolovat, zda náš programátor umí zamýšlený chip. Je smutné mít nakoupeny PIC16C54C jako náhradu za PIC16F84A a pak zjistit, že musíte nejprve postavit nový programátor pro paralelní programování a až pak pálit a jako naschvál potřebujete mít zítra všechno vypálené. Pokud pracujete s PIC déle, toto se Vám jistě nepřihodí, ale berte to spíš jako příklad varování co se může stát, když se všechno nedomyslí.
  • Nikdy slepě nevypalujte HEX z původního chipu do nového typu. Může totiž mít třeba 14bit jádro místo 12bit a pod. Vždy ve zdrojovém kódu zkontrolujte používání registrů, zvláště pro univerzální použití, mohou u každého typu začínat jinde. Důležité je projít si všechny SFR - speciální funkční registry. Tam totiž nejlépe najdete co je na chipu jiné. Projít si i konfigurační bity a přesvědčit se, jestli se nám do velikosti paměti program vůbec vejde také není od věci.
  • U PIC kontrolujte i rozložení bitů v SFR, nemusí být stejné, např. OPTION registr u PIC12C508A a PIC12C671.
  • Výrobce chipů při zahájení distribuce nové verze stejného chipu informuje o změnách. V těchto PDF se pak dozvíte, že se třeba na verzi A jen zvětšila paměť dat a zvýšil maximální kmitočet a vypalovat se klidně dá i původním programem pro verze bez A - to je ale jen příklad, vždy si tyto skutečnosti prověřte.
  • Dejte si u PIC pozor i na chipy s integrovaným interním RC oscilátorem. Zatímco u PIC12C508 a spol. začíná program na konci paměti programu, kde se nastaví do W kalibrační konstanta pro interní RC oscilátor a pak program přeteče na adresu 0, kde stačí W vložit do OSCCAL pomocí MOVWF OSCCAL, u PIC12C671 se na konci paměti programu nachází návrat z podprogramu a po resetu chip začíná program provádět od adresy 0. Pak tedy musíte u PIC12C671 a spol. na začátku programu provést CALL na konec paměti programu a OSCCAL naplnit až po přehození banky registrů, protože se OSCCAL nachází v první bance registrů a ne v nulté, kde po resetu jsme. Toto platí samozřejmě jen při použití interního RC oscilátoru.
  • Jak jsem již naťukl v předešlém, vždy kontrolujte, ve které bance registrů je který speciální funkční registr (SFR), obzvláště pokud existují u náhrady nějaké navíc a potřebujete něco vypnout či nastavit.
  • U klonů 8051 se může stát, že budete potřebovat, aby program běžel rychleji. Jednoduchým způsobem jak toho dosáhnout u konstrukce s externí pamětí programu je typ TS80C31X2 nebo TS80C32X2 od Temic. Je běžně k mání a označuje se jako např. 40MHz. Ale pozor, není to 40MHz reálně, ale tento chip pracuje se šesti fázemi místo původních dvanácti na strojový cyklus. Na vstupu taktování je dělič dvěma a tak se vlastně chová jako běžná 80C31(32). Až teprve přehozením bitu X2 v registru CKCON se ono dělení dvěma zruší a tak se 20MHz taktovaný TS80C31X2 chová jako běžná 80C31 taktovaná na 40MHz. Chci tím říci, že je nutné pro vyšší výkon sáhnout do programu a ne jen vyměnit jednochip, tím by se prakticky nic nezměnilo.
  • Při náhradách klonů 51 se dostanete do situace, že chip oplývá nějakými rozšířeními. Naštěstí jsou i pak chipy kompatibilní s originální 51 a rozšíření jsou dostupná, až když je použijete pomocí SFR mapovaných tam, kde u originálu nic nebylo. Tady ale pozor na záměnu vylepšeného klonu 51 za obyčejný. Může se pak stát, že původní měl implementován 2x DPTR pro pohodlné přenosy dat a obyčejný má jen jeden DPTR. Pak by program, pokud je využívá, nechodil s obyčejnou 51 korektně.
  • Některé klony 51 mají i implementován druhý sériový port. Pozor na něj, mohl by Vám zase při náhradě dolů chybět. Když bude přebývat nevadí.
  • Pokud se domníváte, že už 51 ztrácí dech na konkurenci, pak si prohlédněte DS89C420, což je klon 51 s FLASH pamětí běžící na 50MHz a zjednodušeně řečeno co fáze to instrukce a se spoustou dalších užitečných rozšíření. Pokud je někdo na českém trhu nabízí, prosím ozvěte se mi, rád sdělím i ostatním kde je koupit a udělám po dohodě i recenzi.

Chyba v programu.

Jistě může být chyba i v programu jednochipu. Tam se dá určit chyba bez prohlídky zdrojáku asi těžko. Alespoň tedy pár věcí, kterých se můžete dopustit i jen nepozorností a špatně se hledají.

  • Jde o to, že pokud někam zapíšete jen číslo bez #, bude jej kompilátor považovat za číslo registru a ne za hodnotu. Tohoto přešlapu se nejsnáze dopustíte u 8051. Pak se Vám může někde místo hodnotou plnit registr obsahem jiného registru a co je nejhorší, pokud bude onen registr obsahovat právě nějakou vhodnou hodnotu, bude program občas pracovat a občas se bude chovat podivně. Jeho selhání v nejnevhodnější okamžik je pak nepředvídatelné.
  • Velice nehezkou chybou je přepsání nějakého používaného registru během přerušení, nebo i nastavení nějakého flagu během obsluhy přerušení. Pak máte o zábavu postaráno, protože třeba testujete přetečení v předchozí operaci a právě před instrukcí, která má testovat či zahrnout onen přenos, se vyvolá přerušení, ve kterém se hodnota přenosu přepíše.
  • Pozor na stránkování u PIC. Není to zavrženíhodná věc, jak by se dalo domnívat, ale souvisí to s co nejjednodužším provedením RISC procesoru. RISC procesory totiž v assembleru nutí programátora na všechno myslet. Jde tedy o to, jak co nejvíce dosáhnout za co nejméně a neřeší se to, jak je to složité a nepohodlné pro programátora, ale jak efektivní je výsledek, tedy stále nejvíce za nejméně. A proč dělat instrukční slova delší než je nezbytně nutné, když se dá prostě stránkovat. U PIC si tedy před skoky přes stránky nezapomeňte také nastavit nejvyšší bity adresy do PCLATH. Jednou na to zapomenete a program běží v jiné stránce.
  • Při použití WDT u PIC si dejte pozor na to, aby se nestalo, že někde program může dlouho na něco čekat a nenuluje si WDT, ale to už je opravdu začátečnická chyba i když v zápalu souboje s assemblerem se dá dopustit opravdu všeho.
  • Každý program v jednochipu musí buď stále pracovat a nebo končit smyčkou uzavřenou do sebe, nebo musí shodit jednochip do "power down", ze kterého se vzbudí jen resetem. Možná se budete usmívat, ale už jsem dostal k posouzení jinak velice hezký program, který končil prostě tím, že udělal na pinu poslední zamýšlený puls a dál prostě nic. Program ale takto skončit nemůže, jednochip prostě bere co je v paměti dál a dál jede, nezajímá ho, že co je dál už tam není vypáleno schválně. Prostě pokud už dál od jednochipu nic nechceme, musíme zařídit, aby také už nic dále nedělal a tedy nevykolejil z našeho chtěného programu. Jednochip buď program provádí, je v resetu, spí nebo je bez napájení.

Nákup chipu.

Sice nereší přímo otázku proč něco nepracuje, ale je to část rozhodnutí o typu použitého jednochipu z čehož pak může původní otázka vyplynout. Velice se podivíte, když zjistíte, že verze v provedení "Industrial" je jen o malé procento dražší než "Comercial". Ještě více se můžete podivit, když zjistíte, že 24MHz varianta Atmela je lacinější než 20MHz verze. Také zjistíte, že chip s podstatně lepšími vlastnostmi - více integrovanými periferiemi - stojí méně než nejběžněji používaný chip. Doporučuji

  • Před návštěvou prodejny si prostudujte ceník, je-li na i-netu k dispozici. Ceny se mohou měnit a pak jsme přece milí lidé a tak rádi prodejci pomůžeme se zbavit nejlacinějších chipů, když jsou lepší než ty dražší, proč mu od neprodejného materiálu nepomoci :-).
  • Pokud chip neznáte, stáhněte si a prohlédněte PDF. To že jste jej nikde ještě neviděli použít neznamená, že by použít nešel, jen se třeba ještě nikdo nenamáhal se o tom přesvědčit, nebo to jen nepublikoval. Osobně před nákupem mimo toho co potřebuji hledám i nejnižší ceny jednochipů u prodejce a někdy podle toho měním i použitý chip v konstrukci. Některé mé konstrukce běhají na několika různých PICech v různých kusech jen z důvodu aktuální ceny. Pokud si přepis vyžádá například půl hodiny až hodinu a uspořím tím na několika kusech dejme tomu 300 až 500Kč, myslím že se to vyplatí a na výsleku se nic nezmění, no nevezměte si je :-).
  • Nekupujte 100 a více ks v maloobchodě. Pro větší odběry pak hledejte přímo distributora firmy pro daný region, dá se často najít přímo na stránkách výrobce nebo na webu. Měl by být levnější než x-tý překupník, ti jsou zase velice vhodní pro odběr malých množství se kterými velký distributor obchodovat nebude, ale i tak to za pokus stojí. I odpovědi na dotazy na pár ks k prodeji patří.

Autor: Jiří Bezstarosti

Autorův e-mail: jiri@bezstarosti.cz