Bonjour, je suis nouveau dans ce forum, et nouveau avec les Pic.
Je lie un livre en anglais sur le sujet,avec des examples, et j'essaye d'aller plus loin que les exercices du livres.
Mon obectif en ce moment est de creé un chronomètre où :
L'utilisateur doit pouvoir faire "reset" redémarrer le système en utilisant un interrupteurs "switch" ou combinaison de 2 interrupteurs.
L'utilisateur doit pouvoir demarrer le système en utilisant un des interrupteurs
L'utilisateur doit pouvoir arréter le système en utilisant un interrupteur
et ainsi successivement (comme un vrai chronomètre sportif)
En ce moment je n'arrive qu'a le faire arreter (rien de plus). Les maximum ce chronomètre devrais conter est 9.59.9
Je voudrais peut-être « élargir » vers 23.59.59… mais cela est moins importants pour moi pour le maintenant
Le "Input capture" m'embrouille un peu.
Merci d'avance pour votre aide.
le circuit:
le code principale:
#include <p24fj128ga010.h>
#include "main.h"
_CONFIG2( FNOSC_FRCPLL & OSCIOFNC_OFF ); //Oscillateur interne- 4xPLL donnant 16 MIPS
// borne RC15 posséde l'oscillateur
//Prototypes de fonction
extern void update_display(const unsigned int min, const unsigned int dix, const unsigned int unite, const unsigned int dixieme);
extern unsigned int poll_switch_SW3();
//Global variables
unsigned int minutes; //Minutes - pour L'ecran électrique 0
unsigned int units; //Secondes (dix) - pour L'ecran électrique 1
unsigned int tens; //Secondes (unite) - pour L'ecran électrique 2
unsigned int tenths; //Dixieme de seconde - pour L'ecran électrique 3
unsigned int displayOn=0; //Interrupteur pour allumer ou fermer L'ecran électrique - partagé par deux routines d'ISR
unsigned int IC1BUFFERVAL; //Utiliser pour lire IC1 "timer buffer"
io_port_A *display = (io_port_A*)&LATA; //Adresse de la sortie du "latch"(qui se relie au PORTA) - il est PLUS SÛR d'écrire vers le "latch"
io_port_A *inputs = (io_port_A*)&PORTA; // Adresse de PORTA (On ne peu pas lire du LATA)
//Code Principal
int main()
{
//Configurez le dispositif pour utiliser l'oscillateur interne
OSCCONbits.COSC = 1u; // Oscillateur interne avec PLL
CLKDIVbits.RCDIV = 0u; // Oscillateur interne non divisé (8MHz)
CLKDIVbits.DOZEN =0; // aucune extensibilité
CLKDIVbits.DOZE =0; //
//Cunfigurer les "ports"
TRISA = 0x00F0; //les 4 moins significatif et les 8 bits lesplus significatifs sont des sorties digitaux
LATA = 0x0000; //Ecrire un zero a PORTA a travers le "latch"
//initialisation des variables et des ecrans électriques
minutes = 0;
unites = 0;
dix = 0;
dixiemes = 0;
update_display(1,2,3,4);
update_display(minutes, dix, unites, dixiemes);
//TIMER1 Configuration du Régistre
T1CON = 0;
T1CONbits.TCKPS = 0b11; //Prescale = 256
T1CONbits.TON = 1; //Timer on
TMR1 = 0; //Redémarre "Timer Counter"
//Configure TIMER1 interrupt
_T1IP = 4; //priorité d'interruption = 4
PR1 = 6250-1; //registre de period- configurer pour 0.1s
_T1IF = 0; //dégagé le "timer interrupt" flag
//Configuration du (IC1)
_IC1IP = 4; //fix la priorité de l'intérrupteur pour le "Input Capture"
_TRISD9 = 1; //fix RD8 comme une entrée
IC1CON = 0x0002; //registre InputCaptureCONfiguration - bord en chute
_IC1IF = 0; //Redémarre le "Input Capture 1 Interrupt Flag"
//ENABLE INTERRUPTS
_IC1IE = 1; //Fix le "Input Capture 1 Interrupt Enable"
_T1IE = 1; //Allume le "timer 1 interrupt enable"
//boucle mère
while (1)
{
Idle(); //Éteindre "main core" -Continuation des Périphériques informatiques
asm("nop"); //Réveillé par l'interrupteur (TIMER 1 ou INPUT CAPTURE 1)
update_display(minutes, dix, unites, dixiemes);
} //fin de "while"
return 0;
}
//****************************** ****************************** ************
//********************* INTERRUPT SERVICE ROUTINES (ISR)****************
//****************************** ****************************** ************
//ISR Pour le Compteur
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt()
{
//Incrémentez le compteur sur chaque interruption
dixieme++;
//Mise à jour minutes, dix, unites and dixiemes pour l'écran élèctrique (BCD)
//Vérifiez pour un dépassement - ondulez au prochain chiffre
if (dixieme == 10) {
dixieme = 0;
unites++;
}
if (unites == 10) {
unites = 0;
dix++;
}
if (dix == 6) {
dix = 0;
minutes++;
}
if (minutes == 10) {
minutes=0;
}
//Redémarrer le" interrrupt flag" avant de retourné
_T1IF = 0;
}
//ISR pour le "INPUT CAPTURE"
void __attribute__((interrupt, no_auto_psv)) _IC1Interrupt()
{
IC1CON = 0x0002;
T1CON = poll_switch_SW3;
//Lire le tampon du IC1
IC1BUFFERVAL = IC1BUF; //Celle ci est nécessaire pour empêcher le débordement du Tampon
_IC1IF = 0; //Redemarer le "interrupt flag"
}//
-----