Ebben a leckében átnézzük kicsit a Config Biteket, és beállításuk módját a forráskódban, továbbá megnézzük, hogyan használhatunk késleltetést egy LED villogtatásához, beépített könyvtárakkal.
A lecke fájljai: ITT.
Pontosabban:
- Már létező projekt megnyitását a File>Open Workspace menüponttal MPLAB IDE-ben.
- A Configuration Bitek beállítását, mellyel a mikrovezérlőnk különböző funkcióit kapcsolhatjuk be és ki.
- Az alap MPLAB C fordító könyvtárainak, funkcióinak használatát (A DS51297 jelzésű "MPLAB C18 Compiler Libraries" pdf-ben többet is olvashatunk erről).
- Késleltetés használatát időzítésre szoftveres loopokkal.
A 2. lecke projektjének megnyitása MPLAB IDE-ben:
Ez, és a következő leckék már rendelkeznek projekt és munkaterület fájlokkal. A 2. lecke munkaterületének megnyitásához a File>Open Workspace menüpontot válasszuk ki. Tallózzunk a tananyag mappájába, keressük meg a 02 Blink LED/02 Blink LED.mcw fájlt.
Egy munkaterület megnyitása előtt az MPLAB rákérdez, hogy szeretnénk-e menteni a jelenlegi projektünket. Általában ez egy jó döntés, úgyhogy kattintsunk a "Yes"-re! Ezek után megnyílik a 2. lecke munkaterülete.
Config Bitek:
Ezek az egyfajta "biztosítékok" beállítják a vezérlőnk különböző működési paramétereit, például a belső oszcillátor használatát, alap, vagy kiterjesztett címzési módot, az alacsony feszültségű Resetet, és annak feszültségküszöbét, A WatchDog Timert, és részleteit, illetve a kód védelmét is, sok más beállítás mellett.
Néhány funkciót, mint pl. a WatchDog Timert beállíthatjuk úgy, hogy SFR-en szoftveresen kapcsolhassuk be és ki, miközben fut a programunk. A PIC18F45K20 Config Bitjeinek részletes leírásáért nézd meg az adatlap 23. szekcióját!
A kettes leckében minden Configuration Bitet a 02 Blink LED.c forrásfájl elején fogunk beállítani:
/** C O N F I G U R A T I O N B I T S ******************************/
#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF // CONFIG1H
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30 // CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768 // CONFIG2H
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC // CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF // CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L
#pragma config CPB = OFF, CPD = OFF // CONFIG5H
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L
#pragma config EBTRB = OFF // CONFIG7H
A Konfigurációs Biteket a #pragma config szekcióban állíthatjuk be. Az alkalmazott nevek, attribútumok változhatnak vezérlőnként, attól függően, hogy támogatja-e azt a PICünk, vagy sem. Az elérhető beállítások megtalálhatóak az MPLAB IDE súgófelületén, lássuk, mit is állíthatunk a mi PICünkön:
- Válasszuk ki a Help>Topics menüpontot!
- Az "MPLAB IDE Help Topics" ablakban kattintsunk a "Language Tools" kategóriára, és válasszuk a "PIC18 Config Settings"-et. Kattintsunk az Ok-ra.
- Amikor megnyílik a súgóablak, kattintsunk a "Contents" fülre, és nyissuk ki a "Configuration Settings" részt.
- Válasszuk ki a PIC18F45K20 mikrovezérlőt, hogy láthassuk, milyen beállításokat adhatunk meg a #pragma config szekcióban!
Ehhez a leckéhez a következő beállítások fontosak (eltérnek az alapbeállítástól):
FOSC = INTIO67
Ezzel belső oszcillátor módba állítjuk a PICet, így nincs szükség külső kvarcra. Az alapértelmezett frekvencia 1 MHz, a többi lehetséges értékre a 9. leckében térünk ki. Ezzel a beállítással kiválasztjuk továbbá, hogy az OSC1, OSC2 lábak inkább az RA6, RA7 portlábak legyenek, mivel most nem kell kivezessük az oszcillátort.
WDTEN = OFF
Ezzel kikapcsoljuk a WatchDog Timert, aminek funkciója, hogy periodikusan törölni kell a szoftverünkben, különben újraindítja a mikrovezérlőt.
LVP = OFF
Ezzel kikapcsoljuk a Low Voltage Programming funkciót, és felszabadítjuk a PGM lábat, hogy RB5 I/O láb lehessen (A PICkit3 nem használ LVP módot).
Noha minden más beállítást alapértéken hagytunk, ajánlatos mindet megadni a forrásfájl elején, a biztonság kedvéért. Ezzel biztosítjuk, hogy a lefordított .hex fájlunkban található programmemória kép tartalmaz minden szükséges elemet a normális működéshez. Az egyetlen kivétel a DEBUG bit, melyet az MPLAB IDE környezetében állítunk be, attól függően, hogy Debug módban fut-e a vezérlőnk, vagy sem.
Lássuk a forráskódot!
Nyisd meg a 2. lecke forrását (02 Blink LED.c) az MPLAB IDE szerkesztőjében, ha még nem tetted!
/** I N C L U D E S **************************************************/
#include "p18f45k20.h"
#include "delays.h"
/** D E C L A R A T I O N S *******************************************/
void main (void) {
TRISD = 0b01111111;
// PORTD 7-es láb kimenet (0) ; 6:0 láb bemenet (1)
while (1) {
LATDbits.LATD7 = ~LATDbits.LATD7; // LATD onmaga ellentettje
Delay1KTCYx(50); // Delay: 50 x 1000 = 50,000 ciklus; 200ms @ 1MHz
}
}
Ez a forrás tartalmaz egy-két új elemet, amit nem ismerünk. Rögtön az első ilyen az
amely az MCC18 egyik beépített header fájlja, és segítségével rávehetjük a programunkat, hogy üres ciklusokat számoljon. Az MPLAB C fordító több ilyen hasznos könyvtárt tartalmaz, mint pl. az stdio, stdlib, és funkciókat, mint a ctype, delays, math vagy string.
Vannak továbbá periféria-kezelő könyvtárak, pl. adc, i2c, pwm, spi, usart, timers, és ezek némelyikének szoftveres emulációja, mint a sw_i2c, sw_uart, vagy az sw_spi.
Ezeket a header fájlokat megtalálod az MCC18/h könyvtárban, a forrásukat az src tartalmazza, a könyvtárak maguk pedig a lib-ben vannak. További részletekért ajánlom az "MPLAB C18 Compiler Libraries" pdf-et (DS51297)!
Van még egy új sorunk, amit nem tárgyaltunk ki, a:
Ez a függvényhívás a delays könyvtárból való, segítségével szoftveresen késleltetünk 1000 utasításnyi időt (TCY). A függvény paramétere ezt az 1k utasítást szorozza meg. Ebben az esetben ez a szám 50, tehát 50 * 1000 = 50000 utasítást késleltetünk. A PIC18F család végrehajtási sebessége 1/4-e az oszcillátor frekvenciájának, vagyis 4 órajel szükséges egy utasítás végrehajtásához. Jelenleg a belső órajelünk 1 MHz, tehát a végrehajtás 250kHz sebességű, avagy TCY = 4 us utasításonként. Így a teljes késleltetés 50000 * 4 us = 200 ms, ami elég lassú ahhoz, hogy az emberi szem érzékelje a LED ki és bekapcsolását.
A példaprogram ezt a késleltetést egy végtelen while ciklusban hívja meg, amely az RD7 láb értékét mindig ellentettjére változtatja 200 ms késleltetéssel. Így villog a 7-es LEDünk a Demópanelen.
Fordítsuk le és égessük be a példaprogramot a vezérlőnkbe! Ha még nem tettük, adjunk tápot a panelnek az előző leckében tanult módon, különben nem tudunk programozni. Programozás után láthatjuk, hogy 200 ms-onként váltva, villog a LEDünk!
A továbbiakban ennél komplexebb műveleteket is végrehajtunk, 2-3 lecke múlva egy igazi Knight Rider villogó már senkinek nem okozhat gondot!
HÁZI FELADAT: Változtassuk a késleltetés értékét mindkét irányba! Próbáljuk ki, milyen, amikor másodpercenként villog a LED, és állítsuk minél gyorsabbra! Kinek milyen gyors a szeme, milyen frekvenciát lát még villogásnak?
Folytatása következik!
Forrás:
Microchip PICkit™ 3 Debug Express: PIC18F45K20 – MPLAB® C Lessons