Assembleur/PIC16F68
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Assembleur/PIC16F68



  1. #1
    invite50000e23

    Assembleur/PIC16F68


    ------

    Bonjour,

    je dois réaliser en langage assembleur un code pour "mesurer" le niveau sonore. J'ai déjà fait un circuit avec microphone electret qui me donne une tension alternative en sortie (entre 0 et 3V je dirai), je veux utiliser un microchip pour éclairer 1, 2, 3, ou 4 LEDs selon ce niveau (elles sont sur RC0/1/2/3).

    J'ai déjà le code pour convertir l'analogique en digital (entrée sur RA0) -il était donné avec la datasheet, je n'ai aucun mérite ^^- mais comme je ne connais pas grand chose à l'assembleur, je ne vois pas du tout comment procéder ensuite.

    J'avais pensé pendre X valeurs de ce signal pendant un temps t et d'en faire la moyenne. Ensuite comparer cette moyenne à certains seuils (genre entre 0 et 1V = une LED d'affichée etc) pour savoir combien de LED je dois allumer.

    En fait, je ne sais pas du tout comment réaliser toute cette partie (sauf la toute fin, j'ai déjà essayer d'allumer des LED etc)... J'ai recherché sur le net, mais mes recherches n'aboutissent pas.

    Si vous aviez des pistes (par exemple des sites d'explications ou des fonctions qui me seront utiles), je vous en serai très reconnaissant !

    En vous remerciant !

    -----

  2. #2
    invite89303051

    Re : Assembleur/PIC16F68

    Bonjour,

    tu as aussi la possibilité de mettre une capa avant l'entrée de convertion, ce qui moyennera ton niveau sonore.
    ensuite, de simples test :
    level = ReadADC();
    if(level >= seuil1)
    {
    led1 = ON;
    }
    else
    {
    led1 = OFF;
    }
    if(level >= seuil2)
    {
    led2 = ON;
    }
    else
    {
    led2 = OFF;
    }
    et ainsi de suite

    Cordialement

  3. #3
    invite50000e23

    Re : Assembleur/PIC16F68

    Merci, mais on voulait faire la moyenne au niveau du micro-chip et je dois réaliser mon prog en assembleur.
    Je pense avoir trouvé quelques trucs pour avancer. Déjà j'avais pas bien compris ce que me ressortais la conversion A/D, j'ai déjà la valeur à un instant t, il me suffit de les sommer et de faire la moyenne (chiant pcq on ne peut pas diviser facilement).

    Enfin, j'avance !

  4. #4
    invite89303051

    Re : Assembleur/PIC16F68

    Bonjour,

    Pour diviser rapidement, il suffit de moyenner sur un nombre pair de valeur et de faire le nombre nécessaire et suffisant de rotation à droite du résultat


    Cordialement

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

    Re : Assembleur/PIC16F68

    Ops, il faut moyenner sur un nombre 2n pour utiliser les n rotations. Je me disais bien qu'il y avait un truc qui ne fonctionnait pas

  7. #6
    invite092cb13c

    Re : Assembleur/PIC16F68

    Bonjour
    Tu n'as que quatre valeurs à connaitre, moi je te conseillerai de faire tes calculs en dehors du pic.
    Tu fais deux mesures (valeurs brutes en 8 bits) tu les additionnes et tu divises par deux ( decalage à droite) tu refais un mesure tu additionnes et tu divise à nouveau par deux ainsi de suite pour un dizaines de mesure tu obtiens à peut pres une moyenne que tu compares à l'une des quatre valeurs brutes pour chaque led.
    Pour les valeurs tu mesures sur 5V donc la valeur brute (en 8 bits) est 51 pour 1V, 102 pour 2V etc. Tu compares ta pseudo moyenne avec 51 ou 102 ou les autres pour savoir quelle(s) led(s) allumée(s).
    Tous mon propos pour te dire que si tu peux eviter des divisions en assembleur 16F c'est plus rapide et plus simple, par exemple les convertisseurs AN donnent des valeurs sur 10 bits mais pour ton cas une precision en 8 bits est largement suffisante ce qui est plus simple avec un pic en 8 bits.
    De plus si ta tension maxi est inferieur à 2.49V la tu aurras tout gagné car tu aurras des valeurs max en 7 bits ce qui simplifie le traitement des additions car aditionner deux tensions de 2.49V te donne un nombre sur 8 bits, tu n'es donc pas obligé de surveiller les retenues.
    Gilles

  8. #7
    invite50000e23

    Re : Assembleur/PIC16F68

    Merci pour les réponses, je vais essayer tout ça.

  9. #8
    invite50000e23

    Re : Assembleur/PIC16F68

    Ah oui, une autre question. Lorsque je fais ma conversion A/D et que je la configure, j'ai dans ADCON0 le choix entre right justifed ou left justified, kesako ?
    Comme le résultat est sur 10 bits, je pensais que c'était la "répartition" des bits entre Resulthi et Resultlo... En gros 2-8 ou 8-2, c'est ça ?
    Moi je vais plutôt prendre 8-2 (pour garder les 8 premières), donc left justified, non ?

  10. #9
    invite50000e23

    Re : Assembleur/PIC16F68

    J'ai trouvé sur internet une méthode assez rapide pour diviser.

    Pour diviser un nombre par une constante, il suffit de multiplier ce nombre par une autre constante qui vaut : 256 divisé par la constante initiale.
    On obtient un résultat sur 16 bits, le résultat de la division se trouve dans l’octet de poids fort.
    Exemple :
    Pour diviser un nombre par 10, il suffit de le multiplier par (256/10). En hexadécimal, 256/10 donne 0x19 ou 0x1A (il faut bien arrondir)
    Imaginons que notre variable contienne la valeur 120 décimal, soit 0x78.
    Si on multiplie 0x78 par 0x1A, ça donne 0x0C30. Le poids fort est donc 0x0C, ce qui donne 12 en décimal.
    Si on avait choisi 0x19, on aurait trouvé 11 comme réponse.

  11. #10
    invite092cb13c

    Re : Assembleur/PIC16F68

    Bonjour
    Multiplier est presque aussi penible que diviser sauf pour les multiplications/divisions par 2,4,8 etc qui sont des decalages à gauche ou a droite.
    Gilles

  12. #11
    invite50000e23

    Re : Assembleur/PIC16F68

    Ouai, j'ai plutôt opté pour la solution "je divise par deux = RRF".

    Un truc que je ne comprends pas, c'est comment définir mes valeurs de références. J'ai en entrée une tension entre 2 et 4V que je vais abaisser pour qu'elle soit inférieure à 2,49V comme gedonet me l'a conseillé, comment je dis que VALEUR1 = 0,5V par exemple ? Enfin, je ne comprends pas bien comment on "converti"...

  13. #12
    invite092cb13c

    Re : Assembleur/PIC16F68

    Bonjour
    Pour definir tes valeurs de reference, c'est asses simple, on imagine que tu mesures avec Vref-=0V et Vref+= +5V (ce n'est qu'un exemple) tu mesures avec un resultat sur 8 bits (on utilise le formatage/justification pour choisir la precision) donc pour une variation de 1 bit tu as 5V/256= 0.0195V par bit. Pour 0.5V on doit avoir un valeur ref de 0.5/0.0195= 25.6 la valeur que l'on doit lire apres la convertion est 25 (ou 26).
    Gilles

Discussions similaires

  1. assembleur
    Par bird12358 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 30/09/2009, 18h07
  2. assembleur
    Par invite3b1bb13d dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 11/04/2009, 06h38
  3. pb assembleur
    Par invite89798d3f dans le forum Électronique
    Réponses: 3
    Dernier message: 24/04/2008, 11h11
  4. assembleur
    Par inviteacc27a21 dans le forum Électronique
    Réponses: 3
    Dernier message: 10/09/2007, 06h10
  5. C ou assembleur ?
    Par invite3c59dc04 dans le forum Électronique
    Réponses: 3
    Dernier message: 08/03/2006, 20h08
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...