V článku sa budeme venovať malej čiernej krabičke s veľa nožičkami alebo inak povedáné 8bit. mikroprocesorom PIC od firmy Microchip (http://www.microchip.com). Zaoberať sa budeme hlavne o to, čoho sú tieto jedince schopné, ako ich programovať a neskôr aj ako ich využiť v praxi. Nebudem to tu zaťažovať žiadnou podrobnou analýzou architektúry či podobnými (teraz) zbytočnosťami, avšak čitatel by mal mal byť aspoň trocha „elektro-friendly“.
PIC16F84(A) a čo všetko nám ponúka.
Popis jednotlivých pinov procesora
No nieje toho až tak veľa, ale je lepšie začínať na tomto type predovšetkým kvôli nízkej cene malým HW požiadavkám a takisto sa rýchlo a šikovne programuje. Poďme sa pozrieť na bližšiu špecifikáciu tohto mikroprocesora. V ponuke máme 13 I/O portov, ktoré sú zaťažitelné až do 25mA. Pomocou nich môžeme ovládať a zapínať čo sa nám len zachce (od LED diód až po nejaké elektromotory, samozrejme s ekvivalentným zosilnením). Takisto však môžeme tieto porty využívať ako INPUT a v tomto prípade môžeme sledovať či bol napr. stlačený spínač a procesor môže na takýto podnet príslušne reagovať, všetko však závisí od toho ako sa naprogramuje. Porty sú delené do dvoch skupín RA0 až RA4 a RB0 až RB7. Tieto sú ovládané pomocou registrov procesora ktoré sú 8bitové. Takisto musím spomenúť že k dispozícii máme 8 bitové počítadlo TMR0, ktoré je inkrementované buď vnútornými hodinami procesora, alebo signálom na port RA4, ktorý je zdielaný práve s vstupom pre inkrementáciu počítadla (preto aj značenie RA4/T0CKI). Či bude tento pin využitý ako I/O port alebo ako vstup na počítadlo záleží od naprogramovania procesora. Okrem toho si ešte môžeme navoliť či sa má počítadlo inkrementovať pri nábežnej hrane signálu, či na vzostupnej. V ponuke máme aj možnosť deličky(1:1,1:2,1:4,...,1:256), takže ak by sme mali nastavenú deličku na 1:4 počítadlo nebude počítať každý impulz ale pre každé štyri inkrementuje len raz. PIC16F84 (ako aj iné) má v sebe zabudovaný tzv. Watchdog Timer (WDT). Je to nezávislí obvod s vlastným zdrojom taktovacieho signálu, ktorý stráži chod procesora. V princípe to funguje asi tak, že WDT má svoje počítadlo ktoré stále inkrementuje, nezávisle na chode procesora, no a keď pretečie (255->0) WDT procesor zresetuje. To znamená, že toto počítadlo musí procesor neustále nulovať. Ak by sa stalo, že procesor „zamrzne“, nevynuluje počítadlo, to pretečie a WDT vykoná reset. Tak, tie základné črty procesora PIC16F84 sú nám známe, poďme sa pozrieť ako je to s pamäťou:
Pamäť je rozdelená na dve časti. V prvej je uložený register procesora, druhá slúži na ukladanie dát (premenných). Procesor disponuje aj „trvalou“ pamäťou EEPROM(64bytes), ale o nej inokedy.
Registre PIC16F84
Register je rozdelený na dve banky(0 a 1). Pri priamom adresovaní (keď pristupujeme k registrom ich menom) nesmieme zabudnúť navoliť tú banku v ktorej je daný register. Popíšme si teda jednotlivé registre:
INDF[00h,80h] – Slúži na nepriame adresovanie spolu s registrom FSR[04h]. Funguje to asi tak, že do FSR zapíšeme adresu registra (napr. 85h) a register INDF bude obsahovať to isté ako register TRISA a obdobne s ním môžeme aj pracovať.
TMR0[01h] – Z tohto registra môžeme čítať hodnotu počítadla časovača/počítadla TMR0 o ktorom sme si povedali vyššie.
PCL[02h,82h] – Tzv. Program Counter Register. Môžeme ho tiež považovať za akési programové počítadlo, ktoré nám udáva „koľká“ inštrukcia sa vykonáva. Tento register obsahuje iba spodných 8 bitov z 13tich, kedže počítadlo je 13 bitové.
STATUS[03h,83h] – Register, ktorý uchováva tzv. príznaky (Flags) pri rôznych aritmetických operáciach procesora. Naviše sa týmto registrom volí aj s akou bankou budeme pracovať(bit 5 [0-banka0 / 1-banka1]). Čiže ak chceme pracovať s registrom TRISB musíme najprv zvoliť banku1(ak už nieje) a to tak, že zapíšeme do registra STATUS na piaty bit hodnotu 1. Spomeniem ešte bit 2 tzv. Zero bit, ktorý nadobudne hodnotu 1 vždy vtedy keď výsledok aritmetickej alebo logickej operácie je 0. Tento bit je samozrejme iba read-only pretože je nastavovaný logikou procesora.
PORTA[05h] – Tento register spolu s registrom TRISA[85h] riadi a obsluhuje porty RA0-RA4. Kedže tieto porty môžu slúžiť ako INPUT alebo OUTPUT treba toto niečim nastaviť. Konkrétne registrom TRISA. Ak teda zapíšeme do tohto registra hodnotu 00011100 (1C hexa) nastavíme porty RA0,RA1 ako OUTPUT a RA2,RA3,RA4 ako INPUT. Počítame z prava do ľava. Posledné tri bity sú neimplementované a vždy čítané ako 0. Samotnú obsluhu však zabezpečuje register PORTA a tá záleží práve na „orientácíí“ portu. Ak sú teda porty RA0 a RA1 nastavené ako OUTPUT tak zápisom 00000011 do PORTA „zapneme tieto porty“. Opačná situácia nastáva keď je port nastavený ako INPUT. Vtedy do PORTA nezapisujeme, ale čítame z neho stav konkrétneho portu.
PORTB[06h] a TRISB[86h] – V podstate to isté ako vyššie, len sa pracuje s portmi RB0 až RB7.
EEDATA[08h] – Dátový register pre pamäť EEPROM. Sem ukladáme dáta (môžeme to považovať za akúsi medzipamäť) ktoré chceme zapísať do EEPROM.
EEADR[09h] – Adresný register pre EEPROM. Do tohto registra zapisujeme adresu, kde majú byť dáta z reg. EEDATA zapísané v pamäti EEPROM.
EECON1[88h] – Tento register riadi prístup, čítnie, zápis a obsluhu pamäti EEPROM.
EECON2[89h] – Nefyzický register, ktorý slúži ako ochrana pred nežiaducim zápisom do EEPROM.
PCLATH[0Ah,8Ah] – Obsahuje vyšších 5 bitov adresy (z 13-bit. čítača programu).
INTCON[0Bh,8Bh] – Register INTCON slúži na riadenie a obsluhu prerušení procesora.
Bit0: ak 1 – tak niektorý z bitov RB4 až RB4 zmenil stav (napr. bol privedený signál na port).
Bit1: ak 1 – tak bolo vyvolané prerušenie na porte RB0/INT.
Bit2: ak 1 – tak nastalo pretečenie počítadla TMR0.
Bit3: ak 1 – tak povolíme prerušenie pri zmene na RB4 až RB7.
Bit4: ak 1 – tak povolíme prerušenie na porte RB0/INT.
Bit5: ak 1 – tak povolíme prerušenie pri TMR0 overflow.
Bit6: ak 1 – tak povolíme prerušenie pri skončení zápisu do EEPROM.
Bit7: ak 0 – tak zakážeme všetky prerušenia.
ak 1 – tak povolíme všetky prerušenia.
OPTION_REG[81h] – Slúži k nasteveniu počítadla TMR0 a preddeličky.
Bit 0 až 2 – Určuje deliaci pomer preddeličky pre TMR0 a WDT
0 = 1/2 TMR0 alebo 1/1 WDT
1 = 1/4 TMR0 alebo 1/2 WDT
2 = 1/8 TMR0 alebo 1/4 WDT
3 = 1/16 TMR0 alebo 1/8 WDT
4 = 1/32 TMR0 alebo 1/16 WDT
5 = 1/64 TMR0 alebo 1/32 WDT
6 = 1/128 TMR0 alebo 1/64 WDT
7 = 1/256 TMR0 alebo 1/128 WDT
Bit 3 – Určuje k čomu bude preddelička pripojená
0= k TMR0
1= k WDT
Bit4 – Volba hrany signálu pre RA4/T0CKI
0 = nábežná hrana
1 = vzostupná hrana
Bit5 – Zdroj signálu pre TMR0
0 = Vnútorné hodiny procesora
1 = Vstup RA4/T0CKI
Bit6 – Volba hrany signálu pre RB0/INT
0 = nábežná hrana
1 = vzostupná hrana
Bit7 – Určuje udržovacie (pull-up) kladné napätie na porte B
0 = pull-up povolený
1 = pull-up zakázaný
Tak to by bolo v stručnosti o registroch všetko. Nepopisoval som detailne všetky, pretože by to bolo aj tak teraz zbytočné. V pokračovaní ešte ostaneme pri PIC16F84, ukážeme si niektoré základné inštrukcie procesora a takisto si povieme ako a čím sa tento procesor vlastne programuje.
Pripomienky, nejasnosti a zmysluplné otázky týkajúce sa témy smerujte do komentárov.
Z môjho pohľadu veľmi zaujímavá téma, som zvedavý na pokračovanie. Budú aj nejaké príklady, ukážkové zapojenia apod.?
--
On neni mrtev, on jenom spi!
Zdravim,
Samozrejme že budú, avšak je potreba ešte trocha teoretických poznatkov aby bolo možné pochopiť prečo je to vlastne tak zapojené, či prečo ten kód vyzerá takto a nie inak.
Jej, jednocipaky, mikrokontrolery :) a podobna haved. Az na to, ze platformu PIC nemam rad, kvoli jej architekture. Strasne debilne sa mi luskaju zdrojaky. Ale som zvedavy na nejake prakticke zapojenia, mozno sa niecim inspirujem ;)
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.