Ir ao conteúdo

Interrupção externa no com pi e mplab xc8


frixen

Posts recomendados

Postado

Tentei fazer uma interrupção externa com o pic18f2550 no compilador xc8, e por pouco não da certo.

O problema é que quando entrasse na função da interrupção ele deveria inverter o estado do pino que continha um led, mas em vez disso ele da somente uma piscada muito rápida.

Na simulação no proteus, da para ver que a função da interrupção é executada mas quando sai dela desfaz tudo que foi feito nela.

É como se o programa não mantem o que foi alterado na função da interrupção.

aqui esta o codigo:

#include "delay_10ms.h"  //biblioteca de delay que tive que fazer
#include <stdio.h>
#include <stdlib.h>
#include <p18f2550.h>
#include <xc.h>
#pragma config FOSC = XT_XT // Oscillator Selection bits (XT oscillator (XT))
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
#pragma config PBADEN = OFF

void interrupt inter_teste(){ /função da interrupção
if(INT0IF){
delay_10ms(10);
INTCONbits.INT0IF=0;
RA1 = 1;
}
}

void main(void) {

TRISBbits.RB0=1;
INTCONbits.INT0IE=1;
INTCONbits.GIE=1;
INTCON2bits.INTEDG0=0;
INTCON2bits.RBPU = 1;
INTCONbits.INT0IF=0;

PORTB = 0;
TRISA=0b00000000;


int val = 0;
while(1){
RA0 = val =~ val; //inversão da variavel(a inversão só funciona com int e char)
delay_10ms(10);

}
}

Postado

Não sei se o código gerado no C18 é compativel com XC8,mas tente na inicialização;

    RCONbits.IPEN = 1;                
INTCONbits.INT0IF = 0;
INTCONbits.INT0IE = 1;
INTCON2bits.INTEDG0 = 1;
RCONbits.IPEN = 1;
INTCONbits.GIE = 1; //HABILITA AS INTERRUPÇÕES

E no ISR:

#pragma code high_vector=0x08   //ALTA PRIORIDADE
void high_interrupt (void)
{
_asm GOTO PWM_isr _endasm
}

#pragma code
#pragma interrupt inter_teste_isr
void inter_teste_isr (void)
{
if(INTCONbits.INT0IF)
{
INTCONbits.INT0IF = 0;
RA0 = val =~ val;
}
}
//.......................................................

Postado

Fiz a parte do rconbits.IPEN = 1;

Na verdade ja tinha tendado isso e não deu certo.

Só não entendi essa segunda parte, eu não preciso dar prioridade, pois é somente uma função que esta sendo executada e na simulação mostra que a função da interrupção esta sendo executada. O problema é que quando dentro da função interrupção, esta sendo setado a porta RA1 = 1 , mas quando sai da interrupção esse valor volta a 0.

Se poder me responder outra coisa, porque para fazer a inversão da porta RA0 não consigo fazer do jeito comum (RA0 =~ RA0)? só consegui criando uma int e atribuindo o valor dela na porta RA0?

Postado

Sobre a prioridade,o PIC 18F2550 usa elas,não sei sobre o XC8,mas no C18 é assim que se faz.

Quando tiver coragem baixo o XC para experimentar.

Não é melhor começar com o C18?

Postado

Meu orientador nos explicou que o xc8 substituirá o C18, então já estou pensando no futuro.

Só não entendo uma coisa, fiz vários teses com a interrupção, tentei setar uma flag dentro da interrupção para que quando estiver na função principal ativar um if que acenderia o led, mas por algum motivo no final da função interrupção a flag volta a 0 ou ela não foi setada dentro da interrupção.

Postado

amigo, eu nunca vi uma linha igual a esta hahahaha

RA0 = val =~ val;

você pega o RA0 que é apenas um bit iguala a uma variável int e ao mesmo tempo iguala ao complemento da variável??? não entendi, lembrando que eu uso o microC e la nunca vi isto, por isso a minha estranheza!

flowwww

Postado

O certo para fazer a inversão de bit ou pino seria:

RA0 =~ RA0

Mas no xc8 não funcionou, ouvi dizer que só funciona com int e char, então usei uma int val e inverti o valor dessa int e igualei ao valor do bit RA0.

Postado

olha amigo, acho que é o padrão do C mesmo esta forma de inversão abaixo, por isso deve funcionar neste compilador também

se você quiser inverter uma variável é assim

variavel=~variavel;

agora se for um bit é

rb0!=rb0;

para saber mais pesquise por bitwise ou escovação de bits

flowwww

Postado

Ainda não baixei o XC8,que dizem que ainda esta incompleto,mas tente:

#include "delay_10ms.h"  //biblioteca de delay que tive que fazer
#include <stdio.h>
#include <stdlib.h>
#include <p18f2550.h>
#include <xc.h>
#pragma config FOSC = XT_XT // Oscillator Selection bits (XT oscillator (XT))
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
#pragma config PBADEN = OFF

void interrupt inter_teste(){ /função da interrupção
if(INT0IF){
RA1 = ~RA1;
delay_10ms(10);
INTCONbits.INT0IF=0;
}
}

void main(void) {

TRISBbits.RB0=1;
INTCONbits.INT0IE=1;
INTCONbits.GIE=1;
INTCON2bits.INTEDG0=0;
INTCON2bits.RBPU = 1;
INTCONbits.INT0IF=0;

PORTB = 0;
TRISA=0b00000000;



while(1){
delay_10ms(10);

}
}

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...