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; } } }
Partager