1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| //**********************************************
//** PIC 18F452 quartz 10Mhz + PLL = 40Mhz **
//** pilotage d'une LED avec un timer **
//**********************************************
//includes
//========
#include <p18f452.h> /* déclarations pour le PIC18F252 */
#include <timers.h> /* fonctions pour les timers */
// configurations des bits fusibles :
//===================================
#pragma config OSC = HSPLL // oscilateur à quartz 10 Mhz + PLL=40 MHZ
#pragma config PWRT = ON // power up timer
#pragma config BOR = OFF //brown out reset
#pragma config WDT = OFF // watchdog timer
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF //low voltage
// definitions des entrees sorties
//=================================
#define LED1 PORTAbits.RA0
// variables globales
//=====================
#define ON 1 // pour stocker l'etat de la led
#define OFF 0
int led_status;
int temporisation;
//Prototype des fonctions et interruptions
//========================================
void it_pulse (void);
// declaration de l'interruption pulse
//++++++++++++++++++++++++++++++++++++
//void it_pulse(void);
#pragma code adresse_it=0x08 // Adresse prioritaire pour utiliser l'interruption
void it_pulse (void)
{ _asm GOTO it_pulse _endasm } //on execute le code de it_pulse
#pragma code // retour à la zone de code
// ++++++++++++++++++++++++++++++
// sous programme d'interruption
// ++++++++++++++++++++++++++++++
#pragma interrupt it_pulse
{// traitement de l'interuption pulse
unsigned char sauv1;
unsigned char sauv2;
// on sauvegarde le contenu des registres de calcul
sauv1 = PRODL;
sauv2 = PRODH;
// c'est le Timer1 qui a levé l'interruption
if (PIR1bits.TMR1IF)
{
// on va réautoriser l'interruption
PIR1bits.TMR1IF = 0;
// ca y est on a attendu 2 500 000 cycles (0,25s)
if (temporisation >= 38)
{
// on remet à 0 pour le prochain timer
temporisation = 0;
// si la LED était allumée
if (led_status == 1)
{
// on l'éteint
LED1 = 0;
// stock le nouvel état de la LED
led_status = 0;
}
else // sinon la LED était éteinte
{
// on l'allume
LED1 = 1;
// stock le nouvel état de la LED
led_status = 1;
}
}
else // on n'a pas encore attendu 2 500 000 cycles
{
// on incrémente notre variable compteur
temporisation++;
}
}// fin du if
// on restaure les registres de calcul
PRODL = sauv1;
PRODH = sauv2;
}// fin de l'interuption
// fonction principale
//====================
void main (void)
{// debut main
temporisation=0; // RAZ tempo
TRISAbits.TRISA0=0; // On configutre le port RA0 en sortie
LED1=0; // On verifie led eteinte
led_status=0;
// on créer le timer
OpenTimer1(TIMER_INT_ON
& T1_16BIT_RW
& T1_SOURCE_INT
& T1_PS_1_1
& T1_OSC1EN_OFF
& T1_SYNC_EXT_OFF);
INTCONbits.GIE = 1;// On autorise toutes les interruptions
INTCONbits.PEIE = 1;
while (1) //boucle infinie
{}
}//fin main |
Partager