Informatique Industrielle : Exercices Tests et sauts conditionnels et inconditionnels
Télécharger PDFTests et Sauts Conditionnels et Inconditionnels en PIC
Les instructions de sauts conditionnels permettent de modifier l'exécution d'un programme en fonction d'une condition. Voici les principales instructions :
- BTFSC : Branche si le bit est clair (0). Syntaxe :
BTFSC f,b - BTFSS : Branche si le bit est à 1. Syntaxe :
BTFSS f,b - DECFSZ : Décrémente un fichier et branche si le résultat n'est pas nul.
- INCFSZ : Incrémente un fichier et branche si le résultat n'est pas nul.
Les instructions de sauts inconditionnels permettent de sauter à une autre adresse dans le programme :
- GOTO : Saute à une adresse donnée. Syntaxe :
GOTO k - CALL : Appelle une sous-routine. Syntaxe :
CALL k - RETURN : Retourne à l'instruction suivante après un appel.
- RETLW : Retourne avec une valeur littérale.
- RETFIE : Retourne après une interruption.
Types de Tests
Il existe deux structures de base pour les tests :
- Un seul choix : Si la condition est vraie, exécuter un choix et continuer ; sinon, continuer sans action.
- Deux choix : Si la condition est vraie, exécuter le choix 1 ; sinon, exécuter le choix 2.
Exercice 1 : Allumage d'une LED selon un Interrupteur
1) Donner l'organigramme :
- Début
- Choisir et configurer le PIC
- Initialisation des ports
- Test : RA0 = 0 ? (Interrupteur fermé ?)
- Si non → RA4 = 1 (LED éteinte), retour à l'étape 3
- Si oui → RA4 = 0 (LED allumée), retour à l'étape 3
- Fin
2) Programme en Assembleur :
LIST P=16F877A
INCLUDE <P16F877A.INC>
ORG 0x00
GOTO MAIN
MAIN:
; Configuration du PIC
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
CLRF PORTA
CLRF PORTB
LOOP:
; Test de l'interrupteur
BTFSC RA0
GOTO LED_EINTE
BTFSS RA0
GOTO LED_AINTE
LED_EINTE:
; LED éteinte
BCF RA4
GOTO LOOP
LED_AINTE:
; LED allumée
BSF RA4
GOTO LOOP
END
3) Programme en mikroC :
#include <16F877A.h>
void main() {
TRISA = 0x00; // RA0 en entrée, RA4 en sortie
TRISB = 0x00;
PORTA = 0x00;
PORTB = 0x00;
while(1) {
if(!RA0) { // Interrupteur fermé
RA4 = 0; // LED allumée
}
else { // Interrupteur ouvert
RA4 = 1; // LED éteinte
}
}
}
Exercice 2 : Contrôle d'un Moteur et de LED selon un Interrupteur
1) Donner l'organigramme :
- Début
- Choisir et configurer le PIC
- Initialisation des ports
- Test : RB5 = 0 ? (Interrupteur fermé ?)
- Si non → RB7 = 1 (LED jaune allumée), RB6 = 0 (LED verte éteinte), RB0 = 0 (moteur arrêté), retour à l'étape 3
- Si oui → RB7 = 0 (LED jaune éteinte), RB6 = 1 (LED verte allumée), RB0 = 1 (moteur en marche), retour à l'étape 3
- Fin
2) Programme en Assembleur :
LIST P=16F877A
INCLUDE <P16F877A.INC>
ORG 0x00
GOTO MAIN
MAIN:
; Configuration du PIC
MOVLW B'00000000'
MOVWF TRISB
CLRF PORTB
LOOP:
; Test de l'interrupteur
BTFSC RB5
GOTO MOTEUR_ARRETE
BTFSS RB5
GOTO MOTEUR_MARCHE
MOTEUR_ARRETE:
; Moteur arrêté, LED verte éteinte, LED jaune allumée
BCF RB0
BCF RB6
BSF RB7
GOTO LOOP
MOTEUR_MARCHE:
; Moteur en marche, LED verte allumée, LED jaune éteinte
BSF RB0
BSF RB6
BCF RB7
GOTO LOOP
END
3) Programme en mikroC :
#include <16F877A.h>
void main() {
TRISB = 0x00; // RB0, RB5, RB6, RB7 en sorties
PORTB = 0x00;
while(1) {
if(!RB5) { // Interrupteur fermé
RB0 = 1; // Moteur en marche
RB6 = 1; // LED verte allumée
RB7 = 0; // LED jaune éteinte
}
else { // Interrupteur ouvert
RB0 = 0; // Moteur arrêté
RB6 = 0; // LED verte éteinte
RB7 = 1; // LED jaune allumée
}
}
}
Exercice 3 : Comparateur Hexadécimal (4 bits)
1) Donner l'organigramme :
- Début
- Choisir et configurer le PIC
- Déclarer les variables nombreA et nombreB
- Initialisation des ports
- Lire PORTB
- Copier PORTB dans nombreA
- Copier PORTB dans nombreB
- Permuter les quartets de poids fort et faible de nombreB
- Masquer le quartet de poids fort de nombreA
- Masquer le quartet de poids fort de nombreB
- Soustraction nombreA - nombreB
- Test : résultat = 0 ?
- Si oui → Allumer LED verte (PORTA = 0x01), boucler
- Si non → Test : résultat > 0 ?
- Si oui → Allumer LED rouge (PORTA = 0x02), boucler
- Si non → Allumer LED jaune (PORTA = 0x04), boucler
- Fin
2) Programme en Assembleur :
LIST P=16F877A
INCLUDE <P16F877A.INC>
ORG 0x00
GOTO MAIN
MAIN:
; Configuration du PIC
MOVLW B'00000000'
MOVWF TRISA
MOVWF TRISB
CLRF PORTA
CLRF PORTB
LOOP:
; Lire PORTB
MOVF PORTB, W
; Copier dans nombreA (WREG = nombreA)
MOVWF nombreA
; Copier dans nombreB (WREG = nombreB)
MOVWF nombreB
; Permuter quartets de nombreB
SWAPF nombreB, W
MOVWF nombreB
; Masquer quartet de poids fort de nombreA
ANDLW B'00001111'
MOVWF nombreA
; Masquer quartet de poids fort de nombreB
ANDLW B'00001111'
MOVWF nombreB
; Soustraction nombreA - nombreB
MOVF nombreA, W
SUBWF nombreB, W
; Test du résultat
BTFSC STATUS, Z
GOTO LED_VERTE
BTFSS STATUS, Z
GOTO TEST_SIGN
TEST_SIGN:
; Test si résultat > 0
BTFSC STATUS, C
GOTO LED_JAUNE
BTFSS STATUS, C
GOTO LED_ROUGE
LED_VERTE:
; Allumer LED verte
MOVLW B'00000001'
MOVWF PORTA
GOTO LOOP
LED_ROUGE:
; Allumer LED rouge
MOVLW B'00000010'
MOVWF PORTA
GOTO LOOP
LED_JAUNE:
; Allumer LED jaune
MOVLW B'00000100'
MOVWF PORTA
GOTO LOOP
nombreA RES 1
nombreB RES 1
END
3) Programme en mikroC :
#include <16F877A.h>
unsigned char nombreA, nombreB;
void main() {
TRISA = 0x00; // PORTA en sortie
TRISB = 0x00; // PORTB en entrée
PORTA = 0x00;
PORTB = 0x00;
while(1) {
nombreA = PORTB; // Copie PORTB dans nombreA
nombreB = nombreA; // Copie nombreA dans nombreB
nombreB = (nombreB & 0x0F) << 4 | (nombreB & 0xF0) >> 4; // Permutation des quartets
nombreA = nombreA & 0x0F; // Masque quartet de poids fort de nombreA
nombreB = nombreB & 0x0F; // Masque quartet de poids fort de nombreB
if(nombreA == nombreB) {
PORTA = 0x01; // LED verte allumée
}
else if(nombreA > nombreB) {
PORTA = 0x02; // LED rouge allumée
}
else {
PORTA = 0x04; // LED jaune allumée
}
}
}
FAQ
Qu'est-ce qu'un saut conditionnel en assembleur ?
Un saut conditionnel est une instruction qui permet de modifier l'exécution d'un programme en fonction de la valeur d'un bit ou d'une condition. Par exemple, BTFSC et BTFSS testent un bit et sautent si la condition est remplie.
Comment configurer un port en entrée/sortie en mikroC ?
En mikroC, utilisez les registres TRIx pour configurer les ports en entrée ou sortie. Par exemple, TRISB = 0x00; configure tous les bits de PORTB en sortie, tandis que TRISB = 0xFF; les configure en entrée.
À quoi sert la permutation des bits en assembleur ?
La permutation des bits permet de réorganiser les données dans un registre. Par exemple, dans l'exercice 3, la commande SWAPF nombreB, W échange les quartets de poids fort et faible pour isoler les bits nécessaires à la comparaison.