Página 1 de 1

16F628A - Interrupção Timer0

MensagemEnviado: 03 Jun 2008 16:54
por alexhnunes
Pessoal, estou com o seguinte problema: tenho um acionamento com dois botões, sendo um incremento e o outro decremento. Ao utilizar somente eles, tudo jóia, não há problemas. Porém, quando habilito uma interrupção no Timer0 (o sistema precisa dela para gerar um PWM), os botões se tornam inativos. Eis uma parte do código (estou utilizando o MikroC):

...

#define Alto PORTB.F1
#define Baixo PORTB.F2

unsigned int cnt = 0;
signed int i = 25;

void interrupt(){
cnt++;

TMR0 = 236;
INTCON = 0x20;

if (cnt <= i){
Alto = 1;
Baixo = 0;
}
if (cnt > i){
Alto = 0;
Baixo = 1;
}
if ((cnt > 50)){
cnt = 0;
}
}

void main (){
PORTB = 0;

TRISB = 0;

PORTA = 0;

TRISA.F0 = 1;
TRISA.F4 = 1;

OPTION_REG = 0x80;
TMR0 = 236;
INTCON = 0xA0;

CMCON = 0x07;

...

Simulei no Proteus e funcionou direitinho, porém no hardware aconteceu este problema. Não sei se posso estar esquecendo algo, mas já verifiquei esquemas e literaturas aqui e não encontrei nada. Estou trabalhando com o PIC 16F628A (chatinho de configurar!) e cristal de 8MHz.

MensagemEnviado: 04 Jun 2008 07:41
por ze
observações preliminares não solucionantes:
-INTCON com 0x20 bloqueia ints (GIE=0) INTCON.7
-F628 tem pwm por hw. poupe a cabecinha do uC. Procure usá-lo.
abrçs

MensagemEnviado: 04 Jun 2008 13:56
por alexhnunes
Ok, acabei resolvendo o meu problema usando o módulo PWM (CCP1) para variar a rotação e outro pino para inverter a rotação do motor. Funcionou perfeitamente. Eu estava gerando um PWM com dois pinos utilizando o Timer0, assim eu utilizaria somente dois botões, pois a variação dos dois pulsos contrários faziam a variação de velocidade e a mudança de rotação, consequentemente eu só utilizaria dois botões. Agora uso três.

MensagemEnviado: 05 Jun 2008 22:34
por leoabubauru
Talvez seu problema estivesse no fato de você não resetar o flag de overflow da interrupção de timer...