Página 1 de 1

Interrupção Pic 16F628A

MensagemEnviado: 21 Abr 2014 10:40
por renatosouza82
Ola a todos, preciso aprender como fazer interrupçao nesse pic, mas ja tentei sozinho e nao consegui, procurei internet afora e nao encontrei nada esclarecedor, acabei de entrar no forum, gostaria da ajuda de vcs, desde ja obrigado.

Vou colocar o q eu fiz pra tentar mostrar o q eu preciso:

cpp code
#include <16F628A.h>

#FUSES NOWDT //Sem Timer Cão de Guarda
#FUSES INTRC_IO //Oscilador Interno e dois pinos de I/O liberados
#FUSES NOPUT //Sem timer de alimentação
#FUSES NOPROTECT //Epprom desprotegida (permite a leitura)
#FUSES NOBROWNOUT //Brownout desabilitado
#FUSES NOMCLR //Pino Master Clear habilitado como porta I/O
#FUSES NOLVP //Programação em baixa tensão desabilitada
#FUSES NOCPD //Código desprotegido (permite a leitura)

//A frequencia do Clock Interno é de 1Mhz
//A sentença abaixo informa ao compilador essa frequencia para que este
//calcule corretamente os delays em mili-segundos
#use delay(clock=4000000)

#define PINO_LED PIN_A3 //Define em qual pino o LED está ligado

void main() {
int temp = 0, temp1 = 0, init = 1, blk = 0;
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

output_high(PIN_A3);

while (TRUE) {

if (init == 1) {
if(input(PIN_B0)){
init=0;
output_high(PIN_A3);
delay_ms(1);
}
if (temp1 == 480) {

output_low(PIN_A3);
init = 0;
temp1 = 0;
}
delay_ms(125);
temp1++;
delay_ms(1);
}
delay_ms(1);

if (input(PIN_B0)) {
output_high(PIN_A3);
delay_ms(1); // Liga o Led
}

if (blk == 1) {
goto rotblk;
}
if (input(PIN_B1)) {
blk = 1;
rotblk:
if (temp <= 480) {
if (temp == 480) {
output_low(PIN_A3);
blk = 0;
temp = 0;
}
delay_ms(125);
temp++;
delay_ms(1);
}
}
delay_ms(1);
}

}


Só q o delay ficou muito como gambiarra, é onde eu precisava da interrupçao...

Re: Interrupção Pic 16F628A

MensagemEnviado: 21 Abr 2014 23:37
por fagovi
Olá Renato...

Olha... a algum (muito) tempo atrás fiz um programinha para um projeto da faculdade.... ele utiliza a interrupção externa de 16f818, acredido que seja parecido...

Re: Interrupção Pic 16F628A

MensagemEnviado: 22 Abr 2014 09:51
por ze2
que tal se voce desse uma olhadela no datasheet do pic? lá voce vai ver diretinho como funciona este lance de interrupção por timer. Vou lhe dar uma prévia: tem um contador que entra 1/4 da freq do clock com um prescaler divisor que diminui ainda mais se vc quiser. este contador 8 bits (p.ex. timer0) que conta sempre pra frente, gera um sinal de interrupção a cada passagem de 255 pra 000. voce pode alimentar este valor no contador. p.ex. coloque 235 e ele vai "passar batido" sem fazer nada por 20x até 255. de posse do valor do clock e das informações supramencionadas, voce pode prever diretinho "quando" (aí estaria sua precisão e precisão) o mc vai interromper o que está fazendo e tratar de fazer algo numa rotina predeterminada. nela voce deve primeiramente realimentar com 235 (p.ex. pois o contador não pára) e apagar o sinal de interrupção (flag).

ou algo do gênero...

Bom isso é o que ocorre nas entranhas fedorentas da coisa. Se desejar algo mais limpo como as funções mastigadas do seu compilador, infelizmente me inclua fora dessa. Só tenho nível inferior....

abç