[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