Étape 5: logiciels
Pour obtenir la Darrel Taylor (DT) interruptions mises en place il sont deux choses à faire :
1.) Include le DT_INTS-14.bas et ReEnterPBP.bas les fichiers dans votre code.
2.) copiez et collez ceci dans votre code.
ASM
Macro INT_LIST ; IntSource, étiquette, Type, ResetFlag ?
INT_Handler RBC_INT, oui _ISR, PBP,
endm
INT_CREATE
ENDASM
Insérer des tabulations et des espaces comme le graphisme à la fin de l’Instructable donc vous pouvez voir les choses un peu plus facile dans votre code. Vous aurez besoin de le modifier légèrement pour s’adapter à vos besoins. Sous Label, remplacez ISR par le nom de la sous-routine qui est votre ISR. N’oubliez pas le trait de soulignement ! Vous en avez besoin !
Pour obtenir les interruptions de travail, il y a deux choses plus à faire :
1.) écrire la sûreté. Vous écrirez cela tout comme vous deviez écrire une sous-routine PBP, sauf que vous devrez ajouter @ INT_RETURN à la fin de la sous-routine au lieu de retour. Cela accusera l’interruption et l’exécution du programme de retour à où elle s’était arrêtée dans la boucle principale.
À l’intérieur de l’ISR, vous devez désactiver l’indicateur d’interruption alors que votre programme ne se coince pas dans une interruption récursive. Simplement en lisant que PORTB est tout qui doit être fait pour effacer l’indicateur d’interruption sur le PIC16F877A. Chaque microcontrôleur différent a une façon différente des drapeaux de l’interruption de la société. Consultez la fiche technique votre microcontrôleur.
2.) lorsque vous atteignez le point dans votre code que vous souhaitez activer l’interruption, utilisez cette ligne de code :
@ INT_ENABLE RBC_INT
Lorsque vous souhaitez désactiver l’interruption il suffit d’utiliser :
@ INT_DISABLE RBC_INT
Il y a beaucoup de choses dans ce que j’ai couvert juste donc je vais résumer rapidement. Jusqu’ici, votre programme doit ressembler à ceci :
; Aucun besoin mis en place ou de code
INCLURE « DT_INTS-14.bas »
INCLURE « ReEnterPBP.bas »
ASM
Macro INT_LIST ; IntSource, étiquette, Type, ResetFlag ?
INT_Handler RBC_INT, _myISR, PBP, oui
endm
INT_CREATE
ENDASM
; Tout autre besoin mis en place ou de code
@ INT_ENABLE RBC_INT
; Code qui doit savoir quel chemin tourne le bouton
@ INT_DISABLE RBC_INT
; Autre code
FIN ; Fin du programme
myISR :
Ici le code ISR
@ INT_RETURN
(Interrompre gestionnaire Set Up Table)
Je pense que c’est là que toute personne qui n’utilise pas un PIC ou DT interruptions peuvent se joindre à nouveau. Maintenant, nous devons réellement écrire l’ISR pour le microcontrôleur sache quel sens tourne le bouton. Se rappeler de la section théorie de logiciels que nous pouvons en déduire le sens de rotation si nous savons l’entrée qui a provoqué l’interruption, sa nouvelle valeur et la valeur de l’autre entrée. Voici le pseudo-code :
Lire PORTB dans une variable gratter pour effacer l’indicateur d’interruption
Vérifier si A provoqué l’interruption.
Si elle est vraie,
Comparer A et b.
Vérifier s’il est différent, si différent,
C’était une rotation vers la droite
Autre chose,
C’était vers la gauche
Endif
Vérifier si B causé l’interruption.
Si elle est vraie,
Comparer A et B
Vérifier s’il est différent, si même,
C’était une rotation vers la droite
Autre chose,
C’était vers la gauche
Endif
Retour d’interruption
Comment savoir si un changement sur A ou B a causé l’interruption ? Découvrir la nouvelle valeur de l’entrée a changé et l’autre entrée (inchangée) est facile, car on peut les lire à l’intérieur de la sûreté. Nous devons savoir ce que l’état de chacun un était avant l’exécution est envoyée à la sûreté. Cela arrive dans la routine principale. La routine principale s’assoit et attend une variable byte que nous avons appelé CWflag pour avoir la valeur 1 ou remis à 0 par la sûreté. Après que chacun a reconnu le changement du bouton ou si il n’y a aucune activité de bouton, la variable est définie à 5 pour indiquer un état d’inactivité. Si le drapeau est réglé ou est désactivé, la routine principale immédiatement incrémente ou décrémente la valeur de consigne pression appropriée basée sur la rotation et puis définit la variable CWflag retour à 5 parce que le bouton est maintenant inactif à nouveau. Comme la routine principale vérifie la CWflag, qu’elle documente également l’état des valeurs A et B commutateur rotatif. C’est vraiment simple et ressemble à ceci :
oldA = A
oldB = B
Il y a vraiment rien de super compliqué ici. Il suffit d’inclure ces deux lignes au début de la boucle qui vérifie la CWflag pour la rotation. Nous sommes juste mettre à jour les valeurs logiques des entrées de la molette à l’intérieur de la boucle d’incrémentation/décrémentation dans la routine principale afin que nous puissions voir quelle entrée causé l’interruption lorsque l’ISR est exécutée. Voici le code de l’ISR :
ABchange :
zéro = PORTB ' lecture PORTB pour effacer interrupt flag
"Si A cause de l’interruption, recherchez B sens de rotation
OldA IF! = A puis
"Si A et B sont différents, c’est la rotation vers la droite
IF A! = B ALORS
GOTO CW
« Sinon, c’est la rotation dans le sens anti-horaire
D’AUTRE
GOTO CCW
ENDIF
ENDIF
« Si B provoque l’interruption, aller A pour sens de rotation
OldB IF! = B alors
"Si A et B sont les mêmes, c’est la rotation vers la droite
IF A == B PUIS
GOTO CW
« Sinon, c’était contre rotation dans le sens horaire
D’AUTRE
GOTO CCW
ENDIF
ENDIF
CW :
CWflag = 1
@ INT_RETURN
CCW :
CWflag = 0
@ INT_RETURN
J’ai inclus le code ISR dans un fichier AB_ISR.bas car les onglets dans le code ne s’affichent pas comme ils le devraient.
Maintenant, parce que l’ISR a les anciennes valeurs pour les entrées A et B, il peut déterminer quelle entrée causé l’interruption, le compare à l’autre entrée (inchangée) et déterminer le sens de rotation. Tout la routine principale a à faire est de vérifier la CWflag pour voir quelle direction le bouton a mis (si elle fonctionne) et incrément ou décrémenter un point contre, ensemble ou tout ce que vous aimez ou avez besoin.
J’espère que cela aide et n’a pas été trop compliqué. Ce type d’interface est particulièrement utile si votre système utilise déjà des interruptions puisqu’il s’agit qu’une interruption de plus à ajouter. Profitez !