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
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- Subzero64170
Débutant- Messages : 51
- Âge : 37
- Enregistré en : octobre 2015
- Localisation : PAU
Bonjour,
Je souhaite faire clignoter une led sur le PORTC bit RC0 toutes les secondes a l'aide d'un timer0.J'ai suivi le tuto de Jeremy TIMER0 en essayant de l'adapter à mon pic mais là je suis coincé...Voila mon programme
lien : DATASHEET PIC16F690
En pièce jointe je met le document que j'ai fait avec la config de mes registres.Merci pour votre aide.
Cordialement
Je souhaite faire clignoter une led sur le PORTC bit RC0 toutes les secondes a l'aide d'un timer0.J'ai suivi le tuto de Jeremy TIMER0 en essayant de l'adapter à mon pic mais là je suis coincé...Voila mon programme
Code : Tout sélectionner
unsigned int x;
////////////////////Prog D'interuption//////////////////////
void interrupt ()
{
if (INTCON.T0IF==1) //je teste si mon flag d'interuption est levé.
{
x++; //a chaque fois que mon flag est levé j'incrémente la variable X
INTCON.T0IF==0; //je remet le flag à 0 pur pouvoir incrémenter x une nouvelle fois
}
}
//////////////// PROG PRINCIPAL/////////////////
void main()
{
TMR0=0; //j'initialise la valeur de mon Compteur à 0
OPTION_REG=0xC7;// 0xC7
INTCON=0xA0;
TRISC.RC0=0;
while(1)
{
if(x==76) //si j'atteind 76 je réalise une tempo de 1s
{
PORTC.RC0=~PORTC.RC0; //je peux allumer ma led.
x=0; //je remet X à 0 car j'ai atteind les 1s je peux ainsi recommencer.
}
}
}
lien : DATASHEET PIC16F690
En pièce jointe je met le document que j'ai fait avec la config de mes registres.Merci pour votre aide.
Cordialement
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Subzero64170 le ven. 13 nov. 2015 21:16, modifié 1 fois.
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- Subzero64170
Débutant- Messages : 51
- Âge : 37
- Enregistré en : octobre 2015
- Localisation : PAU
Faire clignoter une led TIMER0 PIC16F690 MIKROC
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Hello Subzero ,
Il faudrait afin que ton code soit lisible le mettre entre la balise <code> . Je vois que tu as fait un effort car il y en une, mais ce n'est pas celle-ci .
Il y a un bouton prévu pour mettre automatiquement la balise code il te suffit de coller ton code au milieu .
En gros [code=php] colle ton code ici [/code+] , en enlevant le caractère "+"
Dans ce genre de problème il est utile de checker la Data-sheet . mais je ne vois pas le lien pour y accéder ? c'est a toi aussi de le mettre, j'ai prévu ( et j'y ai passé pas mal de temps) un champ afin de le remplir ??
Je regarde ton code
Il faudrait afin que ton code soit lisible le mettre entre la balise <code> . Je vois que tu as fait un effort car il y en une, mais ce n'est pas celle-ci .
Il y a un bouton prévu pour mettre automatiquement la balise code il te suffit de coller ton code au milieu .
En gros [code=php] colle ton code ici [/code+] , en enlevant le caractère "+"
Dans ce genre de problème il est utile de checker la Data-sheet . mais je ne vois pas le lien pour y accéder ? c'est a toi aussi de le mettre, j'ai prévu ( et j'y ai passé pas mal de temps) un champ afin de le remplir ??
Je regarde ton code
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- Subzero64170
Débutant- Messages : 51
- Âge : 37
- Enregistré en : octobre 2015
- Localisation : PAU
Code : Tout sélectionner
unsigned int x;
////////////////////Prog D'interuption//////////////////////
void interrupt ()
{
if (INTCON.T0IF==1) //je teste si mon flag d'interuption est levé.
{
x++; //a chaque fois que mon flag est levé j'incrémente la variable X
INTCON.T0IF==0; //je remet le flag à 0 pur pouvoir incrémenter x une nouvelle fois
}
}
//////////////// PROG PRINCIPAL/////////////////
void main()
{
TMR0=0; //j'initialise la valeur de mon Compteur à 0
OPTION_REG=0xC7;// 0xC7
INTCON=0xA0;
TRISC.RC0=0;
while(1)
{
if(x==76) //si j'atteind 76 je réalise une tempo de 1s
{
PORTC.RC0=~PORTC.RC0; //je peux allumer ma led.
x=0; //je remet X à 0 car j'ai atteind les 1s je peux ainsi recommencer.
}
}
}
Datasheet PIC16F690
Voila qui est fait!
Faire clignoter une led TIMER0 PIC16F690 MIKROC
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Alors ,
prends l'habitude de nommé tes variables avec un nom explicite ; x c'est vague , alors que compteur on sait tout de suite de quoi on parle. certes sur un programme court c'est pas super utile quoi que !!! pour celui qui le lis c'est plus agréable .
Tu ne configure pas tes PORT ? en numerique ? en sortie ? avec une valeur de départ ?
je te laisse regarder ici : http://www.fantaspic.fr/viewtopic.php?f=15&t=47
Si tu as du mal remontre moi ton code, je pense qu'il est préférable de te laisser chercher un tout petit peu ;
Je ne suis pas certain non plus que : PORTC.RC0 soit reconnu . il y a plusieurs facon d'ecrire ca , peut être que ca marche .
Je suis sur d'une chose c'est qu'avec MikoC j'écris PORTC.B0 avec le moyen mnémotechnique le B pour Broche . DONC la broche 0 du PORTC
Dans OPTION_REG avec 0xC7, tu met la bit 5 donc osc interne . et bit<0-2> à 1 donc prescaler de 256 .
Ça devrait aller mieux avec ces quelques remarques
prends l'habitude de nommé tes variables avec un nom explicite ; x c'est vague , alors que compteur on sait tout de suite de quoi on parle. certes sur un programme court c'est pas super utile quoi que !!! pour celui qui le lis c'est plus agréable .
Tu ne configure pas tes PORT ? en numerique ? en sortie ? avec une valeur de départ ?
je te laisse regarder ici : http://www.fantaspic.fr/viewtopic.php?f=15&t=47
Si tu as du mal remontre moi ton code, je pense qu'il est préférable de te laisser chercher un tout petit peu ;
Je ne suis pas certain non plus que : PORTC.RC0 soit reconnu . il y a plusieurs facon d'ecrire ca , peut être que ca marche .
Je suis sur d'une chose c'est qu'avec MikoC j'écris PORTC.B0 avec le moyen mnémotechnique le B pour Broche . DONC la broche 0 du PORTC
Dans OPTION_REG avec 0xC7, tu met la bit 5 donc osc interne . et bit<0-2> à 1 donc prescaler de 256 .
Ça devrait aller mieux avec ces quelques remarques
Faire clignoter une led TIMER0 PIC16F690 MIKROC
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Dans OPTION_REG avec 0xC7, tu met la bit 5 donc osc interne . et bit<0-2> à 1 donc prescaler de 256
tu mets le bit 5 à ... pour que le timer0 recoive FOSC/4
datasheet 5-1
à verifier aussi ,avant d'armer l'interruption timer0
si le programme tourne bien avec une simple tempo
Attention :
La plupart des pics rescent ont leurs pins en mode analogique par defaut sur un reset !
Code : Tout sélectionner
sbit Led at PORTC.B0;
sbit Led_direction at TRISC.B0;
void main()
{
ANSEL=0; // on n'utilise pas les voies analogiques
ANSELH=0;
x=0; // on l'initialise car sinon avec le test x==76 car on risque ,au pire de faire 65535 tours de timer0
// avec au depart si x contient 77
// test preliminaire
Led_direction=0;
Led=1;
Delay_ms(5000); // on peut chronometrer la duree pour verifier si FOSC est bien OK
Led=0;
TMR0=0;
..etc..
.....
while(1)
{
if(x>= 76) // c'est plus sur ..
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- Subzero64170
Débutant- Messages : 51
- Âge : 37
- Enregistré en : octobre 2015
- Localisation : PAU
Bonjour Jeremy,
Merci pour ton aide, j'ai repris mon code avec les conseils que tu m'a donné :
Le test du delay fonctionne bien, la Led s'allume pendant 5s mais dés que je rentre dans la boucle while la led ne s'allume plus.Je pense que mon flag ne se lève pas.Pour tester cela j'ai mis LED=1 dans la boucle d’interruption pour tester si INTCON.TOIF==1.La LED ne s'alume pas donc je pense que j'ai mal configurer l'Option Register.J'ai mis le bit 5 à 0 pour utiliser les fronts de l'horloge externe.Je vais reverifier la config de OPTION_REG.
Merci pour ton aide, j'ai repris mon code avec les conseils que tu m'a donné :
Code : Tout sélectionner
sbit Led at PORTC.B0;
sbit Led_direction at TRISC.B0;
unsigned int compteur;
////////////////////Prog D'interuption//////////////////////
void interrupt ()
{
if (INTCON.T0IF==1) //je teste si mon flag d'interuption est levé.
{
Led=1;
compteur++; //a chaque fois que mon flag est levé j'incrémente la variable X
INTCON.T0IF=0; //je remet le flag à 0 pur pouvoir incrémenter x une nouvelle fois
}
}
//////////////// PROG PRINCIPAL/////////////////
void main()
{
ANSEL=0; // on n'utilise pas les voies analogiques
ANSELH=0;
TMR0=0; //j'initialise la valeur de mon Compteur à 0
compteur=0;
OPTION_REG=0xE7;// 0xE7 le bit 5 est à 0 pour utiliser l'horloge externe
INTCON=0xA0;
// test preliminaire
Led_direction=0;
Led=1;
Delay_ms(5000); // on peut chronometrer la duree pour verifier si FOSC est bien OK
Led=0;
while(1)
{
if(compteur>=76) //si j'atteind 76 je réalise une tempo de 1s
{
Led=~Led; //je peux allumer ma led.
compteur=0; //je remet X à 0 car j'ai atteind les 1s je peux ainsi recommencer.
}
}
}
Le test du delay fonctionne bien, la Led s'allume pendant 5s mais dés que je rentre dans la boucle while la led ne s'allume plus.Je pense que mon flag ne se lève pas.Pour tester cela j'ai mis LED=1 dans la boucle d’interruption pour tester si INTCON.TOIF==1.La LED ne s'alume pas donc je pense que j'ai mal configurer l'Option Register.J'ai mis le bit 5 à 0 pour utiliser les fronts de l'horloge externe.Je vais reverifier la config de OPTION_REG.
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- Subzero64170
Débutant- Messages : 51
- Âge : 37
- Enregistré en : octobre 2015
- Localisation : PAU
Faire clignoter une led TIMER0 PIC16F690 MIKROC
- Subzero64170
Débutant- Messages : 51
- Âge : 37
- Enregistré en : octobre 2015
- Localisation : PAU
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités