Home › Forum › Microcontrôleurs & microprocesseurs › Interruption IO Pic18F2520

Forum

Veuillez vous identifier avant de répondre ou pour vous abonner à cette discussion

Sujet: Interruption IO Pic18F2520

Auteur Message

ricolab

4 messages

De passage
De passage

Read post 13-05-2010 22:08

Bonjour...
Je voudrais simplement gérer correctement les interruptions sur le RB0.
J'ai donc un pic18F2520 avec un bouton poussoir qui relie RB0 à la masse lorsqu'il est appuyé. Le problème est que l'interruption est toujours exécutée (bouton appuyé ou non) , la boucle infinie du main reprend si je reste longtemps appuyé sur le bouton (je le sais car une led permet de signaler quelle boucle tourne).
J'ai réglé l'interruption sur le front descendant mais je ne comprends pas comment cela peut il réagir si l'on laisse RB0 "en l'air". Faut il forcer par le hardware RB0 à 5V puis mettre à la masse lors de l'appui?
J'ai essayé de mettre une résistance entre 5V et RB0 pour forcer le niveau 5V avant la mise à 0 mais cela ne laisse pas la boucle main fonctionner.

Quel est le principe d'utilisation générale (surtout hard) d'une interruption sur IO?


Merci pour vos éclaircicements

Voila les quelques paramètres de mon code qui sont utiles pour ce problème (les prototypes sont dans le .h , le script se build sans problèmes, j'ai probablement oublié quelques détails du script mais sans rapport avec le problème):



#pragma config OSC = HSPLL
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config LVP = OFF
#pragma config BOREN = ON
#pragma config BORV = 1
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config PBADEN = OFF

#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO ISRgest _endasm
}

#pragma code // ritorna al codice C
#pragma interrupt ISRgest



void main()
{
TRISB = 0b11111111;
LATB = 0b11110000;


RCONbits.IPEN=1;
INTCON = 0;
INTCONbits.GIE = 1;
INTCONbits.INT0IE = 0; /* mise à 0 avant de le mettre à 1 */
INTCONbits.INT0IE = 1 ; //activation de l'interruption de la patte RB0
INTCON2bits.INTEDG0=0; //evennement du falling edge
INTCONbits.PEIE = 0;
INTCONbits.INT0IF = 0;

while(1)
{
led1=0;
}
}

void ISRgest(void) .
{


if(INTCONbits.INT0IF && INTCONbits.INT0IE)
{
/* sauvegarder des registres avant l'interruption */
unsigned char sauv1;
unsigned char sauv2;
sauv1 = PRODL;
sauv2 = PRODH;


//si bouton alors réaction
Led1=1;

tempo_ms(5000); //fonction d'attente

/* on restaure les registres sauvegardes avant l'interruption */
PRODL = sauv1;
PRODH = sauv2;
INTCONbits.INT0IF = 0; //réinitialisation du flag
}
}

obdh

229 messages

Habitué
Habitué

Read post 13-05-2010 23:42

Premièrement, j'ai horreur du PIC18 ! Mais c'est sans importance. Le problème vient certainement du fait que la broche RB0 est partagée avec une entrée analogique, qui est validée par défaut. Il faut chercher dans la doc, mais c'est un piège classique et l'entrée ne fonctionne pas sinon. Il faut bien sûr mettre un pullup (résistance de tirage au +), et garder à l'esprit l'existence de rebonds, supprimés par la tempo dans ce cas

ricolab

4 messages

De passage
De passage

Read post 13-05-2010 23:59

merci pour cette réponse.. Je vais approfondir sur les thèmes proposés.
Une idée de valeur pour le pull up resistor (1k?)?
Une micro-controlleur bien fait l'intègrerait avec un registre pour l'activer désactiver( comme sur un jennic).

A part le 18f, quel équivalent aurait plus vos faveurs (à capacités équivalentes bien sùr)

obdh

229 messages

Habitué
Habitué

Read post 14-05-2010 00:19

Si l'entrée analogique n'a pas été désactivée ailleurs dans le code, il est certain que ça ne peut pas marcher, la doc est claire. Pour la résistance, inutile de descendre en dessous de 10k.
Je n'aime pas l'architecture du pic 18 et ses foutues pages qui ruinent les performances, en revanche l'absence de résistance intégrée n'est pas un défaut à mes yeux.
Les processeurs que je garde chez MCP : le PIC32, voire le PIC24, mais il a pris un coup de vieux avec le 32, et... le pic 10 en SOT23 ! Je ne vois pas l'intérêt de s'embêter avec un PIC16 ou un PIC18 au même prix qu'un PIC32, sauf si le boîtier est déterminant.

ricolab

4 messages

De passage
De passage

Read post 14-05-2010 00:26

Je suis vraiment mauvaise langue, le pull up est prévu ;
registre RBPU dans intcon2.
Par contre je suis pas sur d'avoir bien compris, un latB à 0 donne un pull à la masse, un latb à 1 un pull à5v?
(du datasheet:
RBPU: PORTB Pull-up Enable bit
0 = PORTB pull-ups are enabled by individual port latch values)

ricolab

4 messages

De passage
De passage

Read post 14-05-2010 01:24

Le problème est résolu
Ci cela peut être utile pour d'autres:
INTCON2bits.INTEDG0=0; //évènement de mise à la masse
INTCON2bits.RBPU=0; //activation du pull up


TRISB = 0b00000001; //RB0 en input
LATB = 0b00000001; // Pull up et RBO à 5V 'après essai mettre à 0 ne change rien RB0 reste à 5v'


ADCON1 = 0b00001110;
// active uniquement AN0 donc AN12 qui correspond à RB0 ets bien en IO donc libre pour l'interrupt. P226 datasheet

Veuillez vous identifier avant de répondre ou pour vous abonner à cette discussion

Elektor 6/2012 en kiosque

Elektor-Hebdo gratuit !

Mon adresse électronique :

Unités de crédit Elektor

Nos blogs-ateliers