Bonjour, voila j'ai effectuée un source en C pour la gestion du temps avec le TIMER1 du PIC18F4431 et un oscillateur de 32768Hz. Je souhaite à présent savoir si mon source est correct et avoir une aide pour le tester en allumant une led en fonction des secondes, et une autres en fonction des minutes. Merci de votre aide
Voici le programme :
/* Un timer gère le temps par Interuptions */
#include <p18f4431.h> // déclarations pour le PIC18F4431
#pragma config OSC=HS
#pragma config LVP=OFF
#pragma config DEBUG=ON
#pragma interrupt MyInterrupt
void MyInterrupt(void);
// on déclare que lors d'une interruption
#pragma code highVector=0x008
void atInterrupthigh(void)
{
// on doit éxecuter le code de la fonction MyHighInterrupt
_asm GOTO MyInterrupt _endasm
}
#pragma code // retour à la zone de code
void Init_Timer1(void);
void Init_Port(void);
void main (void)
{
Init_Timer1();
Init_Port();
while (1) {
// traitement principal
}
}
void Init_Timer1(void)
{
// Débordement toutes les 1 secondes
TMR1H = 0x80;
TMR1L = 0x00;
// Configuration du Timer pour oscilleur externe, prescale de 1
// synchronisation sur oscillateur externe
T1CON=0b00001111;
// Flag à 0
PIR1bits.TMR1IF = 0;
// active le debordement par interuptions
PIE1bits.TMR1IE = 1;
// Haute priorité
IPR1bits.TMR1IP = 1;
// On autorise toutes les interruptions
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
}
void Init_Port(void)
{
// on configure le pin 0 du port C en entrée (oscillateur externe)
TRISCbits.TRISC0 = 1;
TRISCbits.TRISC1 = 1;
TRISA= 0x00;
}
volatile unsigned secondes, minutes, heures;
void MyInterrupt(void)
{
if (PIR1bits.TMR1IF)
{
secondes++; // Incrementation des secondes
if (secondes > 59) // 60 secondes ?
{
secondes = 0;
minutes++; // Incrémentation des minutes
}
if(minutes > 59) //60minutes ?
{
minutes = 0;
heures++; // Incrémenation des heures
}
if (heures > 12) //Ne pas utiliser les 24H
heures = 1;
TMR1H |= 0x80; //Réinitialistion du Timer1
PIR1bits.TMR1IF = 0; //Effacer le Flag
}
}
-----