Fórum témák

» Több friss téma
Cikkek » PIC programozás C nyelven - CCS - I. lecke
PIC programozás C nyelven - CCS - I. lecke
Szerző: deguss, idő: Jan 28, 2007, Olvasva: 64375, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   3 / 4

Természetesen egy ilyen egyszerű paranccsal nem lehet sok mindent csinálni, egy komoly program megírásához ennél több minden szükségeltetik. A következőkben bemutatok pár általános dolgot.
Az összes elérhető függvény leírását megtaláljátok a feltelepített CCS Compiler könyvtárában, vagy itt.

Timer modulok használata

Mikrokontrollertől függően 3, 4 vagy esetleg 5 timer modul is rendelkezésünkre áll.
Pl. A TIMER_0 modul 8 bites, 1:1-től 1:256-os előosztóval rendelkezik, a TIMER_1 modul pedig 2×8 bites, 1:1-től 1:8-as előosztóval rendelkezik. Ez alapján kell konfigurálni őket.

C nyelven a timereket mindig initializálni (beállítani) és engedélyezni kell. Ezen túl, bármely timer/counter használata előtt engedélyezni kell a Global Interrupts bitet.

Így néz ki a program fejléce:

  1. #include <16F876A.h>
  2. #zero_ram
  3. #fuses HS,NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP
  4. #use delay(clock=12000000)
  5. #define XTAL_FREQUENCY  12000000 //kristály frekvenciája Hertzben
  6. #define TIMER1_FREQUENCY (XTAL_FREQUENCY / 4)
  7. int32 Ticker;
  8.  
  9. // ide jön majd az ISR és az inits() függvény. lsd. lentebb
  10.  
  11. //===========================================================================
  12. void main() {
  13. //===========================================================================
  14.         inits();
  15.         while(1){
  16.                 ; //semmit nem csinál!
  17.         }
  18. }

Az inits() függvény, és benne a Global Interrupts bit engedélyezése

  1. //===========================================================================
  2. void inits(void){
  3. //===========================================================================
  4.         set_TRIS_A( 0xFF );             //0=kimenet, 1=bemenet 
  5.         set_TRIS_B( 0x01 );             //RB0-ára van kötve egy LED
  6.         Ticker = TIMER1_FREQUENCY;
  7.         setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 );
  8.         enable_interrupts( INT_TIMER1 );
  9.         enable_interrupts( GLOBAL );
  10. }

És végül az Interrupt Service Routine (ISR), ami a TIMER1 regisztereinek (TMR1H,TMR1L) túlcsordulásakor hajtódik végre. A Compiler maga törli a megfelelő biteket, menti az akku tartalmát, hogy nekünk ne legyen már gondunk semmire. Ha lefutott az ISR, a processzor ott folytatja a munkáját, ahol abbahagyta.
FIGYELEM! Az ISR "függvényben" a lehető legkevesebbet csináljuk, csak az épp szükséges változókat inc/decrementáljuk, vagy állítsunk jelzőbiteket, amit a főprogramből kérdezünk le.

  1. //===========================================================================
  2. #int_TIMER1
  3. void TIMER1_isr(){
  4. //=================== halál pontos 1 mp-es időzítő ==========================
  5.         Ticker -= 65535;
  6.         if ( Ticker < 65536 ) {
  7.                 Ticker += TIMER1_FREQUENCY;
  8.                 output_toggle(PIN_B0);
  9.         }
  10. }

Ez így néz ki:


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 4
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem