Bonjour

Je vous explique mon probleme, j'ai un pic16f84a qui reçoit un code sur 4 bits (RB3,4,5 et 6) et je veux que, suivant ce code, il ait le flag correspondant qui soit mis à 1.
Un exemple pour une meilleure compréhension :
code reçu : b'0010' , flag2 mis a 1
code reçu : b'0101' , flag5 mis a 1
jusqu'au flag16

Donc il me faudrait un algorithme qui me fasse ce boulot mais qui n'utilise pas la méthode du compteur programme car j'utilise des interuptions et ça fout le bordel.

Deux exemples que j'ai laissé tomber :

Un parce qu'il est trop long :
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
93
94
95
96
97
98
99
100
101
decodeur CLRF reserve_1 ; nettoyage des reserves de flag
CLRF reserve_2
 
MOVF sauv_4bits_PORTB,0 ; mise du code dans W
SUBLW b'0000' ; soustraction du code avec 0000
BTFSC STATUS,Z ; test du resultat
RETURN ; si la soustraction donne 1 alors partir sinon code suivant
MOVF sauv_4bits_PORTB,0
SUBLW b'0001'
BTFSC STATUS,Z
GOTO decod_1
MOVF sauv_4bits_PORTB,0
SUBLW b'0010'
BTFSC STATUS,Z
GOTO decod_2
MOVF sauv_4bits_PORTB,0
SUBLW b'0011'
BTFSC STATUS,Z
GOTO decod_3
MOVF sauv_4bits_PORTB,0
SUBLW b'0100'
BTFSC STATUS,Z
GOTO decod_4
MOVF sauv_4bits_PORTB,0
SUBLW b'0101'
BTFSC STATUS,Z
GOTO decod_5
MOVF sauv_4bits_PORTB,0
SUBLW b'0110'
BTFSC STATUS,Z
GOTO decod_6
MOVF sauv_4bits_PORTB,0
SUBLW b'0111'
BTFSC STATUS,Z
GOTO decod_7
MOVF sauv_4bits_PORTB,0
SUBLW b'1000'
BTFSC STATUS,Z
GOTO decod_8
MOVF sauv_4bits_PORTB,0
SUBLW b'1001'
BTFSC STATUS,Z
GOTO decod_9
MOVF sauv_4bits_PORTB,0
SUBLW b'1010'
BTFSC STATUS,Z
GOTO decod_10
MOVF sauv_4bits_PORTB,0
SUBLW b'1011'
BTFSC STATUS,Z
GOTO decod_11
MOVF sauv_4bits_PORTB,0
SUBLW b'1100'
BTFSC STATUS,Z
GOTO decod_12
MOVF sauv_4bits_PORTB,0
SUBLW b'1101'
BTFSC STATUS,Z
GOTO decod_13
MOVF sauv_4bits_PORTB,0
SUBLW b'1110'
BTFSC STATUS,Z
GOTO decod_14
MOVF sauv_4bits_PORTB,0
SUBLW b'1111'
BTFSC STATUS,Z
GOTO decod_15
 
RETURN
 
decod_1 BSF reserve_1,flag_telec_avant ; si code=0001 alors mettre a 1 flag correspondant
RETURN ; et partir
decod_2 BSF reserve_1,flag_telec_arriere
RETURN
decod_3 BSF reserve_1,flag_telec_gauche
RETURN
decod_4 BSF reserve_1,flag_telec_droite
RETURN
decod_5 BSF reserve_1,flag_telec_stop
RETURN
decod_6 BSF reserve_1,flag_telec_7
RETURN
decod_7 BSF reserve_1,flag_telec_8
RETURN
decod_8 BSF reserve_1,flag_telec_9
RETURN
decod_9 BSF reserve_2,flag_telec_10
RETURN
decod_10 BSF reserve_2,flag_telec_11
RETURN
decod_11 BSF reserve_2,flag_telec_12
RETURN
decod_12 BSF reserve_2,flag_telec_13
RETURN
decod_13 BSF reserve_2,flag_telec_14
RETURN
decod_14 BSF reserve_2,flag_telec_15
RETURN
decod_15 BSF reserve_2,flag_telec_16
 
RETURN
L'autre parce qu'il me donne un comportement bizarre et qu'il n'est pas au point :

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
decodeur CLRF reserve_1 ; nettoyage des reserves de flag
CLRF reserve_2
 
 
MOVF sauv_4bits_PORTB,0 ; mise du code dans W, code de la forme '00011110'
ADDWF PCL,1 ; adition de W avec le compteur de ligne de programme
NOP ; si le code=0 (cad demande telec/auto) ne rien faire
RETURN
BSF reserve_1,flag_telec_avant ; si code=0001 alors mettre a 1 flag correspondant
RETURN ; et partir
BSF reserve_1,flag_telec_arriere
RETURN
BSF reserve_1,flag_telec_gauche
RETURN
BSF reserve_1,flag_telec_droite
RETURN
BSF reserve_1,flag_telec_stop
RETURN
BSF reserve_1,flag_telec_7
RETURN
BSF reserve_1,flag_telec_8
RETURN
BSF reserve_1,flag_telec_9
RETURN
BSF reserve_2,flag_telec_10
RETURN
BSF reserve_2,flag_telec_11
RETURN
BSF reserve_2,flag_telec_12
RETURN
BSF reserve_2,flag_telec_13
RETURN
BSF reserve_2,flag_telec_14
RETURN
BSF reserve_2,flag_telec_15
RETURN
BSF reserve_2,flag_telec_16
 
RETURN