[Programmation] Programmation interruption PIC16F887 avec MPLab
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Programmation interruption PIC16F887 avec MPLab



  1. #1
    jc_renaud

    Programmation interruption PIC16F887 avec MPLab


    ------

    Bonjour,

    J'essaie d'apprendre à programmer en PIC. J'utilise une platine de programme EasyPic 5, le logiciel MPlab IDE et le compilateur cc5x.
    le PIC utilisé est un 16F887 cadencé à 8Mhz par un quartz.

    Le but est d'utiliser l'interruption du timer0 pour faire clignoter une LED. Cependant, la LED ne clignote pas et reste toujours allumée.
    Voici le code écrit, quelqu'un a une idée pour m'aider ?
    Le problème vient peut être de la prédivision du timer0 que je ne maitrise pas vraiment... Le programme a été normalement écrit pour une fréquence de 4 Mhz.

    Code:
    //Programme LED_pulse_3.c
    //Clignotement d'une LED V_3
    //Utilisation interruption Timer0
    //Horloge externe : 8 MHz
    //Timer0: taux prÈdivision 256
    
    //Registre de configuration
    #define CP_off		|=0b11000000110000
    #define LVP_off		&=0b11111101111111
    #define CPD_off		|=0b00000100000000
    #define WRT_off		|=0b00011000000000
    #define DEBUG_off	|=0b00100000000000
    
    #pragma config FOSC=XT, WDTE=off, PWRTE=on, CP_off
    #pragma config LVP_off, CPD_off, WRT_off, DEBUG_off
    
    #pragma interruptSaveCheck n
    
    //prototypes des fonctions
    void it_Timer0(void);
    
    //dÈclaration des variables
    char n;
    
    /*******************************/
    //fonction d'interruption
    /*******************************/
    #pragma origin 4
    interrupt itMain(void)
    {
    	if(T0IF)
    	{
    		it_Timer0(); //gestion interruption Timer0
    	}
    }
    
    /*******************************/
    //fonction principale
    /*******************************/
    void main(void)
    {
    	//DÈclaration des interruptions
    	INTCON = 0x00;
    	PIE1 = 0x00;
    	PIE2 = 0x00;
    
    	//Configuration des ports
    	TRISA = 0xFF;				//port A en entrÈe
    	TRISB = 0b11111110;			//port B en entrÈe sauf RB0 en sortie
    	TRISC = 0xFF;				//port C en entrÈe
    
    //Configuration du Timer0
    	T0CS = 0;					//Horloge d'instruction
    	PSA = 0;
    	PS0 = 1;
    	PS1 = 1;					//taux de prÈdivision 256
    	PS2 = 1;
    	T0IF = 0;					//Flag interruption Timer0 ‡ 0
    	T0IE = 1;					//Interruption Timer0 activÈe
    
    	//Initialisation des variables
    	n = 0;
    	TMR0 = 0xFF;
    
    	PEIE = 1;
    	GIE = 1;
    
    	while(1) nop();				//rien ‡ faire
    }
    
    /*******************************/
    //gestion dÈbordement du Timer0
    //temporisation de 0.5s
    /*******************************/
    void it_Timer0 (void)
    {
    	T0IE = 0;					//dÈsactiver l'interruption Timer0
    	T0IF = 0;					//dÈsarmer le flag
    		
    	n++;						//mise ‡ jour post-diviseur logiciel
    
    	TMR0 = 256 - 244;
    	if(n==8)
    	{
    		n = 0;
    		if (PORTB.0==0)
    		{
    			PORTB.0=1;
    		}
    		else PORTB.0=0;
    	}
    	T0IE = 1;					//activer l'interruption Timer0
    }
    Je vous remercie par avance,

    Jc !

    -----
    Dernière modification par jc_renaud ; 01/09/2012 à 12h41.

  2. #2
    guillaume83

    Re : Programmation interruption PIC16F887 avec MPLab

    Bonjour,
    je crois qu'il faut aussi réarmer GIE à la fin de la gition des interuptions.
    @+

  3. #3
    RISC

    Re : Programmation interruption PIC16F887 avec MPLab

    Salut,
    Citation Envoyé par guillaume83 Voir le message
    Bonjour,
    je crois qu'il faut aussi réarmer GIE à la fin de la gition des interuptions.
    @+
    C'est totalement inexact et potentiellement très dangereux si jamais une autre interruption est active simultanément...
    Il ne faut pas toucher GIE dans les interruptions car il est automatiquement désactivé à l'acceptation d'une interruption et automatiquement réactivé à la sortie de l'interruption

    a+

  4. #4
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    Merci RISC pour ton intervention, j'étais aussi étonné de la réponse de Guillaume (que je remercie tout de meme).

    Tu aurais une idée RISC pour me donner un coup de main ?

    Par avance, merci,

    Jc !

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

    Re : Programmation interruption PIC16F887 avec MPLab

    Salut,

    As-tu essayé de mettre un point d'arrêt dans ton interruption pour voir si ton programme y va ?
    Quel débogueur utilises-tu ?

    a+

    PS : laisse tomber le vieux compilateur CC5X ...et utilises Hitech C version Lite (gratuite) pour PIC10/12/16

  7. #6
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    Arf... j'suis pas très doué, je ne sais pas me servir d'un débogueur...

  8. #7
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    Ah c'est bon j'ai mis en marche le debugger (MPLAB Sim)
    Et je comprends que le programme s'arrête sur le while(1), comme si l'interruption n'arrivait jamais...

  9. #8
    RISC

    Re : Programmation interruption PIC16F887 avec MPLab

    Salut,

    Pouquoi travailler sur le simulateur ???
    Ta carte est-elle compatible avec un des débogueurs de la liste dans MPLAB (Debugger > Select tool > ...) autre que le simulateur ?

    a+

  10. #9
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    La carte est une easypic mikroelektronika. C'est compatible avec les outils de débug de MPLab ?

  11. #10
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    A l'origine, ce programme a été écrit pour un PIC16F876 cadencé à 4MHz.
    Le problème peut il venir de la ?

  12. #11
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    après observations avec le debugger, je me rend compte que la sortie PORTB.0 n'est jamais remis à 1 alors que le programme passe bien par la ligne PORTB.0=1.
    Comme cela est il possible ?

  13. #12
    RISC

    Re : Programmation interruption PIC16F887 avec MPLab

    Salut,

    Lis le chapitre 3.3 de la datasheet, regarde du coté du registre ANSELH...

    a+

  14. #13
    jc_renaud

    Re : Programmation interruption PIC16F887 avec MPLab

    Merci beaucoup RISC, cela fonctionne grace à ANSELH
    Je vais pouvoir continuer

  15. #14
    alami_fati

    Re : Programmation interruption PIC16F887 avec MPLab

    j'ai pu faire faire ce programme essaye le:


    Code:
    	title	'none'
    	LIST	P=16F887, F=INHX8M
    	#include <p16F887.inc>
    	__CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTOSCIO
    	__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
    
    ; -------------------------- Définition des macros -------------------------------------
    bank0 macro
    	BCF STATUS, RP1;
    	BCF	STATUS, RP0;
    	ENDM
    
    bank1 macro
    	BCF STATUS, RP1;
    	BSF STATUS, RP0;
    	ENDM
    
    bank2 macro
    	BSF STATUS, RP1
    	BCF	STATUS,	RP0;
    	ENDM
    
    bank3 macro
    	BSF STATUS, RP1
    	BSF STATUS, RP0
    	ENDM
    
    clearports macro
    	clrf	PORTA
    	clrf	PORTB
    	clrf	PORTC
    	clrf	PORTD
    	clrf	PORTE
    	endm
    
    ; ------------------------------------------------------- Programme principale -----------------------------------------------
    d equ 0x21
    
    
    ORG 0
    BANKSEL PORTA ;
    CLRF PORTA ;Init PORTA
    BANKSEL PORTB ;
    CLRF PORTB ;Init PORTB
    BANKSEL ANSEL ;
    CLRF ANSEL ;digital I/O
    
    BANKSEL TRISA ;
    MOVLW 0xf0;
    MOVWF TRISA ;Set RA0 as output
    BANKSEL TRISB ;
    MOVLW 0x0f
    MOVWF TRISB ;
    BANKSEL PORTA ;
    
    
    
    TEST1
    btfss PORTA,0
    goto TEST1
    call Allumer
    call temporisation 
    
    
    call Eteindre
    call TEST1
    
    Allumer
    BANKSEL PORTB;
    BSF PORTB,7
    return
    
    
    Eteindre
    BANKSEL PORTB
    BCF PORTB,7
    temporisation
    MOVLW 0x04
    MOVWF d
    attente 
    decfsz d,f
    goto attente
    return
    
    end
    Dernière modification par Antoane ; 14/11/2015 à 10h18. Motif: Ajout balises [code]

Discussions similaires

  1. PIC16F887 , interruption RB0 ????
    Par hassanmottaki dans le forum Électronique
    Réponses: 14
    Dernier message: 23/05/2014, 23h06
  2. Probléme programmation PIC 16f877 avec MPLAB
    Par invite55f29a9f dans le forum Électronique
    Réponses: 1
    Dernier message: 28/06/2011, 20h17
  3. programmation dse led avec mplab
    Par invite91aca6f5 dans le forum Électronique
    Réponses: 1
    Dernier message: 20/04/2011, 08h32
  4. Syntaxe interruption MPLAB
    Par invite85f50251 dans le forum Électronique
    Réponses: 6
    Dernier message: 25/04/2007, 08h46
Découvrez nos comparatifs produits sur l'informatique et les technologies.