IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

[PIC 16F876] Séparation unités et dizaines


Sujet :

Autres architectures Assembleur

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [PIC 16F876] Séparation unités et dizaines
    Bonjour à tous.

    Voilà. J'ai un petit problème. J'utilise un 16F876 avec décodeur A/N. Je reçois bien mes valeurs décimales avec 0 = 0V et 1000 = 5V. Pour avoir la valeur réelle, je divise le résultat que j'obtiens par 200.

    Exemple : 653 vaut (653/200) = 3,265v.
    Je multiplie (3,265 * 10) et j'ai 32.

    Sauf que j'ai 2 afficheurs sur mon PORTB qui est équipé de 2 décodeurs 74C48. Donc, je voudrais récupérer le nombre 32 en 2 nombres « 3 » et « 2 » pour que je puisse faire la conversion décimale ((3*16) + 2) = 50 et envoyer au PORTB = 50 soit '0b01010000'.

    Je pense qu'il y a beaucoup plus simple, mais c'est des essais que je fais. Je n'ai rien de bien précis sauf celle de comprendre la conversion A/N.

    Je suis sur GNU/Linux Debian, j'utilise Piklab avec programmeur Pickit2 a l'aide de Pk2cmd. Mon compilateur est SDCC programmation en C.

    En gros je vous demande juste comment récupérer 32 en 2 valeurs 3 et 2 merci.


    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    /* ----------------------------------------------------------------------- */
    /* Fichier source modèle généré par Piklab */
    #include <pic16f876.h>
     
    /* ----------------------------------------------------------------------- */
    /* Bits de configuration: adapté à votre dispositif et à vos besoins */
    typedef unsigned int word;
    word at 0x2007 CONFIG = 0x3F39;
     
    //word at 0x2007 CONFIG = _RC_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_ON & _DEBUG_OFF & _CP_OFF;
     
    void flash(int valeur)
    {
     
    }
     
     
    void main()
    {
     
    	int temps;
    	unsigned int valeur;
    	int DIGIT;
     
    	TRISA = 0xFF;  // 1 = Entree 0 = Sortie
    	TRISB = 0x00;
     
    	OPTION_REG = 0xC7; // reglage option temps
    	TMR0 = 0; // Mise a 0
     
    	ADCON1 = 0x80; // configuration pour entree A/D 0x06 Dig 0x00 analogique
     
    	PORTA = 0x00; //etat des pattes 
    	PORTB = 0x00; 
     
    	temps = 0;
    	valeur = 0;
    	DIGIT = 0;
     
    	while(DIGIT < 9) // Test
    	{
    		if (TMR0 > 250)
    		{
    			TMR0 = 0;
    			temps++;
    		}
     
    		if (temps >= 8)
    		{
    			DIGIT++;
    			PORTB = DIGIT;
    			temps = 0;
    		}
    	}
     
    	PORTB = 0x00;
     
    	while (1)
    	{	
    		if (TMR0 > 250)
    		{
    			TMR0 = 0;
    			temps++;
    		}
     
    		if (temps >= 8) // mise a jour toutes les 1/2 second
    		{
     
    			ADCON0 = 0xC5; // Reglage du port a controler demarrage test
    			ADCON1 = 0x80; // Reglage decodeur sur 8 bits a droite
     
    			valeur = ADRESH;	// recuperation
    			valeur <<= 8;		// des valeurs
    			valeur |= ADRESL;	// analogique
    			PORTB = ((valeur / 200)* 10); //obtenir la valeur réel et l'envois
     
    			temps = 0;
    		}
     
    	}
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    Le fait de coder un chiffre décimal sur exactement quatre bits pour faire ce que tu veux faire s'appelle BCD (Binary Coded Decimal) et est extrêmement répandu.

    Par contre, ton souci est que ton nombre « 32 » est acquis en binaire et qu'il n'y a rien qui indique a priori à ton micro-contrôleur qu'il s'écrit en deux chiffres en décimal. Il faut donc faire une conversion de base qui est un thème très largement débattu sur ce forum (ainsi que sur C) : pour convertir ton nombre binaire en décimal, il faut le diviser par dix et examiner le reste : celui-ci sera la valeur du chiffre le plus à droite. Tu refais ces opérations en boucle jusqu'à ce que ton quotient soit nul pour obtenir tous les chiffres de droite à gauche.

    À chaque fois que tu obtiens un chiffre, tu décales de quatre bits la valeur à envoyer et fais un OU logique avec la valeur du chiffre en question.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    Le fait de coder un chiffre décimal sur exactement quatre bits pour faire ce que tu veux faire s'appelle BCD (Binary Coded Decimal) et est extrêmement répandu.

    Par contre, ton souci est que ton nombre « 32 » est acquis en binaire et qu'il n'y a rien qui indique a priori à ton micro-contrôleur qu'il s'écrit en deux chiffres en décimal. Il faut donc faire une conversion de base qui est un thème très largement débattu sur ce forum (ainsi que sur C) : pour convertir ton nombre binaire en décimal, il faut le diviser par dix et examiner le reste : celui-ci sera la valeur du chiffre le plus à droite. Tu refais ces opérations en boucle jusqu'à ce que ton quotient soit nul pour obtenir tous les chiffres de droite à gauche.

    À chaque fois que tu obtiens un chiffre, tu décales de quatre bits la valeur à envoyer et fais un OU logique avec la valeur du chiffre en question.


    Bonjour, merci pour ces infos. Donc, j'ai réussi à résoudre le problème et je joins le programme modifié.

    J'ai modifié cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    valH = (valeur / 200);
    valL = ((valeur / 20) - (valH * 10));
    PORTB = ((valH * 16) + valL); //obtenir la valeur réelle et l'envoyer
    Code Complet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    /* ----------------------------------------------------------------------- */
    /* Fichier source modèle généré par Piklab */
    #include <pic16f876.h>
     
    /* ----------------------------------------------------------------------- */
    /* Bits de configuration: adapté à votre dispositif et à vos besoins */
    typedef unsigned int word;
    word at 0x2007 CONFIG = 0x3F39;
     
    //word at 0x2007 CONFIG = _RC_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_ON & _DEBUG_OFF & _CP_OFF;
     
    void flash(int valeur)
    {
     
    }
     
     
    void main()
    {
     
    	int temps;
    	unsigned int valeur;
    	int valH;
    	int valL;
    	int DIGIT;
     
    	TRISA = 0xFF;  // 1 = Entree 0 = Sortie
    	TRISB = 0x00;
     
    	OPTION_REG = 0xC7; // reglage option temps
    	TMR0 = 0; // Mise a 0
     
    	ADCON1 = 0x80; // configuration pour entree A/D 0x06 Dig 0x00 analogique
     
    	PORTA = 0x00; //etat des pattes 
    	PORTB = 0x00; // tous etaint
     
    	temps = 0;
    	valeur = 0;
    	DIGIT = 0;
    	valH = 0;
    	valL = 0;
     
    	while(DIGIT < 9) // Test
    	{
    		if (TMR0 > 250)
    		{
    			TMR0 = 0;
    			temps++;
    		}
     
    		if (temps >= 8)
    		{
    			DIGIT++;
    			PORTB = DIGIT;
    			temps = 0;
    		}
    	}
     
    	PORTB = 0x00;
    	PORTB = 54;
    	TMR0 = 0;
     
    	while (1)
    	{	
    		if (TMR0 > 250)
    		{
    			TMR0 = 0;
    			temps++;
    		}
     
    		if (temps >= 8) // mise a jour toutes les 1/2 second
    		{
     
    			ADCON0 = 0xC5; // Reglage du port a controler demarrage test
    			//ADCON1 = 0x80; // Reglage decodeur sur 8 bits a droite
     
    			valeur = ADRESH;	// recuperation
    			valeur <<= 8;		// des valeurs
    			valeur |= ADRESL;	// analogique
     
    			valH = (valeur / 200);
    			valL = ((valeur / 20) - (valH * 10));
     
    			PORTB = ((valH * 16) + valL); //obtenir la valeur réel et l'envois
     
    			temps = 0;
    		}
     
    	}
    }
    J'ai une bonne précision quand j'ai 3,74V après conversion j'ai 3,7 et si j'ai 3,78 j'ai 3,8V. Normal, car je prend que 2 chiffres, mais je suis satisfait du résultat. Je pensais que cela était moins précis, mais là, je suis très surpris de la précision.

Discussions similaires

  1. Électrocardiogramme avec PIC 16F876
    Par elmhmdi dans le forum C
    Réponses: 10
    Dernier message: 14/06/2015, 11h21
  2. Réponses: 5
    Dernier message: 17/04/2013, 12h08
  3. [PIC 16F876] Signal carré
    Par rototo1 dans le forum Autres architectures
    Réponses: 1
    Dernier message: 27/03/2013, 08h07
  4. [PIC 16F876] Plugin pour afficheur lcd
    Par jpwitz dans le forum MPLAB
    Réponses: 7
    Dernier message: 03/05/2011, 18h43
  5. [PIC 16F876] Quel Assembleur ?
    Par kaw dans le forum MPLAB
    Réponses: 5
    Dernier message: 04/04/2006, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo