30.07.2015 Views

La programmation des PICs - Seconde partie

La programmation des PICs - Seconde partie

La programmation des PICs - Seconde partie

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

particulier, vous n’êtes pas obligé de sauver PCLATH, mais vous ne pouvez pas le modifiernon plus.On termine ce début par la macro BANK0, qui permet de pointer sur la banque 0 en casd’adressage direct.Voyons maintenant la suite de notre routine :; Interruption TMR0; -----------------btfsc INTCON , T0IE ; tester si interrupt timer autoriséebtfss INTCON , T0IF ; oui, tester si interrupt timer en coursgoto intsw1; non test suivantcall inttmr0 ; oui, traiter interrupt tmr0bcf INTCON , T0IF ; effacer flag interrupt tmr0goto restorereg ; et fin d'interruptionIl s’agit bien évidemment ici de vérifier si c’est le timer0 qui a déclenchél’interruption.On commence par tester si l’interruption a été autorisée, en vérifiant le positionnementde T0IE. Vous allez me dire : drôle de procédure, quel est l’intérêt ?Et bien, vous ne devez jamais perdre de vue que les flags sont positionnés quel quesoit l’état du bit de validation correspondant. Vous avez donc 3 cas possibles :1) Vous n’utilisez pas les interruptions tmr0 dans votre programme : dans ce cas, vouspouvez tout simplement effacer ces 6 lignes de code.2) Vous utilisez les interruptions tmr0 dans votre programme. Cependant, le bit T0IE reste enservice tout au long de votre programme. Il est donc inutile de le tester. Vous pouvez donceffacer la première ligne.3) Votre programme utilise les interruptions du timer0, mais pas tout le temps, de plus vousutilisez d’autres sources d’interruption. Donc, dans votre programme principal, vouscoupez par moment T0IE afin de ne pas être interrompu par le débordement du timer0pendant certaines pério<strong>des</strong>. Dans ce cas, si votre timer0 déborde, le flag T0IF serapositionné , mais l’interruption correspondante ne sera pas générée. Si par malheur seproduit alors une interruption due à un autre événement que vous aviez autorisé, et quevous ne testiez pas T0IE, alors vous seriez induit en erreur lors du test de T0IF. Celui-ciétant positionné, bien que l’interruption ne soit pas due au débordement de tmr0. Vousdevez donc laisser le test de T0IE.<strong>La</strong> seconde ligne, qui vérifie si le bit T0IF est positionné, ne sera donc exécuté que si laligne précédente a défini que T0IE est bien positionné. Donc, Si T0IF et T0IE sont tout deuxpositionnés, on saute à la ligne « call inttmr0 ». Dans le cas contraire, on saute, via « gotointsw1 », au test suivant pour continuer la recherche de la source de l’interruption.<strong>La</strong> ligne « call inttmr0 » permet d’appeler la sous-routine « inttmr0 », dans laquelle vouspourrez placer le code de traitement de votre routine d’interruption timer0.49

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!