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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#1 Message par Subzero64170 » ven. 13 nov. 2015 20:08

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

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.
“L'imagination est plus importante que le savoir.” A.Einstein

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#2 Message par Subzero64170 » ven. 13 nov. 2015 20:10

Ha oui la LED reste toujours allumée sur ma platine de test.
“L'imagination est plus importante que le savoir.” A.Einstein

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » ven. 13 nov. 2015 20:25

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 .Image

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 ?? :evil:


Je regarde ton code
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#4 Message par Subzero64170 » ven. 13 nov. 2015 20:43

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!
“L'imagination est plus importante que le savoir.” A.Einstein

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » ven. 13 nov. 2015 20:47

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » ven. 13 nov. 2015 20:49

Edit ton premier post , avec le petit crayon STP .

En l'éditant tu vera un champ en dessous du titre de ton sujet , pour mettre le lien de ta DS . Ainsi le lien apparaitra partout sur ton ton sujet ....

Normalement c'est super pratique :D
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Faire clignoter une led TIMER0 PIC16F690 MIKROC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » sam. 14 nov. 2015 12:29

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 ..
  

Aide toi, le ciel ou FantasPic t'aidera

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#8 Message par Subzero64170 » dim. 15 nov. 2015 12:54

Bonjour Jeremy,
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.
“L'imagination est plus importante que le savoir.” A.Einstein

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#9 Message par Subzero64170 » dim. 15 nov. 2015 13:05

Ha non le bit 5 doit etre à 1 pas à 0 pardon ca donne Intcon=0xE7
“L'imagination est plus importante que le savoir.” A.Einstein

Faire clignoter une led TIMER0 PIC16F690 MIKROC
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#10 Message par Subzero64170 » dim. 15 nov. 2015 13:11

Merci Paulfjujo, je suis repartis du code que tu as posté mais ya toujours un truc qui coince et là je commence à sécher...j'ai mis le pré diviseur a 256 mais ça je pense que c'est bon.
“L'imagination est plus importante que le savoir.” A.Einstein


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités