version    05/01/2021
rev ..........


Test Interrupt On Change avec PIC 18F27K42

* Test sur RA5 IOC avec MikroC 7.60 (OK)
*
avec Mplabx XC8 .. à suivre
*NECTO STUDIO MikroC AI I2C Hardware .. à suivre



Interrupt On Change sur pin RA5 18F27K42 (MikroC)


Hardware :

Base 18F27K42

HARDWARE

Alimentation VCC= 3.6V
Carte BASE 18F27K42
Entree testée =RA5 input !
Led sur RA4 pour signaler l'IT IOC
UART1 TX sur RC6

Utilisation de mon generateur BF , avec mode Coup par coup via un Bouton Poussoir
pour éviter tout rebonds sur le signal d'entree RA5.





Contrairement aux Anciens PIC (qui ne geraient que le PORTB) ,
avec celui ci on peut genérer une interruption via N'IMPORTE QUELLE pin du MCU


Extrait datasheet :
18.0 INTERRUPT-ON-CHANGE
Interruption sur changement d'etat sur n'importe quelle broche (Pin) d'un PORT.
18.1 Enabling the Module
Validation du registre PIEx pour permettre la generation d'une interruption sur une broche d'un PORT
le bit IOCIE correspondant du registre PIEx doit etre armé pour generer l'interruption.
Ceci n'empeche pas la detection de se faire ..
18.2 Individual Pin Configuration
Pour chaque pin de PORT, un detecteur de front Montant ou Descendant est présent
Pour valider une detection de front Montant sur une Pin , le bit associé du registre IOCxP (P comme Positif!) est mis à 1 .
Pour valider une detection de front Descendant sur une Pin , le bit associé du registre IOCxN (N comme Negatif!)est mis à 1 .
Une pin (broche) peut etre configuée en detection Front Montant ET Decendant , en armant (Mise à 1 ) le bit des 2 registres
correspondant IOCxP ET IOCxN
18.3 Interrupt Flags
les bits IOCAFx, IOCBFx, IOCCFx et IOCEF3 sont situés dans les registres respectifs IOCAF, IOCBF, IOCCF and IOCEF
leurs etats 0 ou 1 , reflete l'etat Interrupt On Change du PORT concerné.
Si un changement de front attendu est detecté sur la broche (Pin) validée en detection , le bit IOCIE est armé (mis à 1)
=> interruption autorisée
le bit IOCIF est aussi armé, il reflete l'etat de toutes le spin concernée sur les PORTS IOCAFx, IOCBFx,IOCCFx,IOCEF3_bit
18.4 Clearing Interrupt Flags RAZ des drapeaux
L'eat individuel des drapeaux representant les entrees du PORT (IOCAFx, IOCBFx, IOCCFx et IOCEF3 bits),
peut etre respectivement remis à zero .
Si une autre detection de front est detectée pendant la remise à zero,
le flag associé est à nouveau remis à un.
Pour s'assurer qu'aucun Front ne soit perdu , pendant la remise à zero du Flag ( en cours de traitement)
Seule une operation utilisant un MASQUE permettant d'isoler le(s) bit(s) connu comme ayant changé
doit etre réalisée.
exemple de sequence :

MOVLW 0xff
XORWF IOCAF, W
ANDWF IOCAF, F
le test ci-dessu n'est pas convainquant ..pour ma part .


L'UART1 est utilisé pour suivre le deroulement du programme ( as usual).
La partie Initialisation pour gerer l'Interruption sur Front Montant arrivant sur la pin RA5
LATA4_bit = 0;
CountRA5=0;
INLVLA.B5=1; //1 = ST input used for port reads and interrupt-on-change
IOCAF=0;
IOCAP5_bit = 1; // Interrupt ON rising edge RA5
IOCAN5_bit = 0; // no interrupt on Falling edge on RA5
IOCIF_bit = 0; // drapeau general interrupt
IOCIE_bit = 1; //IOCIE: Interrupt-on-Change Enable bit
GIE_bit = 1;
j=0;

-------- le corps du programme -----
WordToStr(CountRA5,CRam1);
CPrint(" Rising Edge count on RA5= ");
Print(CRam1);
do
{
// show the status of RA5 input
CPrint(" RA5= ");
UART1_Write(PORTA.B5+48);
UART1_Write(TAB);
if ((j%8==0) &&( j>0))
{
CRLF1(); // new empty line every 8 values
}
if (PORTA.B4==1) // interrupt armed this bit !
{
CPrint(" Rising Edge occured on RA5 count= ");
WordToStr(CountRA5,CRam1);
Print(CRam1);
CRLF1();
LATA4_bit = 0;
IOCIE_bit=1; // re-arme interrupt for next test
// so we have enough time to see what is happenning
}
CRLF1();
Delay_1sec();
j++;
}
while(1);

La gestion de l'interruption : ( integrée aux autres interrupts UART1,Timer0,Timer1)

void Interrupts() iv 0x0008 ics ICS_AUTO
{
if ( (IOCAF.B5==1) && (IOCIE_bit==1))
{
IOCAF.B5=0; // Raz du flag IOC sur RA5
LATA4_bit = 1;// led sur RA4 ON
/* le code , ci-dessous n'est pas efficace

_asm{
MOVLW 0xFF
XORWF IOCAF, W
ANDWF IOCAF, F
}

*/
CountRA5++; // incremente le compteur d' IOC RA5
IOCIE_bit=0; // pour ne capter qu'un seul Front ( si usage d'un BP avec rebonds !)
//
n'est pas utile avec le montage hardware Anti-bounces !
}
}

Execution du programme ( via terminal)



ON voit bien que le front Descendant ne genere pas d'interrupt, et
QUE SEUL LE FRONT MONTANT est bien VU.

Programme:
last update : 05/01/2021
projet MikroC 7.60 ....OK !
Projet : 18F27K42_Test_Interrupt_on_change_RA5_MC.zip
main : PIC18F27K42_UART1_test_interrupt_On_Change_RA5_MC_2021_0105.c
Chargeur :
Test_Interrupt_On_Change_18F27K42_MC_2021.hex


paulfjujo@free.fr


../common/mylogo_CI.jpg



Retour à l'index general