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

Masque en C PIC16F690



  1. #1
    Zeruel

    Red face Masque en C PIC16F690

    Bonjour à tous!

    Voila c'est mon premier message sur vos forums. On trouve vraiment plein de chose dessus!^^

    Venons en au fait: je me suis mis sérieusement à la programmation des PIC en language évolué (ici le C). Je suis équipé d'un PIC KIT 2 officiel avec la carte de demonstration sur laquelle il y a un PIC 16F690. J'ai comme compilateur la version LITE de HI-TECH SOFTWARE. Apparamment, la seule difference avec la version payante du compilateur (donc non limité) c'est une fonction qui réduit la taille du code de 50%.

    J'ai appris le C à l'IUT (je suis maintenant en école d'ingé) mais j'ai un souci avec les masques que je fais pour changer la valeur d'une sortie.
    Pour lire une valeur pas de souci:

    ex: lire RA7 --> PORTA=PORTA & 0b01000000;

    Par contre, pour les sorties, si RC est à 1 par exemple, quand je veux mettre RC1 à 1 sans toucher à RC0, je fais ce masque:

    PORTC=PORTC | 0b00000010;

    Et là, RC0 tombe mystérieusement à 0, et RC1 monte bien à 1.
    Si je fais ca:

    RC0=1;
    RC1=1;

    RC0 tombe à 0 une fois l'instruction RC1=1; exécutée.
    Je comprends pas... Pourtant le masque est correcte. J'ai essayé de cerner le souci, alors j'ai fais qq tests. Quand je fais:

    PORTC=0b00000001; //RC0 passe a 1
    PORTC=PORTC; //ligne à priori inutile

    La ligne inutile ne semble en faite pas si inuile que ça, puisque une fois exécuté, RC0 passe à 0. Ca veut donc dire que le registre du PORT C repasse à 0.La seule solution que j'ai trouvé c'est ca:

    PORTC_ACTUEL = PORTC = 0b00000001;
    PORTC = PORTC_ACTUEL|0b00000010;

    Et la j'ai bien RC0 et RC1 à 1...

    Si je fais ca, ca ne marche pas ...

    PORTC=0b00000001;
    PORTC_ACTUEL=PORTC; //enregistrement de l'état du portc
    PORTC=PORTC_ACTUEL|0b00000010;


    C'est un peu galère comme code alors j'aimerais trouver une solution plus appropriée..
    Je sais pas si vous connaissez d'autres compilateur C gratuit, ou si vous avez une solution.
    D'avance merci!

    -----


  2. Publicité
  3. #2
    maximilien

    Re : Masque en C PIC16F690

    Hi tech reconnait RA0...
    Donc pas besoin de masques...

  4. #3
    maximilien

    Re : Masque en C PIC16F690

    J'ai lu peut être en un peu rapide...
    As tu tester ou simuler le fonctionnement?
    As tu défini les TRISA...?

  5. #4
    Zeruel

    Re : Masque en C PIC16F690

    Voici mon programme qui marche:

    #include <htc.h>

    void main(void){
    unsigned int g=0, PORTC_ACTUEL;
    TRISC=0b00000000;
    PORTC=0b00000000;

    while(1){

    PORTC=0x00;
    for(g=0;g<10000;g++);
    //PORTC=(PORTC|0x01);
    PORTC_ACTUEL=PORTC=0b00000001;
    for(g=0;g<10000;g++);
    PORTC=PORTC_ACTUEL|0b00000010;
    for(g=0;g<30000;g++);

    }
    }


    J'utilise le PORTC en sortie, les pins RC0, RC1, RC2 et RC3 étant reliés à des LED sur la carte de demo.
    Ne faites pas gaffe aux boucles FOR, elles sont la pour ralentir l'execution du prog, sinon je vois pas les LED s'allumer (2MHz l'horloge d'intruction...).
    Dans le while, je mets Le port C à 0, puis RC0 à 1, puis RC1 à 1 sans toucher à RC0 (qui reste donc à 1) puis je reboucle.

  6. #5
    mister_e

    Re : Masque en C PIC16F690

    Il y a des convertisseurs analogues qui doivent être désactivés avant!
    ANSEL=0;
    ANSELH=0;

    Consulte la datasheet pour confirmer
    Steve

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

    Re : Masque en C PIC16F690

    Ouais super, c'est ca!
    extrait de la datasheet:
    Setting the ANSx bit of a corresponding pin will
    cause all digital reads of that pin to return ‘0’ and also
    permit analog functions of that pin to operate correctly.
    The state of the ANSx bit has no effect on the digital
    output function of its corresponding pin. A pin with the
    TRISx bit clear and ANSx bit set will operate as a digital
    output, together with the analog input function of that
    pin. Pins with the ANSx bit set always read ‘0’, which
    can cause unexpected behavior when executing read
    or write operations on the port due to the
    read-modify-write sequence of all such operations.


    Une bonne chose à retenir sur les pic:
    Un registre correspondant à une fonction d'entrée d'une broche configurée en sortie peut interférer son fonctionnement....
    Merci beaucoup!!

    Je m'en vais me battre avec mes TIMER maintenant hihi!

  9. Publicité

Sur le même thème :

Discussions similaires

  1. PIC16F690 et afficheur LCD 1x16
    Par bugdamon dans le forum Électronique
    Réponses: 20
    Dernier message: 01/04/2009, 16h31
  2. Problème d'entrée sur un pic16f690
    Par v2h dans le forum Électronique
    Réponses: 15
    Dernier message: 17/02/2009, 19h00
  3. PIC16F690 & LPC DémoBoard de MicroChip
    Par Jemy dans le forum Électronique
    Réponses: 12
    Dernier message: 06/11/2008, 09h51
  4. Message d'erreur sur MPLAB pour PIC16F690!!!
    Par benjamin pagé dans le forum Électronique
    Réponses: 15
    Dernier message: 25/06/2008, 10h36
  5. question sur PIC16F690
    Par benjamin pagé dans le forum Électronique
    Réponses: 2
    Dernier message: 02/06/2008, 10h19