Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
[Programmation] La gestion de Fonction
- Gérard
Expert- Messages : 1653
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
HVDifusion a écrit :Yop,
Voila j'ai pu faire des testes sur le programme.
Première chose ton ANSEL marche pas et le ANSELH non plus,je sais pas pourquoi.
...
Es-tu sûr que le registre ANSEL existe dans ton PIC?
[Programmation] La gestion de Fonction
-
HVDifusion
Débutant- Messages : 43
- Enregistré en : décembre 2015
Bonjour,
Désolé du retard,la semaine je travaille et donc pas trop le temp.
Voila mon rapport de teste :
-J'ai changé tous les nom "timer" par "compteur" qui aurais pu posé le problème.
-J'ai Mit (voir le code) la LED Debug dans le "IF" du compteur qui incrémente la variable "chrono" toute les seconde.
-J'ai mit une boucle "FOR" pour switch la LED a intervale dans la partie "Attente de 15 minutes".
Voici le code modifié :
Résultat du teste :
-La LED Debug ne clignote pas dans le IF du compteur.
-La LED Debug ne clignote pas dans la partie "Attente de 15 minutes"
Donc il semblerais que le programme ne rentre pas dans la partie 15 minutes quand le pontage est retiré (voltcheck = 0) et que le décompte de la variable compteur via le timer0 ne se fait pas.
Cordialement.
Désolé du retard,la semaine je travaille et donc pas trop le temp.
Voila mon rapport de teste :
-J'ai changé tous les nom "timer" par "compteur" qui aurais pu posé le problème.
-J'ai Mit (voir le code) la LED Debug dans le "IF" du compteur qui incrémente la variable "chrono" toute les seconde.
-J'ai mit une boucle "FOR" pour switch la LED a intervale dans la partie "Attente de 15 minutes".
Voici le code modifié :
Code : Tout sélectionner
// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4
// Set Variable
unsigned int compteur, chrono, pause1heure, pause15minutes, alarme3minutes , i ;
void interrupt()
{
if (INTCON.T0IF == 1) // If TMR0 Overflowing
{
INTCON.T0IF = 0; // Réarmement du flag
TMR0 = 100; // Offset du timer0
compteur++; // 10ms time incrémente
if (compteur >= 100) // 1 seconde d'écoulée
{
Debug =~ Debug; // LED d'activitée
chrono++; // On icrémente le chrono
compteur = 0; // On raz time
Debug = 0;
}
}
}
void main()
{
PORTB = 0; // PORTB en digital
TRISB = 0b00000100; // RB1 Out RB2 IN
PCON.B3 = 1; // 4Mhz oscillator
// configuration TIMER0
OPTION_REG = 0b10000101; // pull up disable,presc 1:64
TMR0 = 100;
INTCON = 0x80; // GIE activé, l'INT timer0 n'est pas encore activée
// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = compteur = i = 0 ;
Signal = 0;
for (i=0; i<=5; i++)
{
Signal =~ Signal; // on inverse la led
delay_ms (350);
}
while(1){
//------------------------------------------------------------------------------
if (VoltCheck == 1) // Contact maintenu
{
pause1heure = pause15minutes = alarme3minutes= chrono = compteur = 0 ;
T0IE_bit = 0; // On arrete le chrono
}
else
{
delay_ms(10); // Pause antirebond
if (VoltCheck==0 && pause1heure==0 && pause15minutes==0)
{
delay_ms(200); // Pause detection d'impulsion
if (VoltCheck == 1) // C'était juste une impulsion
{
pause1heure = 1; // On fait une pause d'une heure
}
else // Le contact est toujours pas maintenu
{
pause15minutes = 1; // On attend 15 minutes
}
chrono = 0;
compteur = 0;
T0IE_bit = 1; // On lance le chrono
}
}
}
//------------------------- ATTENTE 1 HEURE --------------------------------
if ( pause1heure == 1 && chrono >= 60) // l'attente d'une heure est finie
{
pause1heure = 0; // On arrete la pause d'une heure
T0IE_bit = 0; // On arrete le chrono
}
//------------------------- ATTENTE 15 MINUTES -----------------------------
if ( pause15minutes == 1 && chrono >= 15) // l'attente d'une heure est finie
{
for (i=0; i<=5; i++) // LED d'activitée clignotement
{
Debug =~ Debug;
delay_ms (150);
}
pause15minutes = 0; // On arrete la pause 15 minutes
alarme3minutes = 1; // On active l'alarme pour 3 minutes
Signal = 1; // On active l'alarme
chrono = 0; // RAZ du chrono
compteur = 0; // RAZ de l'offset
T0IE_bit = 1; // On lance le chrono
}
//------------------------- ATTENTE 3 MINUTES ------------------------------
if (alarme3minutes = 1 && chrono>=3) // au bout des trois minutes
{
alarme3minutes = 0; // On arrete l'alarme des 3 minutes
Signal = 0 ; // On éteint l'alarme
T0IE_bit = 0; // On arrete le chrono
}
}
Résultat du teste :
-La LED Debug ne clignote pas dans le IF du compteur.
-La LED Debug ne clignote pas dans la partie "Attente de 15 minutes"
Donc il semblerais que le programme ne rentre pas dans la partie 15 minutes quand le pontage est retiré (voltcheck = 0) et que le décompte de la variable compteur via le timer0 ne se fait pas.
Cordialement.
[Programmation] La gestion de Fonction
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ,
Je penche pour un probléme de Timer0 !
A mon avis l'Interruption ne fonctionne pas ou mal .
On va juste faire clignoter une led avec le compteur pour voir !
Je penche pour un probléme de Timer0 !
A mon avis l'Interruption ne fonctionne pas ou mal .
On va juste faire clignoter une led avec le compteur pour voir !
Code : Tout sélectionner
// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4
// Set Variable
unsigned int compteur, chrono, pause1heure, pause15minutes, alarme3minutes , i ;
void interrupt()
{
if (INTCON.T0IF == 1) // If TMR0 Overflowing
{
INTCON.T0IF = 0; // Réarmement du flag
TMR0 = 100; // Offset du timer0
compteur++; // 10ms time incrémente
if (compteur >= 100) // 1 seconde d'écoulée
{
Debug =~ Debug; // LED d'activitée
chrono++; // On icrémente le chrono
if (chrono>1)chrono=0;
compteur = 0; // On raz time
Debug = 0;
}
}
}
void main()
{
PORTB = 0; // PORTB en digital
TRISB = 0b00000100; // RB1 Out RB2 IN
PCON.B3 = 1; // 4Mhz oscillator
// configuration TIMER0
OPTION_REG = 0b10000101; // pull up disable,presc 1:64
TMR0 = 100;
INTCON = 0x80; // GIE activé, l'INT timer0 n'est pas encore activée
// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = compteur = i = 0 ;
Signal = 0;
for (i=0; i<=5; i++)
{
Signal =~ Signal; // on inverse la led
delay_ms (350);
}
T0IE_bit = 1; // On lance le chrono
while(1){
if (chrono==1)
{
Debug=1;
}
else
{
Debug=0;
}
}
}
[Programmation] La gestion de Fonction
-
HVDifusion
Débutant- Messages : 43
- Enregistré en : décembre 2015
[Programmation] La gestion de Fonction
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Ok, nickel c'est déjà une bonne chose.
Alors on va y aller étape par étape et rajouter les fonctions unes à une !
Avec ceci, la led devrait clignoter quand voltchechk = 0 et s'arreter ( allumée ou éteinte) quand voltcheck = 1
Il faut que tu avacne comme ca, petit à petit.
Alors on va y aller étape par étape et rajouter les fonctions unes à une !
Avec ceci, la led devrait clignoter quand voltchechk = 0 et s'arreter ( allumée ou éteinte) quand voltcheck = 1
Il faut que tu avacne comme ca, petit à petit.
Code : Tout sélectionner
// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4
// Set Variable
unsigned int compteur, chrono, pause1heure, pause15minutes, alarme3minutes , i ;
void interrupt()
{
if (INTCON.T0IF == 1) // If TMR0 Overflowing
{
INTCON.T0IF = 0; // Réarmement du flag
TMR0 = 100; // Offset du timer0
compteur++; // 10ms time incrémente
if (compteur >= 100) // 1 seconde d'écoulée
{
Debug =~ Debug; // LED d'activitée
chrono++; // On icrémente le chrono
if (chrono>1)chrono=0;
compteur = 0; // On raz time
Debug = 0;
}
}
}
void main()
{
PORTB = 0; // PORTB en digital
TRISB = 0b00000100; // RB1 Out RB2 IN
PCON.B3 = 1; // 4Mhz oscillator
// configuration TIMER0
OPTION_REG = 0b10000101; // pull up disable,presc 1:64
TMR0 = 100;
INTCON = 0x80; // GIE activé, l'INT timer0 n'est pas encore activée
// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = compteur = i = 0 ;
Signal = 0;
for (i=0; i<=5; i++)
{
Signal =~ Signal; // on inverse la led
delay_ms (350);
}
while(1){
//------------------------------------------------------------------------------
if (VoltCheck == 1) // Contact maintenu
{
pause1heure = pause15minutes = alarme3minutes= chrono = compteur = 0 ;
T0IE_bit = 0; // On arrete le chrono
}
else
{
T0IE_bit = 1; // On lance le chrono
}
if (chrono==1)
{
Debug=1;
}
else
{
Debug=0;
}
}
[Programmation] La gestion de Fonction
-
HVDifusion
Débutant- Messages : 43
- Enregistré en : décembre 2015
Salut,
Oui ça marche aussi mais ça m'étonne pas j'avais déjà fait ce teste.
J'avais tous tester en déplaçant ma LED debug dans chaque section pour voir si le programme rentrais bien dedans.
Référence a ceci :
Oui ça marche aussi mais ça m'étonne pas j'avais déjà fait ce teste.
J'avais tous tester en déplaçant ma LED debug dans chaque section pour voir si le programme rentrais bien dedans.
Référence a ceci :
HVDifusion a écrit :Yop,
Voila j'ai pu faire des testes sur le programme.
Première chose ton ANSEL marche pas et le ANSELH non plus,je sais pas pourquoi.
Ensuite j'ai rajouté une LED qui s'appel dans le programme (Debug) et je l'ai branché sur RB4 qui étais libre.
J'ai mit la LED dans les différente sections du programme et voici le rapport :
-Voltcheck = 1 (ok)
-Voltcheck = 0 (ok)
-Teste Voltcheck = 0 (impulsion/coupure ?) impulsion (ok),coupure (ok)
-ATTENTE 3 MINUTES , ATTENTE 15 MINUTES et ATTENTE 1 HEURE (aucune réaction de la led)
-Teste T0IF TMR0 (décompte ok)
Voila j'ai voulus faire simple et court pour évité toute confusion.
[Programmation] La gestion de Fonction
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Plus complexe :
J'ai créer une fonction qui fait clignoter la led, suivant la valeur du chrono.
Maintenant on rentre dans la fonction 15minutes ( qui dure en fait 15 secondes) pendant les 15 secondes la led doit clignoter a la fin des 15secondes elle s’arrête.
Je travaille sans filet , il peut y avoir des petites erreurs de compilateur ( je suis avec notepad la)
J'ai créer une fonction qui fait clignoter la led, suivant la valeur du chrono.
Maintenant on rentre dans la fonction 15minutes ( qui dure en fait 15 secondes) pendant les 15 secondes la led doit clignoter a la fin des 15secondes elle s’arrête.
Je travaille sans filet , il peut y avoir des petites erreurs de compilateur ( je suis avec notepad la)
Code : Tout sélectionner
// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4
// Set Variable
unsigned int compteur, chrono, pause1heure, pause15minutes, alarme3minutes , i ;
//------------------------------------------------------------------------------
void interrupt()
{
if (INTCON.T0IF == 1) // If TMR0 Overflowing
{
INTCON.T0IF = 0; // Réarmement du flag
TMR0 = 100; // Offset du timer0
compteur++; // 10ms time incrémente
if (compteur >= 100) // 1 seconde d'écoulée
{
Debug =~ Debug; // LED d'activitée
chrono++; // On icrémente le chrono
compteur = 0; // On raz time
Debug = 0;
}
}
}
//------------------------------------------------------------------------------
void clignotement()
{
if ((chrono%2)==0 )
{
Debug=0;
}
else
{
Debug=1;
}
}
//------------------------------------------------------------------------------
void main()
{
PORTB = 0; // PORTB en digital
TRISB = 0b00000100; // RB1 Out RB2 IN
PCON.B3 = 1; // 4Mhz oscillator
// configuration TIMER0
OPTION_REG = 0b10000101; // pull up disable,presc 1:64
TMR0 = 100;
INTCON = 0x80; // GIE activé, l'INT timer0 n'est pas encore activée
// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = compteur = i = 0 ;
Signal = 0;
for (i=0; i<=5; i++)
{
Signal =~ Signal; // on inverse la led
delay_ms (350);
}
//------------------------------------------------------------------------------
while(1){
if (VoltCheck == 1) // Contact maintenu
{
pause1heure = pause15minutes = alarme3minutes= chrono = compteur = 0 ;
T0IE_bit = 0; // On arrete le chrono
}
else
{
delay_ms(10); // Pause antirebond
if ((pause1heure==0) && (pause15minutes==0))
{
delay_ms(200); // Pause detection d'impulsion
if (VoltCheck == 1) // C'était juste une impulsion
{
pause1heure = 1; // On fait une pause d'une heure
}
else // Le contact est toujours pas maintenu
{
pause15minutes = 1; // On attend 15 minutes
}
chrono = 0;
compteur = 0;
T0IE_bit = 1; // On lance le chrono
}
}
//------------------------- ATTENTE 15 MINUTES -----------------------------
if ( pause15minutes == 1)
if (chrono >= 15)
{
pause15minutes = 0; // On arrete la pause 15 minutes
alarme3minutes = 1; // On active l'alarme pour 3 minutes
Signal = 1; // On active l'alarme
chrono = 0; // RAZ du chrono
compteur = 0; // RAZ de l'offset
}
else
{
clignotement ();
}
}
}
[Programmation] La gestion de Fonction
-
HVDifusion
Débutant- Messages : 43
- Enregistré en : décembre 2015
[Programmation] La gestion de Fonction
[Programmation] La gestion de Fonction
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
En introduit la notion d'appui court !
Regle la sensibilité en changeant les 200ms de pause si tu n'as pas le temps de remettre le straps en place. Le but est de simuler un appui bref sur Voltchek.
Regle la sensibilité en changeant les 200ms de pause si tu n'as pas le temps de remettre le straps en place. Le but est de simuler un appui bref sur Voltchek.
Code : Tout sélectionner
// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4
// Set Variable
unsigned int compteur, chrono, pause1heure, pause15minutes, alarme3minutes , i ;
//------------------------------------------------------------------------------
void interrupt()
{
if (INTCON.T0IF == 1) // If TMR0 Overflowing
{
INTCON.T0IF = 0; // Réarmement du flag
TMR0 = 100; // Offset du timer0
compteur++; // 10ms time incrémente
if (compteur >= 100) // 1 seconde d'écoulée
{
Debug =~ Debug; // LED d'activitée
chrono++; // On icrémente le chrono
compteur = 0; // On raz time
Debug = 0;
}
}
}
//------------------------------------------------------------------------------
void clignotement()
{
if ((chrono%2)==0 )
{
Debug=0;
}
else
{
Debug=1;
}
}
//------------------------------------------------------------------------------
void main()
{
PORTB = 0; // PORTB en digital
TRISB = 0b00000100; // RB1 Out RB2 IN
PCON.B3 = 1; // 4Mhz oscillator
// configuration TIMER0
OPTION_REG = 0b10000101; // pull up disable,presc 1:64
TMR0 = 100;
INTCON = 0x80; // GIE activé, l'INT timer0 n'est pas encore activée
// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = compteur = i = 0 ;
Signal = 0;
for (i=0; i<=5; i++)
{
Signal =~ Signal; // on inverse la led
delay_ms (350);
}
//------------------------------------------------------------------------------
while(1){
if (VoltCheck == 1) // Contact maintenu
{
pause1heure = pause15minutes = alarme3minutes= chrono = compteur = 0 ;
T0IE_bit = 0; // On arrete le chrono
}
else
{
delay_ms(10); // Pause antirebond
if ((pause1heure==0) && (pause15minutes==0))
{
delay_ms(200); // Pause detection d'impulsion
if (VoltCheck == 1) // C'était juste une impulsion
{
pause1heure = 1; // On fait une pause d'une heure
}
else // Le contact est toujours pas maintenu
{
pause15minutes = 1; // On attend 15 minutes
}
chrono = 0;
compteur = 0;
T0IE_bit = 1; // On lance le chrono
}
}
//------------------------- ATTENTE 1 HEURE --------------------------------
if ( pause1heure == 1 )
{
if (chrono >= 60) // l'attente d'une heure est finie
{
pause1heure = 0; // On arrete la pause d'une heure
T0IE_bit = 0; // On arrete le chrono
}
else
{
clignotement();
}
}
//------------------------- ATTENTE 15 MINUTES -----------------------------
if ( pause15minutes == 1)
{
if (chrono >= 15)
{
pause15minutes = 0; // On arrete la pause 15 minutes
alarme3minutes = 1; // On active l'alarme pour 3 minutes
Signal = 1; // On active l'alarme
chrono = 0; // RAZ du chrono
compteur = 0; // RAZ de l'offset
}
}
}
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités