BRAS de Montage de Base la gestion des interruptions
Je suis en train de déconner avec certains BRAS Assembleur sur la lpc2378, j'ai écrit une boucle pour le contrôle d'un four, la température de l', cependant, je crois que j'ai besoin de mettre en œuvre une sorte de gestion des interruptions pour réaliser mon projet.
Lorsque l'application s'exécute, il entre dans une boucle, qui attend Button_1 d'entrée, la boucle continue ensuite et passe par différentes phases, mais il ne peut pas atteindre attendre Button_2 d'entrée pour l'application de la fonction.
Si un couple de questions ici, comment fonctionne exactement le gestionnaire d'interruption de travail? et comment pourrais-je la mettre en application dans mon application.
Voici mon Button_1 code:
;=========================================================================
; Wait for BUT1 to be pressed
;=========================================================================
WaitBUT1
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
WaitForBUT1Pressed
ldr r0, = IO0PIN ; Address of FIO0PIN register
ldr r1, [r0] ; Read FIO0PIN in to r1
ands r1, r1, # B1_MASK ; Mask out BUT1
beq BUT1Pressed ; Exit LED toggle loop if button is pressed
B WaitForBUT1Pressed
BUT1Pressed
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC
et mon Button_2 code:
;=========================================================================
; Wait for BUT2 to be pressed
;=========================================================================
WaitBUT2
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
WaitForBUT2Pressed
ldr r0, = IO0PIN ; Address of FIO0PIN register
ldr r1, [r0] ; Read FIO0PIN in to r1
ands r1, r1, # B2_MASK ; Mask out BUT1
beq BUT2Pressed ; Exit LED toggle loop if button is pressed
B WaitForBUT2Pressed
BUT2Pressed
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC
et aussi mon four boucle de contrôle:
LoopStart
BL WaitBUT1 ; wait until button 1 is pressed
BL heaterOn ; turn heater on
BL systemLedOn ; turn system LED on
BL readTemp ; Check ADC for temp
BL checkTemp ; Count down, check ADC for temp
CMP r3, #5 ; Compare timer with delay
BGT errorVal
SUBS r4, r2, r7 ;Performs r7 = r4 - r2 and sets condition register
BEQ LoopStart ; if equal nothing to do
BGT overTemp ; r7 < 0 case
BL errorLedOn
BL heaterOn
BL FanOff
B LoopStart
overTemp
BL errorLedOn
BL heaterOff
BL FanOn
B LoopStart
BL WaitBUT2
BL FanOff
BL errorLedOff
BL systemLedOff
BL heaterOff
B LoopStart
Merci d'avance.
OriginalL'auteur user1080390 | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
Si vous ne l'avez déjà vous avez besoin pour obtenir le BRAS de BRAS (BRAS Architectural Manuel de Référence). il l'habitude d'être seul, mais il y a tellement de cœurs maintenant qu'ils avaient à les diviser pour les différentes architectures. http://infocenter.arm.com le long du côté gauche du BRAS Architecture, Manuels de Référence, puis ARMv5, oui, je sais que vous avez un ARMv4 (ARM7TDMI). Le ARMv5 manuel est ce que l'habitude d'être, LE manuel.
Il permettra de couvrir l'exception des vecteurs et.
Vous savez probablement déjà que sur le démarrage, l'instruction à l'adresse 0x00000000 est exécutée.
Pour les interruptions de l'instruction à l'adresse 0x00000018 est appelé.
Du BRAS de BRAS de, vous devriez également voir à ce que les registres sont mis en réserve, en particulier r13 le pointeur de pile, il y a un autre pointeur de pile lorsqu'en mode d'interruption. Donc, au démarrage, lorsque vous configurez votre pile normale vous aussi vous souhaitez mettre en place un espace pour l'interruption de la pile.
à un certain point, vous devez activer l'interruption dans le cpsr. vous risquez d'attendre jusqu'à ce que vous avez activé quel que soit l'interruption de tout ce périphérique (dans la puce, à l'extérieur de la base).
Vous aurez besoin de lire le manuel de la lpc à comprendre comment faire pour activer l'interruption, ainsi que comment faire pour effacer l'interrompre quand il arrive.
La première chose que vous devez faire dans le gestionnaire d'interruption (le code que tu branche à l'adresse 0x18) est de préserver l'partagée (non encaissé) la tenue de registres sur la pile de sorte que vous n'avez pas de gâchis. Si vous ne vous lorsque vous revenez sur le code qui a été interrompu les registres ont changé et que le code ne peut pas fonctionner. Depuis votre projet semble être en ASM, il est possible pour vous d'utiliser certains registres dans l'application et la réserve regsiters seulement pour le rapport de recherche internationale et ne pas avoir pour l'installation de la pile. Si vous allez utiliser bl n'importe où dans le gestionnaire vous avez besoin pour économiser de lr sur la pile.
À un certain point, votre gestionnaire a besoin de se libérer de l'interruption dans le périphérique de sorte qu'il ne marche pas le feu à nouveau jusqu'à la prochaine interruption, faut lire le plc manuel pour cela. Oui quand je dis lpc je veux dire NXP anciennement Philips...
La dernière chose est que si vous avez poussé lr, de la pop, de pop et d'autres registres si vous avait poussé à eux, puis d'utiliser cette instruction et le bras se retourner et changer de mode de retour à la mode qui a été interrompu (passage à l'utilisation de ces incliné registres).
Remarque vous pouvez également avoir besoin, et c'est généralement une bonne idée avec les BRAS, pour obtenir le TRM (Technique Manuel de Référence) pour le cœur, dans votre cas, l'ARM7TDMI-S. Sur l'infocenter page, à gauche aller à Processeurs ARM7, pas ARMv7 en vertu de l'architecture, mais plus bas où il a ARM11, ARM9, ARM7.
Boutons peut être salissant avec des interruptions comme ils rebondissent et causer beaucoup de bords sur les broches d'e/s. En regardant votre autre post, je ne vois pas où vous auriez besoin d'une interruption. Vous, en général, d'éviter les interruptions, sauf si cela est nécessaire. ils sont malpropre en général. Il y a des dessins que vous ne pouvez pas éviter d'en utiliser un, certainement. Et il y a des event driven dessins où tout votre code est un gestionnaire d'interruption et il n'y a rien dans la demande, mais le code de démarrage et une boucle infinie (ou une sorte de sommeil).
Vous pouvez utiliser des interruptions d'anti-rebond, par exemple, si vous installez une minuterie d'interruption et de déguster les broches d'e/S pour les boutons de l'interruption, vous évitez un montant juste de la faire rebondir, mais vous avez aussi le risque de la probabilité de manquer d'appuyer sur un bouton. Tout simplement parce que le bouton I/O pin est affirmé deux interruptions dans une ligne qui n'est pas de deux presses, la modification d'une variable d'état, quelque part, et lorsque le bouton est relâché vous modifiez la variable d'état. changements de bord sur l'état de cette variable sont d'intérêt pour l'application. lorsque le bouton passe de non pressée et non cuite à enfoncé, faire quelque chose, si il va partir pressé de non pressée et non cuite, à ne rien faire, à attendre qu'il change de non pressée et non cuite à pressé comme un exemple.
Vous pouvez également utiliser la même minuterie d'interruption de commencer ou de l'échantillon de l'adc.
Puisque vous n'avez pas résolu votre autre problème, qui est également mentionné ici, je ne reviendrai pas aller près de l'interrompt. La Figure que le problème d'abord, puis de décider s'il y a une fonctionnalité dont vous avez besoin qui nécessite une interruption. Comme même/l'échantillonnage régulier de l'adc.
qui devrait être plus que suffisant pour obtenir vous avez commencé. Si vous n'essayez les interruptions de NE PAS les essayer dans le cadre de cette application, créer un tout autre application, par exemple une led clignotant. modifier l'état de la led dans le gestionnaire d'interruption, et/ou de modifier une variable globale ou s'inscrire dans le gestionnaire et avez le forground regarder et changer la led. Toujours diviser vos problèmes/exercices d'apprentissage en pièces individuelles, résoudre les ceux qui les colle ensemble, ajouter une pièce, de tester, d'ajouter une pièce, à l'essai.
bien sûr, beaucoup de façons de le faire, tout en soulignant qu'il existe une telle chose (le rebond de l'interrupteur) donc l'affiche pourrait aller le chercher..
Dwelch pourriez-vous nous expliquer ce point de la vôtre,Donc, au démarrage, lorsque vous configurez votre pile normale vous aussi vous souhaitez mettre en place un espace pour l'interruption de la pile. Aussi le code pour réinitialiser la configuration de l'interruption de la pile?
OriginalL'auteur old_timer
Dans ce cas, le gestionnaire d'interruption ne semble pas nécessaire, vous pouvez simplement sondage sur le bouton 2 dans ta boucle principale, plutôt que d'utiliser le "wait" de la fonction. Ajoutez ceci à la fin de votre boucle:
où l'ARRÊT est une cible qui effectue un coffre-fort four éteint (c'est à dire ne pas laisser tourner indéfiniment).
Noter que votre boucle comprend une attente pour button1 - certainement que devrait être avant
LoopStart
? Sinon, la boucle de contrôle attendra sur une touche à chaque itération, sans effectuer les actions de contrôle - peut-être une situation dangereuse si la dernière action a été unheaterOn
!- Delà de ça, notez que l'avant BRAS Cortex-cœurs (LPX2378 est un ARM7TDMI-S de base), les BRAS de base définit seulement deux sources d'interruption IRQ et de la FIQ, la plupart des régions disposent d'un contrôleur d'interruption externe du BRAS de noyau lui-même, et ce contrôleur d'interruption est spécifique au fournisseur. Par conséquent, afin de déterminer comment les GPIO interruptions, par exemple, sont traitées sur votre partie, vous aurez besoin de consulter le manuel de référence plutôt que le BRAS de la documentation.
ARM Cortex-M base dispositifs sont rapidement remplacer la ARM7 appareils, et vous pourriez être mieux avec un tel appareil. En particulier, la gestion des interruptions est beaucoup plus simple, souple et efficace. Voir cet article pour combien de Cortex-M améliore ARM7.
OriginalL'auteur Clifford