Programme qui tourne en simu, pas IRL
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Programme qui tourne en simu, pas IRL



  1. #1
    invited3dcf66c

    Programme qui tourne en simu, pas IRL


    ------

    Salut!
    J'ai réalisé un petit programme en C sous MPLAB avec le compilateur MCC18. En gros, ça envoie les valeurs sur 8 bits représentant l'état des potentiomètres via I2C. Enfin... Cela devrait. En simulation sous ISIS, aucun problème, c'est le monde des Bisounours. Par contre dans la vraie vie, c'est autre chose! Mon programme démarre, rentre une seule et unique fois dans la routine d'interruption, et continue son chemin (autrement dit ne fait plus rien, voir programme).

    Code:
    #include <p18F4553.h>
    
    #pragma config PLLDIV = 5
    #pragma config FOSC = HS
    
    #define ADRESSE_SLAVE 0b01001110
    
    typedef enum {POTENTIOMETRES, CMD_SERIE} mode;
    mode mode_actuel = POTENTIOMETRES;
    
    void interruptions_hautes(void);
    void interruptions_basses(void);
    
    char duties[4] = {0x00, 0x33, 0x99, 0xFF};
    char etat_I2C = 1, etat_ADC = 0;
    
    void main(void)
    {
    	// Déclaration et initialisation des variables
    	char i;
    
    	// Configuration des interruptions
    	RCONbits.IPEN = 1; // Priorités activées
    	INTCONbits.GIEH = 1; // Interruptions hautes activées
    	INTCONbits.GIEL = 1; // Interruptions basses activées
    
    	// Initialisation du SSP pour I2C
    	TRISBbits.TRISB0 = 1;
    	TRISBbits.TRISB1 = 1;
    
    	SSPCON1bits.SSPEN = 1;
    
    	SSPCON1bits.SSPM3 = 1; // Mode maître 
    	SSPCON1bits.SSPM2 = 0;
    	SSPCON1bits.SSPM1 = 0;
    	SSPCON1bits.SSPM0 = 0;
    
    	SSPADD = 0x31; // Baud rate : 100kHz
    
    	IPR1bits.SSPIP = 0; // MSSP génère des interruptions non prioritaires
    	PIE1bits.SSPIE = 1; // Interruptions MSSP activées
    
    	SSPCON2bits.SEN = 1;
    
    	// Initialisation de l'ADC
    	ADCON1 = 0b00001011; // Références VDD VSS, AD3 - AD0 analogiques, autres digital
    	TRISA |= 0b00001111; // Pins analogiques en entrée
    
    	ADCON2 = 0b00111101; // Tacq = 20 Tad / Conversion clock = Tosc/16
    
    	ADCON0bits.ADON = 1; // Démarrage de l'ADC
    	ADCON0 = 0b00000011; // Lancement première conversion
    
    	while(1)
    	{
    
    	}
    }
    
    #pragma code low_vector=0x18
    void low_interrupt(void)
    {
    	_asm GOTO interruptions_basses _endasm
    }
    
    #pragma code high_vector=0x08
    void high_interrupt(void)
    {
    	_asm GOTO interruptions_hautes _endasm
    }
    
    #pragma code
    
    #pragma interrupt interruptions_hautes
    void interruptions_hautes(void)
    {
    	
    }
    
    #pragma interruptlow interruptions_basses
    void interruptions_basses(void)
    {
    	if(PIR1bits.SSPIF == 1)
    	{
    		switch(etat_I2C)
    		{
    			case 0:
    				SSPCON2bits.SEN = 1;
    			break;
    			case 1:
    				SSPBUF = ADRESSE_SLAVE;
    			break;
    			case 2:
    				SSPBUF = duties[0];
    			break;
    			case 3:
    				SSPBUF = duties[1];
    			break;
    			case 4:
    				SSPBUF = duties[2];
    			break;
    			case 5:
    				SSPBUF = duties[3];
    			break;
    			case 6:
    				SSPCON2bits.PEN = 1;
    			break;
    			default:
    				etat_I2C = 6;
    			break;
    		}
    
    		if(etat_I2C != 6)
    			etat_I2C++;
    		else
    			etat_I2C = 0;
    		
    		PIR1bits.SSPIF = 0; // Flag à effacer par soft
    	}
    	
    	if(PIR1bits.ADIF == 1 && mode_actuel == POTENTIOMETRES)
    	{
    		switch(etat_ADC)
    		{
    			case 0:
    				duties[0] = ADRESH;
    				ADCON0 = 0b00000111;
    			break;
    			case 1:
    				duties[1] = ADRESH;
    				ADCON0 = 0b00001011;
    			break;
    			case 2:
    				duties[2] = ADRESH;
    				ADCON0 = 0b00001111;
    			break;
    			case 3:
    				duties[3] = ADRESH;
    				ADCON0 = 0b00000011;
    			break;
    			default:
    				etat_ADC = 0;
    			break;
    		}
    		if(etat_ADC == 3)
    			etat_ADC = 0;
    		else etat_ADC++;
    
    		PIR1bits.ADIF = 0;
    	}
    }
    Si quelqu'un a un une idée sur ce qu'il y a, je suis preneur. Merci!

    -----

  2. #2
    invited3dcf66c

    Re : Programme qui tourne en simu, pas IRL

    Hello!
    Je UP! un petit coup, merci.

  3. #3
    sdec25

    Re : Programme qui tourne en simu, pas IRL

    Bonjour,
    As-tu essayé de simuler ton programme sous MPLAB SIM ?
    Est-ce qu'un programme simple fonctionne en vrai ?

    Mon programme démarre, rentre une seule et unique fois dans la routine d'interruption
    Il faut être plus précis, est-ce que le programme s'arrête uniquement après être rentré dans une interruption, ou au bout d'un certain temps même si on n'est pas rentré dans une interruption ?

    et continue son chemin (autrement dit ne fait plus rien, voir programme).
    Est-ce qu'il ne fait plus rien, ou il n'y a plus d'interruption ? Il faudrait faire quelque chose dans ta fonction main pour voir si le programme continue de s'exécuter ou non.

    Tu peux déjà vérifier si le watchdog timer et le Low voltage program sont activés, ça peut causer des soucis.

  4. #4
    invited3dcf66c

    Re : Programme qui tourne en simu, pas IRL

    Salut,
    Alors le LVP n'est pas activé, le Watchdog est activé, mais en principe pas de soucis à ce niveau, il n'y a pas de reset qui arrive, de plus le compilateur doit normalement se charger que ça se passe bien.
    Mon programme tourne dans la boucle while sans aucune interruption entre. Mais je viens de remarquer quelque chose là. Cette instruction " SSPCON2bits.SEN = 1; " ne s'exécute pas. J'ai essayé avec " SSPCON2 != 0b00000001; " ce qui est normalement équivalent, et sans surprise, pas de différence.
    J'ai lu la Datasheet, le handbook de la série 18 et pas mal d'errata de Microchip, il n'y a pas l'air d'y avoir de soucis connu à ce niveau là (il semble d'ailleurs que les problèmes du MSSP aient majoritairement lieu en SPI), donc c'est forcément mon code qui foire (la probabilité pour que ce soit le matériel est déjà faible à la base de toute façon). Dans le doute j'ai essayer de changer de composant, sans succès évidemment.

    J'ai noté par l'expérience, que l'unique interruption que j'ai pu observer n'était pas systématique. En fait, je dirais même que la plupart du temps elle n'a même pas lieu.

    PS: Oui, un autre programme fonctionne sur le composant. Même mon footswitch USB y fonctionne donc pas de soucis!

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

    Re : Programme qui tourne en simu, pas IRL

    Citation Envoyé par sdec25 Voir le message
    Est-ce qu'il ne fait plus rien, ou il n'y a plus d'interruption ?
    Il n'y a plus d'interruption. Il tourne bien en rond dans le while(1), mais jamais une interruption.

  7. #6
    invited3dcf66c

    Re : Programme qui tourne en simu, pas IRL

    Bonsoir,
    Je confirme donc mon inquiétude sur le fait qu'il semble impossible d'envoyer le start bit.
    J'ai remplacé
    Code:
     SSPCON2bits.SEN = 1;
    par
    Code:
    while(SSPCON2bits.SEN == 0)
    {
    SSPCON2bits.SEN = 1;
    }
    Et on ne sort jamais de la boucle.

  8. #7
    invited3dcf66c

    Re : Programme qui tourne en simu, pas IRL

    Hello.
    Je me pose une petite question. Est-ce que ça peut venir du fait que j'utilise un PIC18LF4553?

Discussions similaires

  1. programme tourne en boucle alors qu'il n'y a pas de while
    Par invitedb9b1ced dans le forum Électronique
    Réponses: 4
    Dernier message: 22/11/2010, 17h27
  2. [PIC] - Programme qui tourne en Debug, mais pas en Program
    Par invite3c35244f dans le forum Électronique
    Réponses: 3
    Dernier message: 18/01/2010, 08h22
  3. [Blanc] bouton programme qui tourne pas
    Par invite1b7dec00 dans le forum Dépannage
    Réponses: 6
    Dernier message: 01/08/2007, 22h17
  4. programme qui tourne sous win98 et plante sous win xp
    Par serrepate dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 27/06/2007, 09h50
  5. [Blanc] lave linge whirlpool awa 903 qui tourne... tourne... tourne
    Par invite67c328de dans le forum Dépannage
    Réponses: 5
    Dernier message: 12/02/2007, 21h44
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...