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 veu que suivant ce code il ait le flag correspondant qui soit mis a 1
un exemple pour une meilleur comprehension :
code reçut : b'0010' , flag2 mis a 1
code reçut : 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 methode du compteur programme car j'utilise des interuptions et sa fou le bordel
deux exemples que j'ai laissé tomber :
un parcequ'il est trop long :
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 parcequ'il me donne un comportement bizard et qu'il n'est pas au point :
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
-----