Programmer mon PIC en utilisant CC5X
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 33

Programmer mon PIC en utilisant CC5X



  1. #1
    invite65948952

    Programmer mon PIC en utilisant CC5X


    ------

    Bonjour à tous,

    Voilà j'ai un gros problème depuis maintenant plus d'une semaine, je n'arrive pas à faire fonctionner mon PIC alors que le programme semble être écrit dans la mémoire du PIC, donc voilà le programme tout simple en C (j'utilise CC5X pour compiler) qui est sensé allumer toutes les LED's connectées au PORTB:

    #include "int16CXX.H"

    //---------------Fonction principale------------------
    void main(void)
    {
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;

    TRISA = 0 ;//on initialise les ports en output
    TRISB = 0;
    TRISC = 0;
    for ( ; ; )
    {
    PORTB = 255;
    }
    }

    Il n'y a aucun problème lors de la compilation ni lors de la programmation du PIC (j'utilise le PICKIT 2 pour faire le lien entre mon PC et mon PIC). Le PIC que j'utilise est le PIC16LF876A. Auriez vous une idée d'où le problème pourrai venir? Merci à vous!

    -----

  2. #2
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Salut,
    Le problème est simple, il faut imaginer que ton PIC a en memoire l'état de ses entrées sortie en permanence. Ces adresses sont désignés par PORTA PORTB ... et leur valeur est fixé par le constructeur, dans la datasheet.

    Donc quand tu ecrit PORTA = 0 tu dis au PIC que l'état des E/S du PIC est à l'adresse 0 !!!

    Donc cherche dans la doc ( plan memoire surtout) la bonne adresse

    Ex pour pic 16F876A : PORTA = 0x80

  3. #3
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    J'oubliais, je constate que tu as placé PORTA,B,C dans la mauvaise partie du code.

  4. #4
    Forhorse

    Re : Programmer mon PIC en utilisant CC5X

    T'es sûr de ce que tu racontes zhal ? moi ça me semble bizarre
    L'adresse d'un registre c'est le problème du compilateur !

    Pour moi le probleme ce situe au niveau de la boucle FOR, le programme ne doit jamais rentrer dedans car il n'y a aucun paramètre.

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

    Re : Programmer mon PIC en utilisant CC5X

    Pour ma part, j'avoue que je ne travaille jamais avec CC5X, plutot avec CCS comme compilateur.

    Les registres PORTA PORTB ... sont situés a des adresses que l'on doit préciser au compilateur. De même que les registres TRIS, qui eux contienne le "sens" de l' E/S

    Après le compilateur CC5X integre peut être cela mais je n'en ai pas souvenir. Ci join petit bout d'un code a moi :

    Code:
    // Declarations
    #fuses HS,NOWDT,NOPROTECT,NOLVP				
    #use delay(clock=20000000)					//Reglage de l'horloge
    
    //Parametrage des ports
    #byte	PortA 	= 	0x05		//def de l'ad du port A//
    #byte 	TrisA		=	0x85			//def de l'ad du reg de direction du port A//
    #byte	PortB 	= 	0x06			//def de l'ad du port B//
    #byte 	TrisB		=	0x86			//def de l'ad du reg de direction du port B//
    #byte	PortC 	= 	0x07			//def de l'ad du port C//
    #byte 	TrisC		=	0x87			//def de l'ad du reg de direction du port C//
    #byte	byLeds	=	PortC
    Ce code est tout a fait fonctionnel compilé avec CCS.

    Je ne peux etre formel pour ce qui est de CC5X. D'ailleurs il n'y a pas de directive PRAGMA dans son code.

    Pour sa boucle FOR, je crois que sa marche mais je met une reserve
    Il vaut mieux preferer un do..while(1) pour être sur

  7. #6
    Forhorse

    Re : Programmer mon PIC en utilisant CC5X

    Ah ouais je vois...
    Moi avec mon compilateur (BASIC) je n'ai pas besoin déclarer l'adresse des registres.
    Au début de mon code j'ai simplement la ligne
    DEVICE = PIC16LF876A
    Et il sait de lui même où se trouve tous les différents registres sans que j'ai besoin de le préciser. Du coup c'est pas un reflexe

  8. #7
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Je dois avouer que c'est assez lourd car les adresses ne changent jamais d'un PIC a l'autre, mais bon copier coller et c'est réglé

    En plus tout dans le pic fonctionne sur ce principe, il faut toujours déclarer l'adresse d'un registre de la memoire (Ex : Le registre de config du Timer a l'adresse machin, l'USART a l'adresse truc ...)

    Ceux qui font de l'assembleur sont carement marié avec la datasheet car il on encore plus souvent besoin de ces adresses

  9. #8
    invite65948952

    Re : Programmer mon PIC en utilisant CC5X

    Merci à vous pour vos réponses.

    En fait j'ai suivit un tutoriel ou la personne utilise CC5X:

    http://herve.hollard.perso.sfr.fr/prog_pic_c.htm

    Ce qui m'a plu c'est que l'utilisation de CC5X semblait relativement facile, si vous jetez un œil au PDF intitulé "Architecture d'un programme et manipulation des Entres/Sorties" vous verrez qu'on peut écrire PORTB = 0b00000001 pour par exemple allumer la première LED, concernant l'écriture
    for( ; ; )
    elle est tout à fait compréhensible par le compilateur CC5X (cf. tutoriel). Mais vu que je n'y arrive pas je vais peut être utiliser le compilateur que tu as cité Zahl, CCS qui me semble néanmoins un peu plus compliqué à utiliser que CC5X, aurais-tu un tutoriel que je pourrais suivre?

    Sinon en utilisant CCS, comment s'écrit le code pour allumer indéfiniment les LEDs reliées au PORTB? Je dois commencer par écrire:
    // Declarations
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000) //Reglage de l'horloge

    //Parametrage des ports
    #byte PortA = 0x05 //def de l'ad du port A//
    #byte TrisA = 0x85 //def de l'ad du reg de direction du port A//
    #byte PortB = 0x06 //def de l'ad du port B//
    #byte TrisB = 0x86 //def de l'ad du reg de direction du port B//
    #byte PortC = 0x07 //def de l'ad du port C//
    #byte TrisC = 0x87 //def de l'ad du reg de direction du port C//
    #byte byLeds = PortC
    Mais ensuite?

    Que sont les directives pragma que tu as cité? Que veut dire la ligne:
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    Merci à vous!

  10. #9
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Allumer les LEDs en CCS ce fait de la même maniere car cela reste du C. la seule difference existante entre les compilateurs sont les "a cotés".

    Par exemple piloter un afficheur LCD, un USART ... C'est de la rigolade car CCS intégre déjà le nécessaire pour le faire.

    pour ce qui est du code :

    Pour la ligne #fuses HS,NOWDT,NOPROTECT,NOLVP :

    C'est utilisé par le compilateur & MPLAB.

    HS : Oscillateur HS
    NOWDT : Pas de watchdog
    NOPROTECT : Pas de protection du code
    NOLVP : Pas de programmation base tension (sous 5V Sinon c'est 13V)

    ensuite les bytes déclarent des variables de 8 bits de long, "mappé" en memoire à l'adresse indiqué.

    Ain si #byte PORTA = 0x05; Indique que le registre 0x05 est désigné comme étant le PORTA
    TRIS1 c'est le registre indiquant le sens de la communication sur PORTA. Lui aussi a un registre en mémoire à l'adresse 0x85. Donc #byte TRISA = 0x85

    Donc sur ce raisonnement tu peux écrire :

    #bit LED0 = PORTA.0 et ainsi piloter le bit de poids faible du registre PORTA

    Le morceau de code que je t'ai donné est un début de programme.
    Il faut ensuite ajouter les déclarations de constante si tu en as, tes variables ...

    ensuite la fonction main.

    Pour ce qui est du For, je suis de ceux qui considèrent que l'on utilise telle ou telle boucle pour une raison précise. Ainsi un FOR est utile pour un nombre fini de tour de boucle. et pour un bouclage infini un while est mieux.

    Deux manière de l'écrire :

    Code:
    do
    {
    ...
    }
    while(1);
    
    ou
    
    while(1)
    {
    ...
    }

  11. #10
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    Citation Envoyé par R2D2lamenace Voir le message
    ...
    #include "int16CXX.H"

    //---------------Fonction principale------------------
    void main(void)
    {
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;

    TRISA = 0 ;//on initialise les ports en output
    TRISB = 0;
    TRISC = 0;
    for ( ; ; )
    {
    PORTB = 255;
    }
    }

    Il n'y a aucun problème lors de la compilation ni lors de la programmation du PIC (j'utilise le PICKIT 2 pour faire le lien entre mon PC et mon PIC). Le PIC que j'utilise est le PIC16LF876A. Auriez vous une idée d'où le problème pourrai venir? Merci à vous!
    bonjour,
    je vois pas l'utilité de boucler l'instruction PORTB = 255; c'est plus simple de faire:

    #include "int16CXX.H"

    //---------------Fonction principale------------------
    void main(void)
    {
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;

    TRISA = 0 ;//on initialise les ports en output
    TRISB = 0;
    TRISC = 0;

    PORTB = 255;

    for ( ; ; ); // ne rien faire

    }
    Redtronic

  12. #11
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Il n'y a effectivement aucun interet a boucler cette commande mais comme il l'a fait lui même sa doit lui être utile après De toutes les manières dans l'état actuel son programme ne peut fonctionner

  13. #12
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    c'était juste une petite remarque
    Redtronic

  14. #13
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    //#include "int16CXX.H"
    #include <16F877.h>
    #device ICD=TRUE
    #device adc=8

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES XT //Crystal osc <= 4mhz
    #FUSES NOPUT //No Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES BROWNOUT //Reset when brownout detected
    #FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
    #FUSES NOCPD //No EE protection
    #FUSES NOWRT //Program memory not write protected
    #FUSES DEBUG //Debug mode for use with ICD

    #use delay(clock=20000000)

    //---------------Fonction principale------------------
    void main(void)
    {
    set_tris_a(0x00);
    set_tris_b(0x00);
    set_tris_c(0x00);

    OUTPUT_A(0x00);
    OUTPUT_B(0x00);
    OUTPUT_C(0x00);


    for ( ; ; ) OUTPUT_B(0xFF);

    }

    voila un code sur CCS, je l'ai testé.
    Dernière modification par redtronic ; 02/04/2011 à 23h20.
    Redtronic

  15. #14
    Forhorse

    Re : Programmer mon PIC en utilisant CC5X

    si je peux me permettre, le OUTPUT_B(0x00); ne sert à rien puisque c'est pour écrire OUTPUT_B(0xFF); quelques µs plus tard

  16. #15
    doul11

    Re : Programmer mon PIC en utilisant CC5X

    Bonjour,

    Je ne vois pas l’intérêt de programmer en C pour faire un code comme ça ? ou alors c'est le compilateur qui est "limité".

    Avec sdcc, cible 8051, je définis :
    Code:
    __xdata __at (0x8000) unsigned char LCD;
    dans le code j’écris : LCD='a'; ça m'envoie la valeur 'a' a l'adresse externe 0x8000.
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  17. #16
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    sdcc n'est pas fonctionnel sur PIC

    Pour ce qui est de ton code tu dis l'avoir testé, quel en est le resultat ?

  18. #17
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    Citation Envoyé par zhal Voir le message
    ...
    Pour ce qui est de ton code tu dis l'avoir testé, quel en est le resultat ?
    j'appel pas ça un programme, c'est juste un petit test afin de montrer à R2D2lamenace comment programmer sur CCS.
    Redtronic

  19. #18
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Ne serai - ce pas jouer un peu jouer sur les mots ? Un programme aussi petit soit-il s'appelle un programme.

  20. #19
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    Citation Envoyé par zhal Voir le message
    Ne serai - ce pas jouer un peu jouer sur les mots ? Un programme aussi petit soit-il s'appelle un programme.
    j'ai compilé ce bout de code, ben tout le portB est à 1 .
    Redtronic

  21. #20
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Et bien si sa marche, le probleme est reglé

  22. #21
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    tant mieux pour R2D2lamenace
    Redtronic

  23. #22
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Il est tout de même plus agréable de l'entendre de la bouche du principal interessé ...

  24. #23
    invite65948952

    Re : Programmer mon PIC en utilisant CC5X

    Bonjour, excusez moi de ma lenteur... En tout cas merci j'ai essayé de compiler ce que Redtronic à écrit en remplaçant juste:
    #include <16F877.h> par #include <16F876A.h>
    le build a bien "succeded" mais par contre lorsque je branche mon PICKIT sur le petit montage sur labdec, je n'arrive pas à allumer les LEDs reliées au PORTB. Je précise que je n'ai pas de quartz externe sur la labdec par contre je comptais utiliser l'oscillateur interne du PIC (s'il en existe une , mais il me semble que c'est le cas), pour cela j'ai mis en commentaire:
    #FUSES XT
    et j'ai mis en commentaire la ligne:
    #use delay(clock=20000000)
    mais rien n'y fait ces fichues LEDs ne veulent pas s'allumer, je ne sais pas s'il faut que je déclare quelque chose si je veut utiliser l'horloge interne...

  25. #24
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    salut R2D2lamenace,
    ben il faut que tu place un quartz sur ta patine labdec sans oublier les deux condensateurs de 22pF, sans ça ton pic ne marchera jamais
    Redtronic

  26. #25
    zhal

    Re : Programmer mon PIC en utilisant CC5X

    Est tu certain que le PIC 16f876a intègre un oscillateur interne ??? pas pour moi a ma connaissance

  27. #26
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    et n'oubli pas de brancher la pin reset du pic sur VCC.
    Redtronic

  28. #27
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    t'as un schéma pour ton test?
    Redtronic

  29. #28
    invite65948952

    Re : Programmer mon PIC en utilisant CC5X

    Autant pour moi, je pensait qu'il y avait un oscillateur interne. Je vais essayer demain avec un oscillateur externe je vous ferai part du résultat, si ça ne marche pas je ferais un schematic du montage. Par contre lorsque tu parles de relier le pin reset à VCC, il s'agit en fait de la pin MCLR (je n'ai pas trouvé de pin reset), si oui j'ai relié VCC à MCLR avec une résistance de 1kohm.

  30. #29
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    oui c'est bien la pin MCLR
    Redtronic

  31. #30
    redtronic

    Re : Programmer mon PIC en utilisant CC5X

    petite question R2D2lamenace:
    c'est ton premier montage avec les pics?
    Redtronic

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. petit problème CC5X pic 16F84
    Par invite779ffd8e dans le forum Électronique
    Réponses: 1
    Dernier message: 01/04/2010, 21h03
  2. programmer la moyenne en utilisant matlab
    Par invite75273a24 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 06/04/2009, 14h39
  3. Interruptions pour PIC sous CC5X
    Par invite6f219821 dans le forum Électronique
    Réponses: 8
    Dernier message: 11/01/2009, 14h53
  4. PIC sous CC5X, Programmation avec DS1302
    Par invite5b0b28b7 dans le forum Électronique
    Réponses: 3
    Dernier message: 18/09/2008, 15h11
  5. Interruption avec CC5x (Pour pic)
    Par joseph4008 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/09/2005, 18h07
Découvrez nos comparatifs produits sur l'informatique et les technologies.