Ir ao conteúdo
  • Cadastre-se

Como gerar interrupção externa com pic e CCS


diego.maga

Posts recomendados


#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)

#use fast_io(B)
#byte portb=0x06
#bit led=portb.0

#int_RB
void RB_isr(void)
{
led=!led;
}

void main()
{
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

set_tris_b(0b11110000);
portb=0x00;
led=1;

while(true)
{
}
}

pbchange.png

Uploaded with ImageShack.us

Link para o comentário
Compartilhar em outros sites

#use fast_io(B) passa o controle dos i/o ports para o usuário.

#byte portb=0x06 //endereça o portb (0x06 é tirado do data sheet).

#bit led=portb.0 //Nomeia o bit 0 do portb (RB0) como led.

#int RB //A função que vem abaixo dessa linha, será o que será feito quando a interrupção ocorrer.

Link para o comentário
Compartilhar em outros sites

Amigo, no proteus , o programa apresenta erro em relação ao TRISB,

Então para funcionar troque set_tris_b por output_b ok, e mantenha (0b1111000);

ficará assim:

#include <16F628A.h>

#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD

#use delay(clock=4000000)

#use fast_io(B)

#byte portb=0x06

#bit led=portb.0

#int_RB

void RB_isr(void)

{

led=!led;

}

void main()

{

enable_interrupts(INT_RB);

enable_interrupts(GLOBAL);

output_b(0b11110000);

portb=0x00;

led=1;

while(true)

{

}

}

Link para o comentário
Compartilhar em outros sites

Apresenta erro mesmo, mas se você gravar o PIC e testar na vida real funcina que é uma beleza.

As coisas azuis se chamam logicstate, servem para simular uma mudança nos pinos de interrupção (RB4 a RB7), e o outro chama-se logicprobe server para verificar o estado do pino 0 ou 1.

Link para o comentário
Compartilhar em outros sites

set_tris_b(0b11110000); // Define a direção dos pinos 1-entrada 0-saída.

Se você usar o output_high(); output_low(); output_float();

você não precisa usar #use fast_io() #byte portx=0xXX e nem o set_tris_x(0xXX);


#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)

#define led PIN_B0

#int_RB
void RB_isr(void)
{
output_toggle(led);
}

void main()
{
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

output_high(led);

while(true)
{
}
}

Link para o comentário
Compartilhar em outros sites

set_tris_b(0b11110000); // Define a direção dos pinos 1-entrada 0-saída.

Se você usar o output_high(); output_low(); output_float();

você não usar #use fast_io() #byte portx=0xXX e nem o set_tris_x(0xXX);


#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)

#define led PIN_B0

#int_RB
void RB_isr(void)
{
output_toggle(led);
}

void main()
{
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

output_high(led);

while(true)
{
}
}

Eu só não entendi em qual pino eu ligaria um botão pra gerar a interrupção usando o codigo acima.

Link para o comentário
Compartilhar em outros sites

set_tris_b(0b11110000); // Define a direção dos pinos 1-entrada 0-saída.

Se você usar o output_high(); output_low(); output_float();

você não precisa usar #use fast_io() #byte portx=0xXX e nem o set_tris_x(0xXX);


#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)

#define led PIN_B0

#int_RB
void RB_isr(void)
{
output_toggle(led);
}

void main()
{
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

output_high(led);

while(true)
{
}
}

Acho que agora entendi, então eu estava confundindo a função de output_a,com set_tris_a:

Ou seja :

set_tris_x(0b0000000);//define os ports que serão utilizados como entrada ou saída.

output_x(0b0000000);//seta os ports

hmm..dessa eu não sabia, obrigado

Link para o comentário
Compartilhar em outros sites

Se você colocar um botao nos pinos B4 a B7, a interrupção acontece toda vez q passa de 0V para 5V.

Lembre-se de montar o botão corretamente.

Exemplo:

semttulozko.png

Falou

Então, quando:

set_tris_b(0b11110000);

Quando seto os devidos ports em 1, eles são definidos como pinos de entrada, e 0 em saída.

Link para o comentário
Compartilhar em outros sites

Fiz o seguinte agora:

#include <16F628A.h>

#use delay(clock=4000000)

#FUSES NOWDT, XT,PUT,NOPROTECT,BROWNOUT,MCLR,LVP,NOCPD

#use fast_io(b)//passa o controle dos i/o ports para o usuário.

#byte portb=0x06//endereça o portb (0x06 é tirado do data sheet).

#bit led=portb.0//Nomeia o bit 0 do portb (RB0) como led.

#int_RB//A função que vem abaixo dessa linha, será o que será feito quando a interrupção ocorrer.

void ascende_apaga()

{

output_high(led);

delay_ms(1000);

output_low(led);

delay_ms(1000);

}

void main()

{

enable_interrupts(INT_RB);

enable_interrupts(GLOBAL);

output_b(0b10000000);

portb=0x00;

led=1;

while(1)

{

}

}

http://img254.imageshack.us/img254/1690/setg.png

Só fiz o seguinte, mudei o nome da interrupção,e alterei os pinos de entrada, defini 1 só , como sendo o B7, onde coloquei um Botão, segundo na programação, quando a interrupção for interrompida por nível lógico 1 na entrada B7,o programa deveria ascender e apagar o led ligado ao port B0 que está definido como saída, alguém sabe onde pode estar o erro?

Link para o comentário
Compartilhar em outros sites

#include <16F628A.h>

#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD

#use delay(clock=4000000)

#define led PIN_A0

#int_RB

void RB_isr(void)

{

output_low(led);

}

void main()

{

enable_interrupts(INT_RB);

enable_interrupts(GLOBAL);

while(true)

{

}

}

Gostaria de fazer a interrupção seguindo o modelo.Esta faltando a definição das entradas dos port,porém não sei como definir a entrada do botão.Fiz a mesma coisa do led #define botao pin_bo porém não funcionou.

Gostaria de saber se tem como fazer isso sem usar as funções use fast io

Link para o comentário
Compartilhar em outros sites

Testado e funcionando:

Circuito:

semttuloqs.png

Codigo:

#include <16f628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#define frame_time 1000

#INT_RB
void trata_interupcao()
{
output_high (PIN_B0);
delay_ms (frame_time);
output_low (PIN_B0);
delay_ms (frame_time);
output_high (PIN_B0);
delay_ms (frame_time);
output_low (PIN_B0);
delay_ms (frame_time);
}

void main ()
{
enable_interrupts (INT_RB);
enable_interrupts (GLOBAL);

while(1);
}

Falou

Link para o comentário
Compartilhar em outros sites

Não. A INT_RB funciona em todo o PORTB. Se você colocar mais botões, irao causa a mesma interrupção.

você pode no caso, colocar vários botões e fazer a interrupção na marra.

Tipo, você poe no seu programa se o botao for apertdado, uma variavel qualquer terá o valor igual a 2 por exemplo. Aí você poe um swich para cada caso da sua variavel. Criando uma esécie de menu.

Falou

Link para o comentário
Compartilhar em outros sites

Não. A INT_RB funciona em todo o PORTB. Se você colocar mais botões, irao causa a mesma interrupção.

você pode no caso, colocar vários botões e fazer a interrupção na marra.

Tipo, você poe no seu programa se o botao for apertdado, uma variavel qualquer terá o valor igual a 2 por exemplo. Aí você poe um swich para cada caso da sua variavel. Criando uma esécie de menu.

Falou

qual a vantagem de trabalhar com essa interrupção tendo quase todo portb que ira causar a mesma interrupção

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