Hibakeresés MPLAB ICD2 segítségével I-II. Írta: Molnár Zsolt
BMF KVK MAI
2007. szeptember 20.
1/14
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
Tápcsatlakozó
LCD kijelző
RS232 port
EEPROM
ICD csatlakozó
Hangszóró
Hőmérsékletérzékelő
Nyomógombok
6/14
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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" #define Byte_count Rst_vect org
; A processzorfüggő deklarációkat tartalmazó include fájl
0x60
0x0000
; Reset vektor, tápbekapcsoláskor, resetkor innen indul ; a program végrehajtása
goto
Start
org
0x0008
; Megszakítás vektor. Ha engedélyezett megszakítás van, ; innen folytatódik a program végrehajtása
btfss goto btfss goto
PIE1, RCIE Other_Int PIR1, RCIF Other_Int
; USART-tól jött a megszakítás? ; Nem, máshonnan. ; USART-tól jött a megszakítás? ; Nem, máshonnan.
movlw andwf btfss goto
06h RCSTA, W STATUS, Z Rcv_Error
; Vételi hiba ellenőrzése ; Vételi hiba (túlfutási vagy kerethiba)
incf movf incf movwf btg goto
Byte_count, 1 RCREG, W WREG TXREG LATB, 0 ISR_End
; Vételi számláló növelése ; Vett adat beolvasása ; Megnövelése ; Adási regiszterbe töltése ; Ha adunk, RB0-t invertáljuk ; Vége a megszakítás kiszolgálásának
Int_vect
Rcv_Error bcf bsf
RCSTA, CREN ; A hibák törlése az USART ki/be kapcsolásával RCSTA, CREN
9/14
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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 clrf bcf bcf bcf
0x0050 Byte_count TRISB, 0 LATB, 0 TRISC, 6
; RB0 kimenet ; Állapota 0 ; 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 bsf bsf bsf
PIR1, RCIF PIE1, RCIE INTCON, PEIE INTCON, GIE
goto
Stop
Stop
; Vételi megszakítás törlése ; Vételi megszakítás engedélyezése ; Periféria megszakítások engedélyezése ; Globális megszakítás engedélyezés ; 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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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
PIC18 hibakeresés MPLAB ICD2-vel I.-II.
BMF KVK MAI
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