Étape 6: Interrompt pour économiser l’énergie
Tel que mentionné précédemment, le microprocesseur passeront la plupart du temps il est en mode "veille". (Particulièrement quand il est assis majestueusement sur la cheminée!). En mode veille, l’oscillateur interne est arrêtée, et l’appareil ne consomme essentiellement aucun courant.
Afin de réveiller du mode de veille, nous avons besoin d’avoir une « interruption » se produisent. Interruptions peuvent résulter d’une variété de sources, mais ils indiquent toujours certains changements externes.
Le projet LED dés que nous construisons a le bouton-poussoir connecté au bit 1 du Port B (PB0). Cette broche est aussi fonctions comme entrée « interrompre ». Lorsque le niveau de tension sur cette broche est modifiée, une interruption est générée, le PIC d’arrêter tout ce qu’il faisait et de faire autre chose. C’est cette interruption qui provoque le PIC se réveiller de son sommeil mode.
Interruptions dans le PIC peuvent être « globale » dans la nature (Global Interrupt Enable [GIE] bit défini) ou localisée. Dans notre exemple, nous aimerions continuer à exécuter les instructions immédiatement après la commande de « sommeil », alors que nous devons faire en sorte que le bit GIE est clair. Interruptions globales provoquent l’exécution du programme à crée une branche vers l’emplacement 4, qui est utile pour une approche plus traditionnelle d’interruption vectorisées qui nous couvrirons dans des articles ultérieurs.
Code pour implémenter la fonctionnalité d’interruption ressemblerait ;
MAINLOOP MOVFW PortB ; faire une lecture factice sur le port B MOVLW B « 0010000 » ; Laisser le bit GIE au large et activez le ; Pb0 interrompre peu MOVWF INTCON ; et charger le registre de contrôle d’interruption SOMMEIL ; attendre tranquillement une interruption... MOVLW B « 00000000 » ; désactiver les interruptions. MOVWF INTCON ; Continuer l’exécution de code (où on l’attend le bouton qui sortira... ; ; ; ; éventuellement, nous goto MAINLOOP, où nous le faisons à nouveau tout... |
Une chose à noter est que dès que nous recevons une interruption, nous réveiller et immédiatement désactiver n’importe quel autres interruptions. Viens avec nous, les humains, il n’y a rien de plus irritant qu’être interrompu pendant que vous avez été interrompu. Plusieurs niveaux d’interruptions peuvent entraîner des erreurs de programme inattendu, donc nous arrêter n’importe quel autres interruptions ne se produise.
Maintenant que nous avons examiné la mise en œuvre d’entrée, de sortie, de génération de nombres aléatoires et d’interruptions, nous pouvons lier tout cela ensemble et produire du code qui s’exécutera en fait les dés.
Il y a une petite quantité de « colle » autour de ces fonctions pour créer le code en cours d’exécution réel. Je recommande que vous obtenir les listes de programmes et les étudier pour plus d’informations.
Si vous étudient-ils les annonces, vous pouvez trouver qu’il existe des moyens plus rapides et plus élégants de faire ce qui a été fait. N’oubliez pas qu’il y a des réalités commerciales quant au temps consacré à la production d’une solution particulière, et que quelques fois, faire quelque chose "sans cerveau", long chemin est réellement plus rapide de développer. Il s’agit d’un système embarqué, et dans un système simple comme ça, l’accent est mis sur la production d’un résultat, ne pas sur la production du code plus élégant disponible. (Avez-vous réellement regardé le code dans votre contrôleur de four à micro-ondes...)