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

PIC16F690 & LPC DémoBoard de MicroChip



  1. #1
    Jemy

    PIC16F690 & LPC DémoBoard de MicroChip

    Bonsoir,

    je débute avec les PIC en C sur la Low Pin Count Démo Board de MicroChip et j'ai une question, voici mon code :

    Code:
    void main(void)
    {
    // Les ports C sont des sorties
    TRISC=0;
    
    // On met les pins C à 0
    
    PORTC=0b00000000;
    
    // on met C0 à 1
    
    PORTC.0=1;
    }
    Ceci a pour effet d'allumer la LED DS1 de la carte de démo.

    Maintenant, si j'appuie sur le bouton poussoir de la carte, la LED s'éteind.

    Alors que si je fais la même chose avec le code en ASM fournit par microchip :

    Code:
    #include <p16F690.inc>
         __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
         org 0
    Start:
         bsf     STATUS,RP0       ; select Register Page 1
         bcf     TRISC,0          ; make IO Pin C0 an output
         bcf     STATUS,RP0       ; back to Register Page 0
         bsf     PORTC,0          ; turn on LED C0 (DS1)
         goto    $                ; wait here
         end
    La LED DS1 s'allume, et lorsque j'appuie sur le bouton poussoir rien de ne passe ( ce qui parait plus normal ).

    Voici mes bits de config, j'ai essayé de deviner comment les régler à partir du code asm mais bon...

    Code:
    Oscillator : Internal RC No Clock
    Watchdog Timer : Off
    Power Up Timer : Off
    Master Clean Enable : External
    Code Protect : Off
    Data EE Read Protect : Off
    Brown Out Detect : BOD Enabled, SBOREN Disabled
    Internal External Switch Over Mode : Disabled
    Monitor Clock Fail-Safe
    J'utilise le compilateur CC5 intégré à MPLAB en suivant les instructions de http://hhollard.club.fr/prog_pic_c.htm

    Le bouton poussoir est relié au PORTA.2.

    Le schéma de la carte :



    Le schéma du boutton poussoir :



    Autre question : pour temporiser et faire clignoter de facon visible une LED, je met un
    Code:
    for(i=0; i<X; i++) ;
    Lorsque X est autour de 100, ça marche, mais lorsque X commence à dépasser 500 le for n'est jamais passé, et la LED reste allumée ( ou éteinte selon le code ). En ajoutant plusieurs
    Code:
    for(i=0; i<100; i++) ;
    for(i=0; i<100; i++) ;
    for(i=0; i<100; i++) ;
    for(i=0; i<100; i++) ;
    J'arrive à faire clignoter la LED de façon visible, mais comme la version de CC5 me limite au niveau de la quantité de code c'est pas super comme méthode. Une idée de pourquoi je peux pas mettre la valeur de X voulue?

    Dernière question : un livre ou un site avec un bon cours sur les PIC en C, ça existe?

    Merci d'avance !

    -----


  2. Publicité
  3. #2
    cherwam07

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Salut

    Pour ta question 1 : A la fin du code assembleur il y a un
    Code:
    goto $
    Qui fait que le programme va tourner en boucle en executant toujours la même instruction.
    Par contre à la fin de la fonction C on ne sait pas ce qui se passe.
    Imagine ton pointeur de programme : il execute la fonction main, et après ??????
    Sous Windows le programme s'arrete, mais ici tu va executer ce qu'il y a dans la mémoire après la fonction main, c'est à dire.....n'importe quoi.

    Donc à la fin de ton main, il faut terminer par :
    Code:
    while(1);
    Question 2 : Comment as tu déclaré la variable i ?
    Si tu l'a déclaré en char, alors c'est normal puisque tu ne peux pas dépasser 255, il faut déclarer un int (pour pouvoir coder un nombre jusqu'à 32000 et quelques)

    I hope this helps !

  4. #3
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Salut !

    Merci beaucoup de m'avoir répondu.

    En effet je n'avais pas fait attention au goto $
    Mais il semble que ça ne soit pas ça le problème.

    Voici le code modifié :

    Code:
    void main(void)
    {
    TRISC=0;
    PORTC=0b00000000;
    PORTC.0=1;
    while(1);
    }
    Mais j'ai toujours le même problème avec le bouton poussoir.

    Le code suivant donne le même problème :

    Code:
    void main(void)
    {
    TRISC=0;
    PORTC=0b00000000;
    while(1)
    {
    PORTC.0=1;
    }
    }
    Autrement, i est déclaré en "int". La valeur exacte à partir de laquelle ça foire est 127.

    Si t'as une idée...

  5. #4
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    J'ai trouvé le problème pour le "i" !

    Avec CC5 free, les int sont des int 8 bits signés !

    Il faut donc utiliser
    Code:
    unsigned long i;
    pour avoir i codé sur 16 bits !

    Source : http://www.aix-mrs.iufm.fr/formation...0en%20main.pdf

    Il reste le problème du bouton poussoir que je ne comprends pas...

  6. #5
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Problème supplémentaire : le programme boucle même si je ne lui ai pas demandé !

    Code:
    void main(void)
    {
    unsigned long int i;
    TRISC=0;
    PORTC=0b00000000;
    PORTC.0=1;
    for(i=0;i<=10000;i++);
    PORTC.1=1;
    for(i=0;i<=10000;i++);
    PORTC.2=1;
    for(i=0;i<=10000;i++);
    PORTC.3=1;
    while(1);
    }
    Ici les leds s'allument les unes après les autres, puis arrivé à la LED 4, elle reste allumée 3 à 4 secondes, puis la séquence recommence.

  7. A voir en vidéo sur Futura
  8. #6
    DavidDB

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Salut,
    elle reste allumée 3 à 4 secondes, puis la séquence recommence.
    C'est le Watchdog du µC qui est activé et qui reset le µC.

    Il faut soit désactiver le bit de config du Watchdog, soit dans la boucle while effacer le contenu du Watchdog.

    David.

  9. Publicité
  10. #7
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Salut DaviDB,

    j'avais pensé à cette éventualité, mais ça ne semble pas être ça l'origine du problème, car le Watchdog est désactivé (cf mon premier post ):



    Donc par exemple, avec ce code :
    Code:
    void main(void)
    {
    unsigned long int i;
    unsigned char Cnt=0;
    TRISC=0;
    PORTC=0b00000000;
    for(;;)
    {
    	PORTC=Cnt;
    	for(i=0;i<=60000;i++);
    	Cnt++;
    	PORTC=Cnt;
    	for(i=0;i<=60000;i++);
    	Cnt++;
    }
    }
    La LED en PORTC.0 s'allume, puis s'éteind tandis que la LED en PORTC.1 s'allume, puis la séquence recommence. Alors qu'en choisissant des valeurs comme i<=10000 la séquence s'éxecute en entier, et elle reprend à 0 au milieu d'une séquence.

  11. #8
    DavidDB

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Efface le contenu du Watchdog dans la boucle While...

    Les 3-4 secondes correspondent exactement au temps de débordement standard du warchdog.

    David.

  12. #9
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Salut !

    Merci pour ta réponse. Je ne comprends pas : si je met le watchdog Off dans les bits de config, pourquoi est-il malgrès tout activé dans mon programme?

    Pour l'éffacer manuellement dans la boucle, comment fait-on en C? Il me semble qu'en asm c'est clrwdt, mais en C je ne sais pas.

  13. #10
    DavidDB

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Il faut écrire les bits de configs dans ton programme source, et non "cocher" une case dans ton IDE. De cette manière tu es certain que la compilation se fasse exactement avec la config que tu as écrite dans tes sources.

    Je programme en ASM, donc je ne sais pas te dire comment effacer le Watchdog en C...

    David.

  14. #11
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    On peut écrire les bits de configuration avec #pragma config.

    Cette ligne de code

    #pragma config = 0x3F39

    http://www.electroniciens.aquitaine-....php?article34

    Désactive le watchdog ( entre autres surement... )

    Maintenant reste à la comprendre...

    C'est un peu démoralisant de voir qu'il n'existe pas de vraie documentation en ligne sur la programmation des pic16F en C. Pourtant je ne suis pas le seul à m'y intéresser...

  15. #12
    microchip

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Bonsoir,

    Je te recommande d'utiliser le compilateur C HiTech appelé Lite mode (version non optimisée gratuite) plutot que le CC5X :
    http://microchip.htsoft.com/products...cpro-modes.php

    Pour CC5X tu peux trouver des exemples ici :
    http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    Here to help ;=)

  16. Publicité
  17. #13
    Jemy

    Re : PIC16F690 & LPC DémoBoard de MicroChip

    Salut microchip !

    Merci de ta réponse. En effet, les compilateurs HiTech Lite, ainsi que celui de CCS possèdent une bonne documentation ( au moins dans leurs manuels il y est expliqué comment configurer les bits de configuration ).

    Je change donc de compilateur, et vais tester CCS et HiTech Lite.

    Autrement, peux-tu jeter un oeil à http://forums.futura-sciences.com/el...ion-pic-c.html

    et me conseiller si tu as de bonnes réferences en matière de bouquins?

    Ah, et pour finir :

    Code:
    #pragma config = 0b00000100
    que j'ai trouvé en testant un peu différentes combinaisons au hasard, désactive le WatchDog. De plus, avec cette commande, je n'ai plus de soucis avec le bouton poussoir SW1 de la carte (c'était donc un problème au niveau des bits de config )... En ésperant que ça pourra aider quelqu'un un jour, et que quelqu'un pourra m'éxpliquer comment régler les bits de config avec CC5.

Sur le même thème :

Discussions similaires

  1. Réponses: 25
    Dernier message: 18/08/2008, 13h29
  2. Message d'erreur sur MPLAB pour PIC16F690!!!
    Par benjamin pagé dans le forum Électronique
    Réponses: 15
    Dernier message: 25/06/2008, 10h36
  3. question sur PIC16F690
    Par benjamin pagé dans le forum Électronique
    Réponses: 2
    Dernier message: 02/06/2008, 10h19
  4. Communication > LPC Flash / 16F627
    Par dreamstyle dans le forum Électronique
    Réponses: 0
    Dernier message: 10/07/2007, 16h44