Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

Aide pour programmation d'un pic 18f



  1. #1
    Tromok

    Aide pour programmation d'un pic 18f


    ------

    Bonjour,

    Je début complètement dans la programmation de PIC, et je dois réaliser un programme sur un pic18f4580, sous mplab.
    Le but du programme est simple, recevoir un caractère sur un port série, et en fonction de ce caractère, activer ou non les pin du port B.

    Le souci que j'ai est que je ne sais pas faire toutes les initialisations qu'il y a à faire, et malgré ma lecture de la datasheet depuis un moment déja, je suis perdu.
    Je viens donc ici demander votre aide pour m'éclairer.

    Voici le code que j'ai pour le moment:

    #include <p18f4580.h>



    unsigned char TableCommandeRA [] = {0x00,
    0x05,
    0x0A,
    0x09,
    0x06,
    0x80,
    0x10,
    0x20};

    // indique qu'un caractère est dans RCREG de l'USART
    char data_recue(void) // reception d'une interruption
    {
    if (PIR1bits.RCIF) /* char recu en reception*/
    {
    PIR1bits.RCIF=0; // efface drapeau
    return (1); // indique qu'un nouveau caractère est dans RCREG
    }
    else return (0); // pas de nouveau caractère reçu
    }


    void main(void)
    {
    unsigned char Commande;

    SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/
    TXSTA = 0x24;
    RCSTA = 0x90; /* active l'USART*/
    TRISB = 0x00; // port A en sortie

    while(1) // echo
    {
    if (data_recue())
    {
    Commande = RCREG;
    PORTB = TableCommandeRA [Commande];
    }
    }
    }


    Cordialement

    Tromok

    -----

  2. Publicité
  3. #2
    amoniaque

    Re : Aide pour programmation d'un pic 18f

    Hello,

    Quelques remarques rapides :
    • où sont les configurations de fusibles ?
    • n'oublies pas de configurer le TRISx de tes E/S d'USART
    • tu utilises quoi comme compilateur ? Car si tu veux utiliser des interruptions, ce n'est pas en faisant ton "data_recue() que c’est le plus adéquate. Avec hi-tech-c tu peux faire :
      void interrupt isr(void)
      {
      if ( RCIF && RCIE)
      {
      // ...
      RCIF = 0;
      }
      }

    Ce lien peut t'aider aussi : http://ww1.microchip.com/downloads/e...IC18_USART.zip (trouvé sur http://www.microchip.com/CodeExamplesByFunc.aspx ).
    A+

  4. #3
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Merci pour cette réponse rapide
    sinon j'utilise le compilateur MCC18 sous Mplab

  5. #4
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bonjour,

    Apres pas mal de changements voici ce que mon programme donne, mais je ne suis toujours pas sur des initialisations notamment :

    Code:
    // Test des communications asynchrones sans IT
    // connecter un Èmulateur de terminal sur le pour sÈrie de PICDEM2+
    #include <p18f4580.h>
    #include <usart.h>
    #include <stdio.h>
    
    
    
    unsigned char TableCommandeRA [] = {0x00,
    									0x05,
    									0x0A,
    									0x09,
    									0x06,
    									0x80,
    									0x10,
    									0x20};
    
    #define BAUD_RATE_GEN 25		// configure la vitesse ‡ 9600 baud (8Mhz)  
    
    
    void Init_Interrupt(){		//configure interruptions
    
        INTCONbits.PEIE = 1;    //enable peripheral interrupts
        INTCONbits.GIE = 1;     //enable glogal interrupts
    
    
    #pragma interrupt InterruptHandler   
    
    void InterruptHandler (void)
    {
    	if(INTCONbits.TMR0IF)
    	{
    		//timer0();
    		//led2 ^= 1;
    		INTCONbits.TMR0IF = 0;
    	}
    
    	if(PIR1bits.TMR2IF)
    	{
    		//led3 ^=1;
    		PIR1bits.TMR2IF = 0;
    	}
    
    }
    
    
    void main(void)
    {
    	unsigned char Commande;
    
    	/*SPBRG = 25; // configure la vitesse (BAUD) 9600 N 8 1
    	TXSTA = 0x24;
    	RCSTA = 0x90; // active l'USART*/
    	TRISB = 0x00; // port A en sortie
    
    	OpenUSART(USART_TX_INT_OFF | USART_RX_INT_ON | USART_ASYNCH_MODE | USART_EIGHT_BIT | USART_CONT_RX | USART_BRGH_LOW, BAUD_RATE_GEN);
        baudUSART(BAUD_8_BIT_RATE | BAUD_AUTO_OFF);
    
    	while(1) // echo
    	{
    	if (PIR1bits.RCIF) 
    		{
    		getsUSART(&Commande,1);					//recois la donnÈe sur 1 octÈ
    		PORTB = TableCommandeRA [Commande];		
    
    		}
    	}
    
    //CloseUSART();
    //while(1);
    }
    Seriez vous me dire si des choses ne vont pas dans ce code?

    Cordialement,

    Trom

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

    Re : Aide pour programmation d'un pic 18f

    Citation Envoyé par Tromok Voir le message
    Seriez vous me dire si des choses ne vont pas dans ce code?
    Hello,

    Je n'ai pas lu tout le code mais d'avance il manque les bits de configurations de ton PIC. Sans ça ton µC ne va pas marcher comme tu le voudras. D'abord bien le configurer puis seulement après se lancer dans la vérification de ton code.
    Sous mplab, vas dans help->topics-> PIC18 config settings , tu trouveras ton bonheur !

  8. #6
    RISC

    Re : Aide pour programmation d'un pic 18f

    Salut,

    Comme Amoniaque le fait très justement remarquer, il faut absolument mettre les bits de configuration dans TON PROGRAMME.

    La syntaxe est du style :

    #pragma config WDT=OFF, LVP=OFF,....

    Tu trouveras les valeurs valides des bits de configuration pour ton PIC dans le menu mentionné dans le post précédent

    Quelle valeur de quartz utilises-tu ?

    a+
    Ma marotte ? les microcontrôleurs ;=)

  9. Publicité
  10. #7
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Merci bien, je n'avais en effet pas vue que j'avais oublié ca.

    Sinon j'utilise l'horloge interne de 8Mhz, le Timer2 du Pic.

  11. #8
    RISC

    Re : Aide pour programmation d'un pic 18f

    Salut,
    Citation Envoyé par Tromok Voir le message
    Sinon j'utilise l'horloge interne de 8Mhz, le Timer2 du Pic.
    C'est la (ou une) des raisons de tes problèmes...l'horloge interne ne possède PAS la précision suffisante pour faire une liaison série.
    Il faut impérativement utiliser un quartz externe (ou un résonnateur céramique).

    Avec un GROS coup de chance cela peut fonctionner...de temps en temps car cela dépend de la température.
    Ton PIC est livré à +/- 1% à 25C, toute déviation de température entraine une erreur de plus en plus importante

    Peux-tu faire voir tes lignes de pragma puisque tu as (bien sûr) fait la modification dans ton code ;=) ?

    a+
    Ma marotte ? les microcontrôleurs ;=)

  12. #9
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Merci,
    J'ai eu des éval, j'ai pas pu continuer de bosser dessus :/

    Mais maintenant elles sont fini et je m'y remet.

    Ma ligne de pragma est:
    #pragma config OSC=HS, FCMEN=ON, WDT=OFF, IESO=OFF, XINST=OFF, LVP=OFF

    Mais j'en suis pas sutout sur car je n'est pas tous compris, surtout pour le "OSC". Sinon je ne sais pas si il y à d'autres configurations a ajouter...?

  13. #10
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bon voici le code que j'ai pour le moment:

    Code:
    // Test des communications asynchrones sans IT
    // connecter un Èmulateur de terminal sur le pour sÈrie de PICDEM2+
    #include <p18f4580.h>
    #include <usart.h>
    #include <stdio.h>
    
    
    #pragma config OSC=HS, FCMEN=ON, IESO=OFF, XINST=OFF, LVP=OFF
    
    
    /*unsigned char TableCommandeRA [] = {0x00,
    									0x05,
    									0x0A,
    									0x09,
    									0x06,
    									0x80,
    									0x10,
    									0x20};
    */
    #define BAUD_RATE_GEN 25		// configure la vitesse ‡ 9600 baud (8Mhz)  
    
    
    void Init_Interrupt(){		//configure interruptions
    
        INTCONbits.PEIE = 1;    //enable peripheral interrupts
        INTCONbits.GIE = 1;     //enable glogal interrupts
    	PIE1bits.TMR2IE = 1;	//enable Timer2 interrupt
    }
    
    
    void Config_Oscillator(){
    OSCCON  = 0b01111110;		//Osc=8MHz P.32 
    }
    
    void init_timer(){
    //timer2
    T2CON = 0b01111100;		//Postscale = 1:1 et Prescaler = 1:1 donc normalement Freq = FOsc/4 = 2MHz
    
    PR2 = 124;				// 125 counts including 0
    
    T2CONbits.TMR2ON = 1;
    }
    
    void main(void)
    {
    	unsigned char Commande;
    
    
    	Config_Oscillator();
    	Init_Interrupt();
    	init_timer();
    
    	/*SPBRG = 25; // configure la vitesse (BAUD) 9600 N 8 1
    	TXSTA = 0x24;
    	RCSTA = 0x90; // active l'USART*/
    	TRISB = 0x00; // port A en sortie
    
    	OpenUSART(USART_TX_INT_OFF | USART_RX_INT_ON | USART_ASYNCH_MODE | USART_EIGHT_BIT | USART_CONT_RX | USART_BRGH_LOW, BAUD_RATE_GEN);
        baudUSART(BAUD_8_BIT_RATE | BAUD_AUTO_OFF);
    
    	while(1) // echo
    	{
    		if (PIR1bits.RCIF) 
    		{
    			getsUSART(&Commande,1);					//recois la donnÈe sur 1 octÈ
    			//PORTB = TableCommandeRA [Commande];		
    			if ( Commande == 'A'){
    			PORTB = 0x00;
    			}
    			if ( Commande == 'Z'){
    			PORTB = 0x15;
    			}
    			if ( Commande == 'S'){
    			PORTB = 0x1A;
    			}
    			if ( Commande == 'D'){
    			PORTB = 0x19;
    			}
    			if ( Commande == 'Q'){
    			PORTB = 0x16;
    			}
    			if ( Commande == 'P'){
    			PORTB = 0x20;
    			}
    			if ( Commande == 'O'){
    			PORTB = 0x40;
    			}
    			if ( Commande == 'V'){
    			PORTB = 0x80;
    			}
    		}
    	}
    
    //CloseUSART();
    //while(1);
    }
    
    
    #pragma interrupt InterruptHandler   
    
    void InterruptHandler (void)
    {
    	if(INTCONbits.TMR0IF)
    	{
    		//timer0();
    		//led2 ^= 1;
    		INTCONbits.TMR0IF = 0;
    	}
    
    	if(PIR1bits.TMR2IF)
    	{
    		//led3 ^=1;
    		PIR1bits.TMR2IF = 0;
    	}
    }
    J'ai l'impression d'avoir suivi un peut tout ce que j'ai pu voir à droite et a gauche, et vos conseil (dont je vous remercie vraiment beaucoup), mais la je vois plus le problème que j'ai (même si une fois de plus je comprend pas tous ce qu'il faut initialiser :/).

    Je dois avoir fini ca pour demain ou après demain pour tester avec quelqu'un d'autre qui dois m'envoyer des caractères via un module wifi sur le port série. Ca fait un moment que je suis dessus, et la j'avoue être un peut beaucoup en panique.

    Donc je viens une fois de plus vous demander votre aide precieuse.

  14. #11
    amoniaque

    Re : Aide pour programmation d'un pic 18f

    Hello,

    As tu tenté un oscillateur externe plutôt que l'interne comme te l'a dit RISC?

    Si vraiment tu ne peux pas, alors vérifies que ton oscillateur interne tourne bien à la fréquence désirée, que la dérive n'est pas la source des erreurs.

  15. #12
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bon j'ai essayé ca ne fonctionne toujours pas :/

    Comment verifier l'oscillateur intern?

  16. Publicité
  17. #13
    RISC

    Re : Aide pour programmation d'un pic 18f

    Salut Tromok,

    Tu es en train de perdre ton temps sur la partie programme alors que le problème est potentiellement sur ton hardware....

    D'après les commentaires de ton programme, j'ai cru comprendre que tu utilises une carte PICDEM 2+ avec un PIC18F4580 dessus (pas du tout prévu pour cette carte...). Peux-tu confirmer ?

    Si c'est le cas, le choix des cavaliers sur la carte PICDEM 2+ est TRES IMPORTANT !!!
    Comment est connecté le cavalier J7 sur ta carte ?
    As-tu monté un quartz ? Quelle valeur ?
    Y a-t-il un TCXO sur Y2 ? quelle fréquence ?

    a+
    Ma marotte ? les microcontrôleurs ;=)

  18. #14
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Ha non, c'est un commentaire d'un vieux programme que j'ai utilisé comme base (il n'y en reste casiment plus d'ailleurs ^^') et que j'ai oublié d'enlever.

    Je ne connais pas le nom de la plaque, mais elle est utilisé par l'école pour les pic 18f458 et 18f4580 avec un programmateur ICD2
    (Celui la : http://www.google.com/imgres?imgurl=...w=1280&bih=664)

  19. #15
    amoniaque

    Re : Aide pour programmation d'un pic 18f

    Citation Envoyé par Tromok Voir le message
    Ha non, c'est un commentaire d'un vieux programme que j'ai utilisé comme base (il n'y en reste casiment plus d'ailleurs ^^') et que j'ai oublié d'enlever.

    Je ne connais pas le nom de la plaque, mais elle est utilisé par l'école pour les pic 18f458 et 18f4580 avec un programmateur ICD2
    (Celui la : http://www.google.com/imgres?imgurl=...w=1280&bih=664)
    Et bien il y a un quartz sur ta plaque, utilises le plutôt que d'utiliser ton oscillateur interne (surtout que d'utiliser ton oscillateur interne alors qu'un quartz est reliée à tes entrées c'est un peu tendancieux comme montage ... ).

  20. #16
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Oui, j'ai essayé mais ca ne fonctionne pas mieux :/

  21. #17
    amoniaque

    Re : Aide pour programmation d'un pic 18f

    Question très conne : tu arrives à faire clignoter une sortie à 1Hz ?!

  22. #18
    RISC

    Re : Aide pour programmation d'un pic 18f

    Tromok,

    Il y a une floppée de cavaliers, de switches, de leds sur ta carte.
    As-tu le schéma électronique pour vérifier que tout cela est configuré correctement ?

    Au niveau des bits de configuration, comme tu as un quartz, il faut utiliser :
    #pragma config OSC=HS, XINST=OFF, LVP=OFF, WDT=OFF, ....
    (HS = quartz) ou même peut-être HSPLL si ton quartz est à moins de 8MHz, car cela permet de multiplier la fréquence par 4

    Quelle est la fréquence de ton quartz ?

    Quand à l'utilisation du PORTB dans ton programme, c'est une TRES MAUVAISE IDEE !!!!
    Les signaux de debug sont généralement sur RB6 et RB7 donc cela ne permet pas de déboguer

    a+
    Ma marotte ? les microcontrôleurs ;=)

  23. Publicité
  24. #19
    Tromok

    Re : Aide pour programmation d'un pic 18f

    J'ai un quartz extern de 12Mhz sur la carte de programmation.

  25. #20
    RISC

    Re : Aide pour programmation d'un pic 18f

    Salut,

    Tu ne réponds pas à nos questions...

    Bonne chance
    a+
    Ma marotte ? les microcontrôleurs ;=)

  26. #21
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bon j'ai tous repris et j'arrive même pas à allumer une LED.
    Je ne sais pas si ca peux venir de la carte de programmation...

    Je sais pas comment je vais faire mais dans tous les cas je vous remercie de votre aide.

  27. #22
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bon j'ai réussi à me debloquer un peut.

    Juste une chose, savez vous comment afficher un caractere qui sort de RX sous MPLAB?

    Pour verifier que je le reçois bien...

  28. #23
    Franck-026

    Re : Aide pour programmation d'un pic 18f

    tu as bien mis les deux capas sur le quartz de 12MHz???

  29. #24
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Oui, j'ai plus de souci de ce coté la

    Maintenant ce que je voudrais c'est vérifier que je reçois bien un caractère sur le Rx, mais je ne sais pas sous MPLAB voir ce que je reçois sur le pic.

  30. Publicité
  31. #25
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bon, j'avance, mais j'ai toujours un problème (ne vous inquiétez pas je passe mon oral mardi je vais bientôt plus vous embêter xD)

    Voici mon code actuel:

    Code:
    #include <p18f4580.h>
    #include <usart.h>
    #include <stdio.h>
    #pragma config OSC=HS
    #pragma config WDT = OFF
    #pragma config LVP = OFF
    #pragma config PWRT = OFF
    
    #define BAUD_RATE_GEN 18		// configure la vitesse ‡ 9600 baud  
    
    unsigned char Rxdata ;
    
    
    void Init_Interrupt(){		//configure interruptions
    
        INTCONbits.PEIE = 1;    //enable peripheral interrupts
        INTCONbits.GIE = 1;     //enable glogal interrupts
    	PIE1bits.TMR2IE = 1;	//enable Timer2 interrupt
    }
    
    void init_timer(){			// initialisation Timer2
    //timer2
    T2CON = 0b01111000;		//Postscale = 1:1 et Prescaler = 1:1 donc normalement Freq = FOsc/4 = 2MHz
    PR2 = 124;				// 125 counts including 0
    T2CONbits.TMR2ON = 1;
    }
    
    void main(void)
    {
    	TRISA = 0x00;	// port A en sortie
    	PORTA = 0x00;
    	TRISB = 0x00;	// port B en sortie
    	PORTB = 0x00;
    //	TRISC = 0x00;	// port C en sortie
    //	TRISD = 0x00; 	// port B en sortie
    
    	OpenUSART(USART_TX_INT_OFF | USART_RX_INT_ON | USART_ASYNCH_MODE | USART_EIGHT_BIT | USART_CONT_RX | USART_BRGH_LOW, BAUD_RATE_GEN);
        baudUSART(BAUD_8_BIT_RATE | BAUD_AUTO_OFF);
    	
    	
       	Init_Interrupt ();
    	init_timer();
    
    	while (1);
    }
    
    #pragma interrupt InterruptHandler   
    void InterruptHandler (void)
    {
    	if(PIR1bits.RCIF)
    	{
    		//PORTA = 0xFF;
    		getsUSART((char *)Rxdata,0);		//recois la donnÈe sur 1 octÈ
    		if ( Rxdata == 'o')	
    			PORTA = 0xFF;
    		else
    			PORTB = 0xFF;
    		
    
    		/*if ( Rxdata == 'z'){
    		PORTB = 0x15;
    		}
    		else if ( Rxdata == 's'){
    		PORTB = 0x1A;
    		}
    		else if ( Rxdata == 'd'){
    		PORTB = 0x19;
    		}
    		else if ( Rxdata == 'q'){
    		PORTB = 0x16;
    		}
    		else if ( Rxdata == 'p'){
    		PORTB = 0x20;
    		}
    		else if ( Rxdata == 'o'){
    		PORTB = 0x40;
    		}
    		else if ( Rxdata == 'v'){
    		PORTB = 0x80;
    		}
    		else {
    		PORTB = 0x00;
    		}*/	
    		//if ( strcmp ( Rxdata, "a") == 0 )
    		//	PORTA = 0xFF;
    		
    	}
    	//while (1);
    }
    #pragma code InterruptVectorHigh = 0x08        //placer le code suivant ‡ l'adresse 0x08
    void InterruptVectorHigh (void)
    {
        _asm
            goto InterruptHandler //jump to interrupt routine
        _endasm
    }

    J'ai testé, et le " if(PIR1bits.RCIF) " fonctionne correctement, c'est à dire que le code détectes bien le caractère qui arrive.

    Le souci est que quand je fait les tests, la valeur chargé dans "Rxdata" est toujours "0xFF", ce qui ne correspond évidement pas au caractère que je devrais recevoir.

    J'envoie ce caractère avec un programme réalisé en assembleur et qui marche parfaitement.

    Je viens donc une fois de plus vous demander votre aide, voir si vous avez des idées du problème.

    Cordialement,

    Tromok

  32. #26
    RISC

    Re : Aide pour programmation d'un pic 18f

    Salut,

    Le plus grand souci de ton programme c'est que tu fais un traitement énorme dans l'interruption (appel de librairie etc...)!!!!
    Si tu veux t'en convaincre, ouvre la fenêtre Disassembly Listing et compte le nombre de cycles...c'est un massacre car il faut faire une "mega" sauvegarde du contexte et une "mega" restoration sans compter l'appel de la librairie getsUSART()...

    Avec ce genre de programme tu pourras tourner à 300 bauds et encore...

    Il faut faire le traitement dans le main().
    Positionne simplement un flag dans l'interruption et teste le dans ton main() ce sera beaucoup plus efficace

    a+
    Ma marotte ? les microcontrôleurs ;=)

  33. #27
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Merci bien

    Je test ca dès demain

  34. #28
    Tromok

    Re : Aide pour programmation d'un pic 18f

    Bon, j'ai finalement réussi, la veille de mon oral ^^'

    Merci a tous pour votre aide.

Discussions similaires

  1. aide pour la programmation d'un PIC 16F628
    Par badr-MOB dans le forum Électronique
    Réponses: 14
    Dernier message: 21/01/2011, 23h47
  2. Programmation des PIC 18F en C
    Par LEMIL dans le forum Électronique
    Réponses: 18
    Dernier message: 19/04/2010, 22h23
  3. Besoin d'aide pour de la programmation d'un PIC en PIC BASIC
    Par quentinbet dans le forum Électronique
    Réponses: 24
    Dernier message: 26/01/2010, 11h18
  4. Aide programmation d'un PIC 16f84a
    Par tqrqntule dans le forum Électronique
    Réponses: 5
    Dernier message: 06/05/2009, 15h07
  5. programmation du pic 18F dans MPLAB
    Par lyrah dans le forum Électronique
    Réponses: 3
    Dernier message: 04/10/2006, 16h10
Découvrez nos comparatifs produits sur l'informatique et les technologies.