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

CAN avec 16F88 ne fonctionne pas



  1. #1
    demos

    Unhappy CAN avec 16F88 ne fonctionne pas


    ------

    Bonjour a tous,

    je suis en train d'essayer de faire fonctionner mon pic mais rien ne fonctionne

    j'explique mon projet (tout bête) :

    je lis la valeur d'un potentiomètre, la compare avec une autre valeur prédéfini et suivant si je suis au dessus ou au dessous, j'allume ou j'etteind une led.

    Ma source (sous CCS C) :

    #include <16F88.h> //fichier propre au pic

    #use delay(clock=4000000) //horloge synchroniser avec le registre osccon

    #fuses INTRC_IO,MCLR,NOWDT,NOPROTECT, NOPUT,Brownout,

    #byte OSCCON = 0x8F //horloge
    #byte TRISA = 0x85 //entrée sortie du portA
    #byte PORTA = 0x05 //pour utilisation des pattes du portA
    #byte TRISB = 0x86 //entrée sortie du portB
    #byte PORTB = 0x06 //pour utilisation des pattes du portB
    #byte ANSEL = 0x9B //sert à configurer les entrées analogiques du pic
    #byte CMCON = 0x9C //comparateur
    #byte ADCON0 = 0x1F //pour configuration analogique numerique
    #bit ADON = ADCON0.0
    #bit GODONE = ADCON0.2
    #byte ADRESH = 0x1E //pour lire le resultat de la conversion

    int convert;
    int seuil;

    //declaration des fonctions
    int convADC8 (void); //fonction conversion analogique numerique
    void synchro (void);


    OSCCON = 0x68; //pour horloge synchro avec 4MHz
    ANSEL = 0x01; //autorisation convertisseur AN0 de ispdat
    CMCON = 7; //Blocage comparateur pour ne pas géner les IO

    TRISA = 0xA1; //definition des entrées sorties
    TRISB = 0x00; //definition des entrées sorties

    bit_set(PORTA,1); // au demarrage la led est allumé

    while(1)
    {


    synchro();
    convert = convADC8();

    seuil = 150;
    if (convert > seuil) //si tension secteur OK
    {

    bit_set(PORTA,1);
    }
    else
    {

    bit_clear(PORTA,1);
    }

    // FONCTIONS

    //---------------------------
    int convADC8 (void)
    //---------------------------

    {
    ADCON0 = 0x00; //initialisation du registre de CAN
    ADON = 1; //activation de la conversion
    delay_us(20);
    GODONE = 1; //on lance la conversion
    while (GODONE); // on attend que la conversion soir fini
    delay_us(40);
    ADON = 0; //on arrete la conversion
    return (ADRESH); // on stocke le resultat dans le registre ADRESH
    }

    //-----------------
    void synchro (void)
    //-----------------

    {
    convert = convADC8();
    if (convert)
    {
    do
    {
    convert = convADC8();
    }
    while(convert); //on boucle jusqu'attent que la variable prend
    //la valeur de la conversion
    }
    delay_ms(5);
    }


    Mon problème :

    je branche ma led s'allume, je tourne mon potentiomètre (câbler entre VCC (5V) et la masse) pour diminuer ma tension, ma led s'etteind je remonte la tension elle ne se rallume plus !!!!

    Si quelqu'un a une idée j'en serais ravis car je galère avec ce probleme depuis plusieurs jours...

    -----

  2. Publicité
  3. #2
    invite03481543

    Re : CAN avec 16F88 ne fonctionne pas

    Bonsoir,

    Code:
    //-----------------
    void synchro (void)
    //-----------------
    
    {
    convert = convADC8();
    if (convert)
    { 
    do
    {
    convert = convADC8(); 
    } 
    while(convert); //on boucle jusqu'attent que la variable prend
    //la valeur de la conversion
    }
    delay_ms(5);
    }
    Qu'espères-tu obtenir de bon avec cette fonction?

    La variable "convert" est le résultat de la conversion -> ADRESH, alors que tu veux boucler tant que la condition est vraie, mais vraie par rapport à quoi?

    Il serait plus astucieux de détecter le drapeau de fin de conversion (GO/DONE), c'est lui qui te préviendra que ta conversion est terminée.
    @+

  4. #3
    MiGaNuTs

    Re : CAN avec 16F88 ne fonctionne pas

    avec SDCC ce bout de code marche nickel ( a condition de bien initialiser le convertisseur avant bien sur)

    Code:
    unsigned int readAN(unsigned char voie){
    	unsigned char cT=6;
    	unsigned int iValAD=0;
    	ADCON0=(ADCON0&&0xc0)+(voie<<4)+1;
    	while(cT--);
    	GO_DONE=1;
    	while(GO_DONE);
    	iValAD=(ADRESH<<8)+ADRESL;
    	ADON=0;
    	return iValAD;
    	}
    bonne conversion

  5. #4
    invite03481543

    Re : CAN avec 16F88 ne fonctionne pas

    Oui sans doute, mais avec CCS je crois que la fonction convADC8() fais déjà ce travail.
    A vérifier vu que je n'utilise pas ce "compilo".
    @+

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    demos

    Thumbs up Re : CAN avec 16F88 ne fonctionne pas

    Bonjour et merci pour la reponse.

    j'ai donc modifier le code comme ceci


    Code:
    //---------------------------
    int    convADC8 (void)
    //---------------------------
    
    {
       ADCON0 = 0x00;   //initialisation du registre de CAN
       ADON = 1;        //activation de la conversion
       delay_us(20);
       GODONE = 1;      //on lance la conversion
       while (GODONE);  // on attend que la conversion soir fini
       convert = ADRESH;
       ADON = 0;        //on arrete la conversion
       return (convert); // on stocke le resultat dans le registre ADRESH
    }

    et la miracle cela fonctionne.

    Par contre j'ai un autre problème :

    en fait je compare la valeur convertie avec une valeur fixe, si elle est inferieures j'incremente une autre variable (défaut par exemple).

    En suite si "défaut" est supérieur a défaut_max je coupe mais je veut que ce test dure à peu prés 2 secondes.

    En fait je veut m'affranchir d'un creux de tension possible.

    je sais 2 secondes ça peut paraitre long pour un creux de tension mais c'est dans le cahier des charge.

    Merci encore.

  9. #6
    invite03481543

    Re : CAN avec 16F88 ne fonctionne pas

    Tu veux que ce soit le test qui dure 2s (on fait plusieurs mesures durant ce temps) ou bien que le test ne puisse être refait que 2s plus tard?

  10. Publicité
  11. #7
    demos

    Re : CAN avec 16F88 ne fonctionne pas

    Oui c'est bien cela, que le test dure 2 secondes en faisant plusieurs mesure.

Discussions similaires

  1. Programmer avec ICprog un 16F88
    Par yuopaznn dans le forum Électronique
    Réponses: 0
    Dernier message: 31/05/2008, 20h08
  2. Home cinéma ne fonctionne pas avec les sons AC3
    Par dw_hilll dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 12/05/2008, 10h57
  3. Programme avec PIC16F505 ne fonctionne pas
    Par michel5002 dans le forum Électronique
    Réponses: 18
    Dernier message: 02/02/2008, 10h31
  4. Autorun ne fonctionne pas avec les programmes MFC???
    Par EricWanda dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 24/05/2006, 10h59
  5. mes javascript:popupimage ne fonctionne pas sur mon site web mais fonctionne en local
    Par cead5311 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 6
    Dernier message: 28/01/2006, 17h31
Découvrez nos comparatifs produits sur l'informatique et les technologies.