Ir ao conteúdo
  • Cadastre-se

Interrupção externa


Lucas Pereira de Souza

Posts recomendados

Olá tudo bem, queria saber se alguém  pode me ajudar, eu estou aprendendo uC porém eu uso o pic da família 18. Eu queria fazer o seguinte rotina: o led 1 fica piscando  quando eu aperto o Botão o Led 2 começa a piscarVeja o código abaixo:void main(void){    TRISCbits.TRISC0 = 1;          //Define PORTC0 como entrada    PORTCbits.RC0 = 0;              //Limpa PORTC0    TRISD = 0x00;    PORTD = 0;    INTCONbits.GIE = 1;             // Abilita todas interrupção      INTCONbits.INT0IE = 1;          // Abilita interrupção externa    while(1){        PORTDbits.RD0=~PORTDbits.RD0;        Delay10KTCYx(100);    }}void interrupt interomper(){    PORTDbits.RD1=~PORTDbits.RD1;      INTCONbits.INT0IF = 0;         // Sempre inicia  Com flag 0 este bit é para interrupção externa}Obs: eu não consegui fazer funcionar ,queria saber como configurar o registrador corretamente ou se eu esqueci algo nessa rotininha. Lembrando eu uso o compilador xc8 ou o c18 devido eles seguir padrão da norma internacional.

Veja o Projeto no Proteus:

post-709648-0-45924300-1394318154_thumb.

Link para o comentário
Compartilhar em outros sites

utilize o 16f84 isso é simples ele tem uma interrupção externa também

 

fiz um código  aqui pra ti mais acho que da pra você migrar ele pra  xc8

 

se naõ for isso é s´falar

#include <16f84a.h>#use delay(clock=4000000)#fuses XT,NOWDT,PUTint8 x;#INT_EXTvoid trata_b0(void){x++;}void main(void){enable_interrupts(INT_EXT);enable_interrupts(GLOBAL);while(true){if(x==3) // se x é igual a três{x=0; // x volta ao inicio// e executa os pinos RA0output_high(pin_a0);delay_ms(500);output_low(pin_a0);delay_ms(500);disable_interrupts(INT_EXT); // Eu desabilitei ho ! pensando que essa parte do if(x==3) seria desabilitada pra não afetar a segunda chamada ,essa if(==4) mas não chamou ela ,e so chama a if( x==3)o que adianta ter uma interrupção se a pessoa tem que chamar a #INT_EXT um #INT_EXT dois #INT_EXT três ...mais então ,igual na linguagem c/C++ você pode chamar quantas chamadas de funções você quisermais nessa #INT_EXT eu queria saber se pode usar apenas ela pra não ter que ficar usando a numero um numero dois numero trêsnumero quatro etc... apenas a #INT_EXT tentei chamar if(x==4) quando pensei que tinha desabilitado a if(x==3) pra poder chamar a if (x==4) não sei se da pra entender agora!! mais ta ai...while(true){if(x==4) // se x é igual a três{x=0; // x volta ao inicio// e executa os pinos RA0}}

:rolleyes:esse código é o seguinte você aperta 3 vezes o pino rb0  e executa o pino ra0

mas precisa habilitar a interrupção ( int _ext) pratique ele e você vai entender falou!!

Link para o comentário
Compartilhar em outros sites


Olá muito obrigado pela ajuda, porém não vai dar para eu usar o pic16f devido porque eu vou fazer esse projeto na protoboard e eu ja tenho o pic18f4550 com botloader vou tentar usar esse seu código porém no pic16f tem um registrador chamado OPTION_REG que eu configurei e deu certo mas no pic 18f não consegui configurar ele não existe este registrador, no registrador do pic18f só consegui fazer interrupção com o timer0 para interrupção interna como contagem de tempo já a interrupção externa pelo INTCON não consegui configurar.

Link para o comentário
Compartilhar em outros sites

Ola.

@Lucas Pereira de Souza,existem muitos detalhes que voce deve estudar e também devera ler o datasheet do PIC 18F junto com o maual do compilador que vai usar pois os compiladores usam regras própria e diretrizes particulares.

Usando o C18,voce teria que fazer uma configuração mínima,que depende do cristal que esta usando.

Qual a frequência do cristal que esta usando?

Em um exemplo usando um cristal de 4 MHZ,com frequência interna do PIC a 48 MHZ(12 MIPS) e usando a interrupção externa em RB0,o código seria mais ou menos assim:

#include <p18f2550.h>#pragma config PLLDIV=1, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=XTPLL_XT//, FCMEM=OFF //CPUDIV=OSC1_PLL2=48MHz   CRISTAL 4 MHZ#pragma config IESO=OFF, PWRT=OFF, BOR=ON_ACTIVE, BORV=3, VREGEN=ON, WDT=OFF#pragma config MCLRE=ON, PBADEN=OFF, CCP2MX=OFF, STVREN=ON, LVP=ON, XINST=OFF, DEBUG=OFF#pragma code high_vector=0x08   //INTERRUPÇÃO DE ALTA PRIORIDADEvoid high_interrupt (void){ _asm GOTO BOTAO_isr _endasm     //CHAMA A ROTINA DA INTERRUPÇÃO}#pragma code#pragma interrupt BOTAO_isr    //SUA ROTINA COMEÇA AQUI(INTERRUPÇÃO)void BOTAO_isr (void){  if(INTCONbits.INT0IF)       //SE DISPARADO A INTERRUPÇÃO EXTERNA...   {    INTCONbits.INT0IF = 0;    //LIMPA FLAG DA INTERRUPÇÃO(ASSIM ELA PODE SER VERIFICADFA NOVAMENTE)  //COLOQUE SEU CÓDIGO AQUI   }}//............................................................void main(void){    TRISC = 0b00000000;	//ESCOLHA O PINO COMO ENTRADA (IN = 1)   PORTC = 0X00;	//Limpa PORTC   ADCON1 = 0x0F;       //SETA PORTA COMO DIGITAL I/O (DESABILITA ENTRADAS ANALOGICAS)   CMCON =  0X07;       //DESABILITA OS COMPARADORES   INTCONbits.INT0IE = 1;   //HABILITA INT0(INTERRUPÇÃO EXTERNA)    INTCON2bits.INTEDG0 = 1; //HABILITA A INTERRUPÇÃO EXTERNA NA SUBIDA DA BORDA//   RCONbits.IPEN = 1;     //HABILITA A PRIORIDADE DE INTERRUPÇÕES(ESTUDAR ESTA OPÇÃO MAIS TARDE)   INTCONbits.GIE = 1;      //HABILITA AS INTERRUPÇÕES              // INTCONbits.GIE = 0;      //DESABILITA AS INTERRUPÇÕES 	while(1)    {      //LOOPING ESPERANDO PELA INTERRUPÇÃO    }}

Algumas opções voce não vai usar,mas deve estuda-las.

É interessante voce dar uma estudada sobre as interrupções deste PIC pois ele pode usar prioridade nas interrupções,isto quer dizer que voce pode programar qual interrupção será executada primeira,caso use mais de uma e elas sejam ativadas simultaneamente.

No código usamos a alta prioridade que é padrão no endereço 0x08 .

Link para o comentário
Compartilhar em outros sites

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...