Exercices tests et sauts conditionnels et inconditionnels -

Informatique Industrielle : Exercices Tests et sauts conditionnels et inconditionnels

Télécharger PDF

Tests 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.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne