[elektro] Mikroelektronika C-ben timer használat

Moravcsik Szilárd mszilard at contarex.hu
Tue Jun 7 08:40:16 CEST 2011


2011.06.06. 21:03 keltezéssel, Kovács Kenéz  írta:
> Hali!
>
> Van Valaki aki mikroe C-t használ és segítene a timer használatban ?

Szia!

Egy működő projektből kimásoltam (és egyszerűsítettem) a 
legfontosabbakat. A chip: PIC12F617, belső 8 MHz RC oszcillátorral.

Többek között ADC-t, komparátort, két timert (TMR0 és TMR1) és persze 
I/O portokat is használ ez a 8 lábú kis kontroller a tényleges 
feladatban. :)

Az alább látható a forrás:


//******************************************************************************
// A PROGRAM KEZDETE:
//******************************************************************************
#include <built_in.h>            // Ez kell!

//------------------------------------------------------------------------------
// Konstans deklarációk:
//------------------------------------------------------------------------------
#define DI   INTCON.GIE = 0      // Globális IRQ tiltása
#define EI   INTCON.GIE = 1      // Globális IRQ engedélyezése


//------------------------------------------------------------------------------
// Interrupt kiszolgáló rutin:
//------------------------------------------------------------------------------
void interrupt( void ){
   //
   // itt egyéb IRQ forrás kiszolgálása (prioritás szerint), ha kell:
   //
   // TMR0 megszakítás:
   // -----------------
   if(INTCON.T0IF){                   // Ha TMR0 overflow:
     TMR0        = T0_START_VAL;      // TMR0 újrahúzása
     //
     // ide jön a tényleges feladat
     //
     INTCON.T0IF = OFF;               // TMR0 IRQ flag törlése
   }
   //
   // itt egyéb IRQ forrás kiszolgálása (prioritás szerint), ha kell:
   //
}

//------------------------------------------------------------------------------
// TMR0 inicializálása:
//
// FIGYELEM!
// Az inicializálást tiltott globális interrupttal kell elvégezni.
// Erről a hívó függvénynek kell gondoskodnia!
//------------------------------------------------------------------------------

void init_tmr0( void ){
   OPTION_REG &= 0b10000000;      // Korábbi beállítások törlése
   OPTION_REG |= 0b00000110;      // Előosztó: 128 (15625Hz lesz)

   TMR0        = T0_START_VAL;    // TMR0 innen indul

   INTCON.PEIE = ON;              // Periféria IRQ engedélyezve

   INTCON.T0IE = OFF;             // TMR0 IRQ tiltva
   INTCON.T0IF = OFF;             // TMR0 IRQ flag törlése
}


//==============================================================================
// Főprogram:
//==============================================================================
void main( void ){
   DI;				 // Globális IRQ tiltása
   init_tmr0();                   // TMR0 inicializálás
   EI;				 // Globális IRQ engedélyezése

   while( 1 ){                    // Végtelen ciklus
     // Feladatok, szükség szerint
   }
}
//******************************************************************************
// A PROGRAM VÉGE
//******************************************************************************

Üdv:
Szilárd



More information about the Elektro mailing list