Hibakeresés MPLAB ICD2 segítségével I-II. Írta: Molnár Zsolt 2007. szeptember 20. 1/14
Tartalomjegyzék 1. Bevezetés...3 2. A mérőpanel felépítése... 5 3. Mintafeladat... 9 4. Mérési feladatok az I. méréshez... 13 5. Mérési feladatok a II. méréshez... 14 2/14
1. Bevezetés Az előző félév Elektronikai rendszerek laboratórium c. tárgya foglalkozott a PIC18-as mikrovezérlő családra történő programfejlesztéssel. Az elhangzott mérést támogató előadásokon és a laboratóriumi foglalkozásokon szó esett a PIC18-as család felépítéséről, assembly szintű programozásáról, valamint az MPLAB integrált fejlesztői környezetben való szimulációról, hibakeresésről. Ebben a félévben a hardveren, valódi (nem szimulált) környezetben elvégzett hibakeresést fogjuk tárgyalni. A Mikroszámítógép laboratórium PIC18 témájú méréseinek sikeres elvégzéséhez szükséges az Elektronikai rendszerek laboratórium ide vonatkozó témájú előadásainak és méréseinek ismerete, valamint a Mikroszámítógép laboratórium tárgyhoz kapcsolódó előkészítő előadások anyagának ismerete. Az MPLAB IDE számos fejlesztőeszközt támogat, amelyek között megtalálhatjuk a programozókat, emulátorokat, debugger (hibakereső) eszközöket. Ezek közül az MPLAB ICD2 hibakereső (In-Circuit Debugger) és programozó eszköz áll rendelkezésre a laboratóriumban. Ez az eszköz a mikrovezérlő belső erőforrásaira támaszkodva teszi lehetővé a programletöltést, a valósidejű futtatást, a töréspont(ok) elhelyezését és a hibakeresést. Mindehhez 2 portlábat (tipikusan PORTB 6. és 7. bitjét) és a reset jelet ( MCLR ) használja. (Természetesen szükség van a tápfeszültség bekötésére is (a föld mint referenciapont, a tápfeszültség pedig az ICD2 kimeneti pufferei jelszintjének beállítása miatt), de ez nem jelent mikrovezérlő lábhoz való csatlakozást. Abban az esetben, ha hibakeresésre vagy programozásra az ICD2-t akarjuk használni, a kapcsolás kialakításakor figyelembe kell venni néhány tervezési szempontot, amelyről több forrás között az MPLAB IDE súgójából kaphatunk információt.) Az ICD2 egy olcsó fejlesztőeszköz, kisebb tudással, mint egy emulátor. Egy emulátor POD-ja (Pin-On Device, a villamos és fizikai illesztést elvégző egység) az emulálandó processzor helyére kerül, helyettesíti azt szemben az ICD2 ötpontos csatlakoztatásával szemben. Az emulátor tartalmaz saját órajel-forrást, míg az ICD2 működéséhez a mikrovezérlő órajel-forrásának kell működnie. A töréspontok számában és összetettségében is jelentős eltérés van, míg az emulátor esetében gyakorlati szempontból korlátlan számú (több száz, több ezer) összetett feltételek alapján létrehozott töréspont is elhelyezhető, az ICD2 3/14
esetén mikrovezérlő típustól függően 1-5 töréspont definiálható, azok is csupán a programmemóriában, adott cím végrehajtására, illetve adott adatmemóriához való hozzáférésre. Ezeken felül is még számos különbség felsorolható. Az MPLAB-ban az ICD2 kezeléséhez szükséges menüpontokat az Elektronikai rendszerek laboratóriumnak a PIC18 mikrovezérlőkről szóló mérési útmutatóiban ismertettük. Ezért ezekre ismételten nem térünk ki. E mérési útmutatóban a PICDEM 2 PLUS mérőpanelt, és a penelen, az élő környezetben való hibakeresés lehetőségeit mutatjuk be egy példán keresztül. 4/14
2. A mérőpanel felépítése A mérőpanel kapcsolási rajza az alábbi ábrán látható. 5/14
A mérőpanel tartalmaz három integrált áramkör foglalatot a 18, 28 és 40 lábú mikrovezérlők számára. A mérésen csak a 40 lábú foglalatot használjuk, ide egy PIC18F452 típusú áramkör van behelyezve. A mérőpanelen tápfeszültség stabilizátor, órajel-források (alapértelmezett: 4MHz TTL kimenetű integrált oszcillátor), reset-áramkör és ICD2 csatlakozó van elhelyezve. A mikrovezérlő összes portlába ki van vezetve csatlakozópontokra, valamint rendelkezésre áll egy áramkör építési felület. A panelen található perifériák: 4 db. LED (D2 D5) 2 db. nyomógomb (hardverben pergésmentesítve) (S2, S3) potenciométer (analóg feszültség bemenet) (R16) piezo-hangszóró (P1) 2x16 karakteres HD44780-kompatibilis LCD kijelző (LCD1) RS232 port, szintillesztővel ellátva (J1) I2C buszra csatlakozó EEPROM (24LC256) I2C buszra csatlakozó hőmérséklet-érzékelő (TC74) A panel beültetési rajza az alábbi ábrán látható. LED sor Potenciométer LCD kijelző RS232 port EEPROM ICD csatlakozó Hangszóró Tápcsatlakozó Hőmérsékletérzékelő Nyomógombok 6/14
A perifériák részletes ismertetése: LED sor 4 darab LED csatlakozik az RB0 RB3 portlábakra. Kikapcsolhatóak J6 átkötés kiemelésével. Világítanak, ha az adott portláb állapota 1. Nyomógombok Egy alaphelyzetbe állító gomb (S1), és két portlábra csatlakozó gomb (S2, S3) található a panelen. S2 RA4-re, S3 RB0-ra csatlakozik. Utóbbi két nyomógomb RC tagokkal pergésmentesítve van. A nyomógombok működtetett állapotban 0 szintet adnak. Mindkét nyomógomb és a portlábak között védőellenállás van. Potenciométer A potenciométer RA0 portlábra (AN0) csatlakozik, 0-5V közötti feszültséget ad. A portláb védelme érdekében a csúszka és a portláb között védőellenállás van. Piezo-hangszóró A hangszóró RC2-re, a CCP1 modul PWM kimenetére csatlakozik. Tranzisztoros meghajtóáramkörrel rendelkezik. A kimenet J9 eltávolításával kikapcsolható. LCD kijelző 2x16karakteres kijelző, amely HD44780-kompatibilis vezérlőt tartalmaz. 4 bites interfészen csatlakozik a mikrovezérlőhöz: RD0 RD3 DB4 DB7, vezérlés: RA1 EN, RA2 R/W, RA3 RS. A kijelző kontrasztja jelen állapotban nem állítható. RS232 port Az RC6 és RC7 portlábak egy szintillesztőn keresztül egy DB9-es anyára vannak kivezetve. Innen egy úgynevezett egyenes kábel segítségével közvetlenül pl. egy PC-hez csatlakoztatható a panel. (Egyenes kábel: a kábel két végén lévő csatlakozók azonos pontjai vannak összekötve. A kommunikációhoz minimálisan összekötendőek a csatlakozók 2, 3, 5 pontjai.) 7/14
EEPROM Az EEPROM típusa 24LC256, szervezése 32k x 8 bites. Címe huzalozással 00h-ra van beállítva, nem változtatható. Az I2C vonalakon a kötelező felhúzó ellenállások be vannak ültetve (R8, R9, 2x4,7kΩ). Hőmérséklet-érzékelő Típusa TC74, felbontása 1 C, az I2C buszra csatlakozik. Címe belsőleg 9Ah-ra van beállítva (íráshoz LSB=0, cím: 9Ah; olvasáshoz LSB=1, cím: 9Bh), nem változtatható. 0 C felett a belőle kiolvasható 8 bites hőmérséklet-adat legfelső bitje 0, az alsó 7 bit tartalmazza a hőmérséklet-értéket. 0 C alatt a 8 bites hőmérséklet-adat legfelső bitje 1, az alsó 7 bit tartalmazza komplemens formában a hőmérséklet-értéket (1-es komplemens ábrázolás). A laboratóriumban a PIC18F452, a HD44780, a 24LC256 és a TC74 adatlapjai elektronikus formában rendelkezésre állnak, a felkészüléshez, illetve a házi feladatok elkészítéséhez az Internetről letölthetőek. 8/14
3. Mintafeladat Mintafeladatként végezzük el egy egyszerű program hibakeresését! Írjunk programot, amely a soros porton vett adatot 1-gyel megnövelve visszaküldi, számolja a vett bájtokat, és minden adatküldéskor invertálja PORTB 0. bitjét! Végezzük el az ellenőrzését ICD2-vel! Helyezzük tápfeszültség alá a mérőpanelt, csatlakoztassuk az ICD2-t a PC-hez, majd a mérőpanelhez! A panel RS232 soros portját kössük a PC megfelelő portjára! Hozzunk létre új projektet, helyezzük el benne az alábbi tartalmú forrásfájlt! ;**************************************************************************************** ;* feladat_1.asm ;**************************************************************************************** ;* A program soros porton megszakítással vesz, ha beérkezett egy bájt, ;* visszaküldi eggyel megnövelve. Beállítások: 9600, 8, N, 1 ;* Számolja a beérkezett karaktereket, minden adáskor negálja RB0-t ;**************************************************************************************** list p=18f452 include "p18f452.inc" ; A processzorfüggő deklarációkat tartalmazó include fájl #define Byte_count 0x60 Rst_vect ; Reset vektor, tápbekapcsoláskor, resetkor innen indul org 0x0000 ; a program végrehajtása goto Start Int_vect ; Megszakítás vektor. Ha engedélyezett megszakítás van, org 0x0008 ; innen folytatódik a program végrehajtása btfss PIE1, RCIE ; USART-tól jött a megszakítás? goto Other_Int ; Nem, máshonnan. btfss PIR1, RCIF ; USART-tól jött a megszakítás? goto Other_Int ; Nem, máshonnan. movlw 06h ; Vételi hiba ellenőrzése andwf RCSTA, W btfss STATUS, Z goto Rcv_Error ; Vételi hiba (túlfutási vagy kerethiba) incf Byte_count, 1 ; Vételi számláló növelése movf RCREG, W ; Vett adat beolvasása incf WREG ; Megnövelése movwf TXREG ; Adási regiszterbe töltése btg LATB, 0 ; Ha adunk, RB0-t invertáljuk goto ISR_End ; Vége a megszakítás kiszolgálásának Rcv_Error bcf bsf RCSTA, CREN ; A hibák törlése az USART ki/be kapcsolásával RCSTA, CREN 9/14
goto ISR_End ; Vége a megszakítás kiszolgálásának Other_Int goto Other_Int ; Mivel csak USART vételi megszakítása engedélyezett, és nem ; onnan jött megszakítás, ezért megszakítjuk a programvégrehajtás ; szekvenciáját ISR_End retfie ; Visszatérés a megszakításból. Start ; A program kezdete org 0x0050 clrf Byte_count bcf TRISB, 0 ; RB0 kimenet bcf LATB, 0 ; Állapota 0 bcf TRISC, 6 ; RC6/TX kimenet bsf TXSTA, BRGH ; Magas bitsebesség kiválasztása movlw.25 ; SPBRG feltöltése (9600bps 4MHz órajel esetén) movwf SPBRG ; Katalógus: 9600bps=4MHz/(16(SPBRG+1)), innen SPBRG=25 bsf bsf bsf RCSTA, SPEN ; Soros port engedélyezése RCSTA, CREN ; Folyamatos vétel engedélyezése TXSTA, TXEN ; Adás engedélyezése bcf PIR1, RCIF ; Vételi megszakítás törlése bsf PIE1, RCIE ; Vételi megszakítás engedélyezése bsf INTCON, PEIE ; Periféria megszakítások engedélyezése bsf INTCON, GIE ; Globális megszakítás engedélyezés Stop goto Stop ; Egyhelyben járás, várakozás megszakításra end A processzortípust állítsuk be a panelnek megfelelően (Configure Select Device, PIC18F452)! A működéshez szükséges módosítandó konfigurációs bit beállítások (Configure Configuration Bits): Oscillator: EC - OSC2 as RA6 Watchdog Timer: Disabled-Controlled by SWDTEN bit Low Voltage Program: Disabled (A konfigurációs bitek értelmezését a katalógusból, illetve a mérést előkészítő előadásokon ismerheti meg.) Fordítsuk le a projektet (Ctrl+F10)! Hibakereső eszközként állítsuk be az ICD2-t (Debugger Select Tool MPLAB ICD2)! Ha mindent jól csináltunk, az Output ablakban bejelentkezik az ICD2, és kiírja a csatlakoztatott processzor típusát. Esetleges hiba esetén az Output ablakban kiírt hiba javítása után újra megpróbálhatjuk a céleszközhöz való csatlakozást (Debugger Connect). Mivel hibakereséshez a célprocesszor erőforrásait is 10/14
használjuk, ezért le kell tölteni bele a programmemória tartalmát, és a konfigurációs bit beállításokat (Debugger Program). A programfuttatás során a szimulációnál megismert módon használhatóak a hibakereső (Debugger) menüpont futtatás (Run), animált futtatás (Animate), leállítás (Halt), lépj bele (Step Into), lépd át (Step Over), lépj ki belőle (Step Out), alaphelyzetbe állítás (Reset) parancsai. Szintén hasonlóan használhatóak a nézet (View) menüből bekapcsolható belső tartalmakat megjelenítő ablakai (például SFR-ek). A különbség az, hogy a valódi környezetben való futtatás miatt a programfuttatás eredményeit mind a mérőpanel megfelelő perifériáin, mind pedig a mikrovezérlőből kiolvasott regisztereken valósághűen (és nem szimuláltan) vizsgálhatjuk! Gondoljunk csak a külső eszközökkel való kommunikációra, időviszonyokra, stb.! (Fontos megemlíteni, hogy amikor a kódban egy regiszter fölé visszük az egérmutatót, vagy egy ablakban jelenítjük meg a regiszterek tartalmát, akkor az ICD2-n keresztül történik az adott regiszter beolvasása. Frissítése akkor történik, ha legalább egy utasítást végrehajtott az ICD2. Például hiába változik meg egy portláb állapota, az az MPLAB felületén csak akkor látható, ha legalább egy utasítás végrehajtása megtörténik.) A programot futtatva végezzük el annak vizsgálatát! A soros portra adatot küldeni, illetve a mikrovezérlő által küldött adatokat megjeleníteni pl. a Windowsban elérhető Hyperterminal programmal lehetséges. A Hyperterminal kezelését, beállításait a következőkben röviden ismertetjük. A program elindítása után (Windows 2000 vagy XP esetén: Start menü Minden program Kellékek Kommunikáció Hyperterminal) meg kell adnunk a kapcsolat nevét (pl. PICTEST). A felugró Csatlakozás ablakban válasszuk ki a használt soros portot (Csatlakozás ezzel, (pl.) COM2). A port tulajdonságai ablakban állítsuk be a kommunikáció jellemzőit (9600 bit/másodperc, 8 adatbit, paritásbit nincs, stop bitek száma 1, átvitelvezérlés nincs)! A karakteres adás/vétel jellemzőit a Fájl Tulajdonságok Beállítások ASCII Beállítások menüpont alatt végezhetjük el. Kapcsoljuk be a helyi visszhangot, majd OKval zárjuk be a nyitott ablakokat! A Hívás Hívás paranccsal kapcsolódhatunk rá a kiválasztott soros portra. Innentől kezdve a begépelt karakterek kikerülnek a soros portra, a beérkező karakterek pedig a terminál ablakban láthatóak. A kapcsolatot legegyszerűbben a program bezárásával szakíthatjuk meg. 11/14
A soros porti kommunikációt és az PORTB 0. bitjén elhelyezett LED működését figyelve egy kivételével minden funkciót le tudtunk ellenőrizni. A vételi számláló működését mivel ez egy adatregiszter külső vizsgálattal nem tudjuk ellenőrizni. Tartalmát megnézhetjük a fájlregiszterek ablakában, de pontos működéséről ez nem ad információt. Megoldásként elhelyezhetünk töréspontot az inkrementáló utasítás után, és a végrehajtást ilyen módon felfüggesztve vizsgálhatjuk, hogy növekszik-e a tartalma. Másik lehetőségként elhelyezhetünk egy fejlett töréspontot (Debugger Advanced Breakpoints ), vizsgálhatjuk, hogy az adott memóriacímen történik-e írás, vagy mondjuk n darab karakter beérkezése után n-nel növekedett-e a regiszter értéke. Ez utóbbihoz például a fejlett töréspontok ablakában be kell jelölni a töréspont a fájlregisztereken (Breakpoints is in File Registers) négyzetet, ekkor aktívvá válnak a további beállítási lehetőségek. Állítsuk be a vételi számláló címét (0x60 a File Register Address mezőben)! Ha például arra vagyunk kíváncsiak, hogy alapállapotból indulva pl. 4 karakter elküldése után a vételi számláló értéke 4-gyel növekedett-e, válasszuk ki a File Register Must be Equal to Following Value lehetőséget, és írjuk be a 0x04 értéket. Alaphelyzetbe állítás után, programfuttatás közben küldve a mikrovezérlőnek 4 karaktert, helyes működés esetén leáll a program futtatása, a számláló regiszterben pedig 0x04 érték található. 12/14
4. Mérési feladatok az I. méréshez 1. Írjon programot, amely megszakítással állít elő 1Hz-es időalapot PORTB 0. bitjére! Ellenőrizze a program működését ICD2-vel! 2. Írjon programot, amely a potenciométerről érkező analóg feszültséget megjeleníti a LED soron! Ellenőrizze a program működését ICD2-vel! 3. Írjon programot, amely 1kHz-es PWM jelet ad a hangszóró működtetéséhez! (Kiegészítő feladat: a hangmagasságot vagy a kitöltési tényezőt változtassa egy időzítő megszakításának ütemében!) Ellenőrizze a program működését ICD2-vel! 4. Oldja meg a mérésvezérlő által kiadott feladatot! 13/14
5. Mérési feladatok a II. méréshez 1. Tanulmányozza az LCD és a TC74 hőmérséklet érzékelő kezelésére írt mintaprogramokat ICD2 segítségével! 2. Készítsen visszaszámláló stoppert, amelynek időzítése S2-vel 10, 20 és 30s-ra állítható be, és S3-mal indítható el! Az LCD-n jelenítse meg a stopper aktuális értékét, az időzítés leteltekor pedig adjon hangjelzést! 3. Írjon programot, amely a potenciométer állását (0-255) kiírja a kijelzőre (esetleg kirajzolja karakter-grafikus formában), és az érték megváltozásakor elküldi soros porton is! 4. Írjon programot, amely a hőmérséklet érzékelő jelét 1s-onként elküldi a soros porton! 5. Oldja meg a mérésvezető által kiadott feladatot! 14/14