Probleme Timer1 PIC16f690
Répondre à la discussion
Affichage des résultats 1 à 26 sur 26

Probleme Timer1 PIC16f690



  1. #1
    invite6c0036c2

    Probleme Timer1 PIC16f690


    ------

    Bonjour à tous!

    voila j'ai un souci avec mon code
    Le but étant de décrémenter la luminosité d'une led en modifiant le rapport cyclique de la PWM interne du PIC.
    La PWM fonctionne bien seulement j'ai modifié mon code pour ajouter la gestion du Timer1 et décrémenter CCPR1L tout les 61 débordements du registre TMR1 et depuis plus rien

    voici mon code:
    Code:
    #pragma interruptSaveCheck  n  // no warning or error
    #pragma bit out0 @ PORTC.0	
    int a; // 
    //programme d'interruption Timer1
    #pragma origin 4	
    interrupt timer1(void)
    { 
    	a--;	
    	if(TMR1IF==1)
    	{
    	if (a==0)
    			{		
    			CCPR1L--; // Diminution du DCB de la PWM
    			a=61;
    			out0=1;
    			}
    	TMR1IF = 0; 	
    	}
    }
    // Initialisation
    void init()
    {	
    	OSCCON  = 0b.0111.0000; 	//configuration horloge interne du pic à 32 MHz
    	OSCTUNE = 0b.0100.0000;		//activer la PLL *4 => 32MHz
    	PORTC  	= 0b.0000.0000;		//initialisation du PORTC
    	T1CON	= 0b.1000.0000;     // pas de préscaler et timer pas mis en route
    	T2CON 	= 0b.0000.0111;
    	INTCON  = 0b.1100.0000;		//activation des interruptions
    	PIE1    = 0b.0000.0010;	
    	ANSEL  	= 0b.0000.0000;		
    	PIR1    = 0b.0000.0010;
    	PR2 	= 0b.1111.1111;	
    	CCPR1L  = 0b.1111.1111;		//Valeur Pour le DCB de la PWM->ici 100%
    	CCP1CON = 0b.0010.1100; 	// configuration mode PWM et sortie sur P1A-->RC5
    	TRISC   = 0b.0000.0000; 	//  declaration I/O PORTC
    	TMR1IE =1;					//activation timer1
    	out0=1;						
    	a=61;
    }
    // programme principal
    void main(void)
    {
    	init();
    	for(;;)
    	{
    		out0=0;
    	}	
    }
    Je suis perdu,je m'embrouille tout seul, j'ai besoin d'un œil avisé externe,de plus je doute de cette ligne de code :
    Code:
    CCPR1L--;
    Est-ce que l'on peut décrémenté un mot de 8bits en direct ou il faut passé par une conversion décimale ou autre opérateur logique?

    merci d'avance pour votre aide
    Adrien

    -----

  2. #2
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    Pour donner un peu plus de précision,
    j'utilise un Pickit2 avec MPLAB et CC5X comme compil,
    la compilation se passe sans erreurs mais lorsque j'envoi la sauce dans le Pic rien ne bouge,
    j'ai une led sur RC0 et une autre sur RC5.
    je débute dans la mise en œuvre des Timers donc je galère un peu l
    je continu mes recherches...

  3. #3
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    Bon je commence a pensé sérieusement a un problème de config sur mon oscillateur interne,est-ce qu'il nécessite un quartz externe supplémentaire ou est-ce qu'il est comme son nom l'indique "interne",on alimente le Pic et Pouf il frétille???

  4. #4
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    alors il s'emblerai que j'ai egalement un problême de sauvegarde et de restauration de "w" ,"STATUS" et PCLATCH"
    Error[1] D:\projet\depart.c 14 : W not saved/restored during interrupt 'timer1'

    {
    a--;
    ^------
    Error[2] D:\projet\depart.c 8 : STATUS not saved/restored during interrupt 'timer1'

    a--;
    if(TMR1IF==1)
    ^------
    Error[3] D:\projet\depart.c 9 : PCLATH not saved/updated/restored during interrupt 'timer1'

  5. A voir en vidéo sur Futura
  6. #5
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    Bonsoir,

    je connais un peu la gestion du TMR1 et de la PWM sur les 16Fxxx...
    je vais aller voir la datasheet du 16F690...
    mais je te promet rien...

    vede
    ;O]

    ps : moi je commencerais par faire clignoter une led,
    en utilisant l'interruption du TMR1... déjà pour "caler" ça...
    (vérifier que j'arrive à configurer et utiliser INT TMR1 à
    une certaine fréquence (2Hz par ex.))...

  7. #6
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    j'ai viré ma 1ere ligne de code
    #pragma interruptSaveCheck n // no warning or error
    qui avait pour but de ne pas prendre en compte certaines erreur lors de la compil,
    mais en fait la compil ne se faisait pas du tout se qui explique le mode glandage de mon pic puisque rien ne lui est envoyé ^^

    merci Vede
    t'as raison demain je vais testé simplement le TMR1 en solo

  8. #7
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    Et sinon pour la décrémentation d'un mot binaire de 8bits

    ex:
    a=11111111;
    a--;

    C'est possible?ça me parait trop simple Oo

  9. #8
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    Citation Envoyé par adrien44230 Voir le message
    Et sinon pour la décrémentation d'un mot binaire de 8bits

    ex:
    a=11111111;
    a--;

    C'est possible?ça me parait trop simple Oo
    re ;O]

    bonn'idée ;O]

    je connais pas ton C, mais pour déclarer
    une valeur en binaire il faut souvent ajouter
    un préfixe, exemples :

    %1111111;
    ou
    0b1111111;
    ou
    ...

    selon le compilo...

    après la notation

    a--;

    même si ça fonctionne peut-être...
    je n'aime pas beaucoup...

    a = a - 1;

    c'est plus clair... à mon goût...

    tiens nous au jus (TMR1)...
    vede
    ;O]

    ps : la sauvegarde de certains registres (FSR...) est obligatoire
    si l'on utilise les interruptions... et que l'on veut que cela fonctionne...

  10. #9
    RISC

    Re : Probleme Timer1 PIC16f690

    Salut,

    La déclaration en binaire se fait de cette manière :
    a = 0b00001010;
    NB : cette notation n'est PAS ANSI-C mais la plupart des compilateurs accepte cette notation.

    Quand tu décrémentes, le compilateur se "fout" de la base utilisée :
    a--;

    a+

  11. #10
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    Merci excusé moi j'ai tapé un peu trop vite mais vous pouvez vérifié que dans mon code la syntaxe est correct ^^
    je vais continué mes recherches,il me semble qu'il y a une histoire du genre de sauvegarder certains paramètre comme W,Status puisque sinon ils sont perdu lors du retour dans le prog principal...

  12. #11
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    Citation Envoyé par adrien44230 Voir le message
    Merci excusé moi j'ai tapé un peu trop vite mais vous pouvez vérifié que dans mon code la syntaxe est correct ^^
    je vais continué mes recherches,il me semble qu'il y a une histoire du genre de sauvegarder certains paramètre comme W,Status puisque sinon ils sont perdu lors du retour dans le prog principal...
    re ;O]

    il faut sauvegarder 3 "paramètres" : W, Status et FSR...
    certains compilos le "font" automatiquement...
    regarde le code assemblé, ça devrait commencer par
    ça (sauvegardes des registres) dés le début (adresse 0004)...
    si non c'est pas bon...

    sinon la syntaxe paraît correcte...
    vede
    ;O]

  13. #12
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    Citation Envoyé par adrien44230 Voir le message
    j'ai viré ma 1ere ligne de code
    qui avait pour but de ne pas prendre en compte certaines erreur lors de la compil,
    mais en fait la compil ne se faisait pas du tout se qui explique le mode glandage de mon pic puisque rien ne lui est envoyé ^^

    merci Vede
    t'as raison demain je vais testé simplement le TMR1 en solo
    Bonjour,

    un p'tit exemple de base de clignotage de led sur PortB.0
    en utilisant l'interruption du Timer1...

    en Basic, pour 16F877A, mais très facilement adaptable :
    Code:
    sub procedure interrupt      '
       TMR1L  = 0          ' re initialise le TMR1... pour une période
       TMR1H  = 0          ' d'environ 256 x 256 x 8 µs (avec OSC = 4Mhz)
       PIR1.TMR1IF = 0     ' et réactive interrupt sur TMR1 (remet le flag à 0)
       PortB = PortB + 1
    end sub
    '
    main:
      T1CON  =   %110001    ' démarre TMR1, avec PreScaler = 8
      INTCON = %11000000    ' activation interruptions périphériques
      PIE1   = %00000001    ' activation interruption du TMR1
      TMR1L  = 0            ' initialise le TMR1... pour une période
      TMR1H  = 0            ' d'environ 256 x 256 x 8 µs...  (avec OSC = 4Mhz)
      while true  '
        nop
      wend
    bonn'journée à tous,
    vede
    ;O]

    ps : la led clignote à environ 1Hz...

  14. #13
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    ps :

    on pourrait même supprimer les 2x2 lignes des 2 initialisations du Timer1

    TMR1L = 0
    TMR1H = 0

    sans conséquences... dans ce cas...

  15. #14
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    Ok merci Vede je test ça ce soir,
    Et sinon hier soir j'ai fait juste une dernière modif en fouillant dans le fichier "INT16CXXX.h" de mon compilo CC5X j'ai trouvé les commandes "int_sav_register" et "int_restore_register" que j'ai rajouté en debut et fin d'interruption et la ça compil mais toujours pass de réaction du Pic... conflit de configuration Osc int/ext??? je suis perdu avec MPLAB ds les bits de config,j'ai mit "Osc = osc interne RC Clockout",Disable "ESIO"

    allez je vais pas me prendre la tête, je vais au taf et ce soir je reprend tt à zéro

    merci a+tard

  16. #15
    alainav1

    Re : Probleme Timer1 PIC16f690

    bonjour,
    dans l'exemple (post precedent )
    pourquoi 256 X 256 X 8µS avec un quartz à 4 Mhz ?
    un quartz 4MHz donc une frequence interne du pic de 1Mhz (frequence /4)
    1Mhz ---> 1µS
    ce ne donnerai pas plutôt 256 X 256 X 1 µS

    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  17. #16
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    Citation Envoyé par alainav1 Voir le message
    bonjour,
    dans l'exemple (post precedent )
    pourquoi 256 X 256 X 8µS avec un quartz à 4 Mhz ?
    un quartz 4MHz donc une frequence interne du pic de 1Mhz (frequence /4)
    1Mhz ---> 1µS
    ce ne donnerai pas plutôt 256 X 256 X 1 µS

    cordialement
    Alain
    Bonjour Alain,

    non, parce que dans mon exemple j'ai positionné le "Pre-Scaler" du Timer1 sur 8...
    ce qui multiplie la "période" (1µs) par 8...

    bonn'journée,
    vede
    ;O]

  18. #17
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    ps :

    et j'aurais dû écrire 256 x 256 x 8 x 1µs...

    mais quand je m'en suis rendu compte...
    il était trop tard...

  19. #18
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    re ;O]

    ça me démange... donc quelques "améliorations"...

    Code:
    sub procedure interrupt   
       PIR1.TMR1IF = 0     ' réactive interrupt sur TMR1 (remet le flag à 0)
       PortB = PortB + 1   ' et fait clignoter la led
    end sub
    '
    main:
      T1CON  =   %110001    ' démarre TMR1, avec PreScaler = 8
      INTCON = %11000000    ' activation interruptions périphériques
      PIE1   = %00000001    ' activation interruption du TMR1
      TMR1L  = 0            ' initialise le TMR1... pour une période
      TMR1H  = 0            ' d'environ 256 x 256 x 8 x 1µs...  (avec OSC = 4Mhz)
      while true  '
        nop
      wend

  20. #19
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    Citation Envoyé par alainav1 Voir le message
    bonjour,
    dans l'exemple (post precedent )
    pourquoi 256 X 256 X 8µS avec un quartz à 4 Mhz ?
    un quartz 4MHz donc une frequence interne du pic de 1Mhz (frequence /4)
    1Mhz ---> 1µS
    ce ne donnerai pas plutôt 256 X 256 X 1 µS

    cordialement
    Alain
    re re:

    merci Alain...
    en effet j'ai du boulot niveau rédaction/pédago...
    mais c'est ce que je "bosse" en ce moment...
    donc merci pour ta remarque...

    bonn'aprém,
    vede
    ;O]

  21. #20
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    J'ai profité d'une ptite pause ce midi pour continuer et adapter l'exemple de Vede pour mon compilo CC5X et surprise ça fonctionnej'ai un joli compteur puisque j'ai une ledd sur chaque sortie du PortC.
    Allez hop je vous montre le code s'il peut reservir pour quelqu'un
    Code:
    #include "INT16CXX.H"
    
    #pragma origin 4
    interrupt timer1 (void)
    {
                 int_save_registers;	// sauvegarde provisoire des registre W,STATUS et FSR
    	PORTC=PORTC + 1;	
    	TMR1IF = 0;		// remettre le flag de débordement du TMR1 à 0
    	int_restore_registers; // restauration des registres W,STATUS et FSR
    }
    void main (void)
    {
    	PORTC  = 0b.0000.0000;	//initialisation PortC
    	ANSEL  = 0b.0000.0000;	// sortie en numerique
    	TRISC	= 0b.0000.0000;	// I/O configuration
    	T1CON  = 0b.0011.0001;  //démarre TMR1, avec PreScaler = 8
                 INTCON = 0b.1100.0000;    // activation interruptions périphériques
     	PIE1   = 0b.0000.0001;    //activation interruption du TMR1
                 TMR1L  = 0;            // initialise le TMR1... pour une période
                 TMR1H  = 0;            //d'environ 256 x 256 x 8 x 1µs...  (avec OSC = 4Mhz)	
    	for(;;)
    	{
    			//boucle infinie
    	}
    }
    Ce soir je décortique les configurations de registre pour bien capté et apres je fusionnec le tout avec mon code de la PWM et je vous tiens au jus
    Merci encore à vous

  22. #21
    alainav1

    Re : Probleme Timer1 PIC16f690

    bonjour,
    mais c'est bien sur !
    ce genre de petit programme est tres utile pour progresser par l'exemple j'en suis très friand (comme surement beaucoup de debutant )car comme autodidacte c'est comme ça que je comprend le mieux même si des cours comme celui de bigonoff sont incontournable et super bien fait .
    merci Vede.

    Cordialement
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  23. #22
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    re ;O]

    bon j'ai commencé à regarder la datasheet,
    notamment la section 11 (PWM)

    je reprends ton code initial :

    T2CON = 0b.0000.0111;
    ici tu actives le Timer2, avec un PreScaler = 16

    PR2 = 0b.1111.1111;
    il serait sympa de connaître la fréquence du Timer2 générée/espérée
    avec ce réglage (et selon F_OSC)...

    CCPR1L = 0b.1111.1111; //Valeur Pour le DCB de la PWM->ici 100%
    CCP1CON = 0b.0010.1100; // configuration mode PWM et sortie sur

    non pas 100%... pour avoir 100% (soit 1024 vu que c'est sur 10 bits)
    il faut aussi mettre à 1 le "10éme" bit de "réglage" du duty-cycle, c'est
    le bit 4 de CCP1CON... soit :
    CCP1CON = 0b.0011.1100; // configuration mode PWM et sortie sur

    après je me rappelle plus exactement, mais avec 100%, la led va
    être soit complètement éteinte, soit complètement allumée...

    et je vais paraître entêté ;O]
    mais au moindre problème, moi je commencerais par
    simplement illuminer une led progressivement avec la PWM...
    histoire de "caler" le fonctionnement de la PWM (fréquence et
    duty-cycle) avant d'y insérer l'utilisation de INT TMR1 ;O]

    vede
    ;O]

  24. #23
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    en fait je me suis pas trop occupé de la fréquence,
    simplement une fréquence assez élevée pour éviter un scintillement seul le Duty-cycle m'interresse pour le moment et tu as raison le DCB n'est pas réellement a 100% j'ai un peu trop arrondi les angles dsl.
    Je reprend tout a Z et avec toutes ses infos je refait ça propre a+ tard ds la soirée

  25. #24
    invite6c0036c2

    Lightbulb Re : Probleme Timer1 PIC16f690

    Et voila c'est bon j'ai réussi a fusionné le tout,
    quel bonheur de voir ma ptite led s'allumé progressivement
    voici le code :
    Code:
    #include "INT16CXX.H"
    #pragma bit out0 @ PORTC.0
    #pragma origin 4
    interrupt timer1 (void)
    {
    		int_save_registers;	// sauvegarde provisoire des registre W,STATUS et FSR
    		CCPR1L++;
    		TMR1IF = 0;		// remettre le flag de débordement du TMR1 à 0
    		int_restore_registers; // restauration des registres W,STATUS et FSR
    }
    void main (void)
    {
    	OSCCON  = 0b.0111.0000; 	//configuration horloge interne du pic à 32 MHz
    	OSCTUNE = 0b.0100.0000;		//activer la PLL *4 => 32MHz
    	PORTC  = 0b.0000.0000;  //initialisation PortC
    	ANSEL  = 0b.0000.0000;	  // sortie en numerique
    	TRISC  = 0b.0000.0000;	  // I/O configuration
    	T1CON  = 0b.0011.0001; //démarre TMR1 et PreScaler= 8
             T2CON  = 0b.0000.0111;     // TMR2 on,prescaler=16
    	INTCON = 0b.1100.0000;  // activation interruptions périphériques
     	PIE1   = 0b.0000.0001;    //activation interruption du TMR1
    	PR2 = 0b.1111.1111;
    	CCPR1L = 0b.0000.0000;
    	CCP1CON = 0b.0010.1100; // PWM mode
                 TMR1L  = 0;             // initialise le TMR1... pour une période
                 TMR1H  = 0;             //d'environ 256 x 256 x 8 x 1µs...  (avec OSC = 4Mhz)	
    	for(;;)
    	{
    		
    	}
    }
    j'ai plus qu' a travaillé sur les configs des 2 Timers pour obtenir les tps d'allumage et d'exctinction souhaité merci a tous et merci Vede

  26. #25
    invite7a49d0d5

    Cool Re : Probleme Timer1 PIC16f690

    super ;O]

    tu vas nous faire une ch'tite vidéo ;O]
    (je rigole)

    ma première vidéo, si tu l'a pas vu :
    http://www.youtube.com/watch?v=kim_b-a-vvo
    (j'avais emprunté un appareil photo numérique)

    je vais prochainement m'acheter une webcam à 10 euros...
    notamment pour vous montrer ça (animations) :
    http://vede.free.fr/electronique/multiplexage/
    (projets en cours... mais déjà "fonctionnels"...)..

    et va falloir que je fasse des progrés en "filmage" et montage ;O]

    bonn'continuation,
    et bonn'soirée,
    vede
    ;O]

    ps : au finale, une PWM permettra de régler l'intensité lumineuse
    de ma matrice via un potard sur une entrée ADC, comme j'ai fait
    dans ce récent projet :
    http://soj.mesdiscussions.net/soj/El...jet_5555_2.htm

  27. #26
    invite6c0036c2

    Re : Probleme Timer1 PIC16f690

    sympa le projet je vais suivre ça,
    pour ma part la PWM va commandé une interface pour varier le courant dans une série de led HL,un LCD est prévu par la suite,ainsi que différents capteurs (PH,T°,conductivité) et asservissement de pompe et electrovannes, le tout orchestré par une horloge précise.
    j'essai d'en un 1er temps de faire le tour des fonctions Pics de base pour commencer a réfléchir au hard.
    un projet ambitieux surtout que je part de zéro en Pic et quelques bases en C mais mes connaissances en électronique ne demande qu'a refaire surface
    PS: c'est la guerre sur ta plaque LAB

Discussions similaires

  1. Masque en C PIC16F690
    Par invite069857b8 dans le forum Électronique
    Réponses: 5
    Dernier message: 18/05/2009, 18h07
  2. Problème d'entrée sur un pic16f690
    Par v2h dans le forum Électronique
    Réponses: 15
    Dernier message: 17/02/2009, 19h00
  3. Timer1 et timer0
    Par guifou dans le forum Électronique
    Réponses: 4
    Dernier message: 18/01/2009, 05h16
  4. Timer1
    Par invite91183f95 dans le forum Électronique
    Réponses: 2
    Dernier message: 26/04/2007, 15h10
  5. Probleme avec Timer1 sur 16F876
    Par Peter dans le forum Électronique
    Réponses: 4
    Dernier message: 27/12/2006, 15h02
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...