Interrupción y temporizador en PIC16F690

0

Soy nuevo en la programación de mikro c y PIC y tengo problemas para apagar el LED en RB5 (verde) usando la interrupción en RA2 y esta interrupción es posible solo en 5 primeros segundos. Cualquier ayuda será apreciada

Aquí está el circuito en proteus

Aquí están los códigos en MIKRO C

void interrupt(){
  if(RA2 == 1 ){
    PORTB = 0 ;
  }
}

void main() {
  unsigned char j ;

  TRISC = 0b11111110 ;
  TRISA = 0b000100 ;
  OPTION_REG.INTEDG = 1 ;
  INTCON.INTE = 1 ;
  INTCON.GIE= 1 ;

  for ( j=0 ; j<10 ; j++ ){
    PORTC.RC0 = 1 ;
    delay_ms (500) ;
    PORTC.RC0 = 0 ;
    delay_ms (500) ;
  }

  ANSELH.ANS2 = 0 ;
  ANSELH.ANS10 = 0 ;
  ANSELH.ANS11 = 0 ;
  TRISB = 0b10010000 ;

  while (1){
    if (PORTB.RB4 == 1 )
      PORTB.RB5 = 1 ;
    else
      PORTB.RB5 = 0 ;
  }
}
    
pregunta N.J.M. Robert

2 respuestas

1

Creo que su problema es que está configurando el límite de interrupción en el flanco ascendente.

OPTION_REG.INTEDG = 1 ;

Por lo tanto, cuando se llama a la rutina de servicio de interrupción, la señal tendrá un valor de '1', por lo que lo siguiente si,

if(RA2 == 1 ){
  PORTB = 0 ;
}

Nunca es cierto, por lo que portb nunca se escribe en el valor '0'.

    
respondido por el payala
0

Puede haber otros errores en este programa. Me detuve después de ver 4 problemas sospechosos:

Es difícil sin conocer las definiciones del hardware PIC (sin saber la versión de los archivos de Microchip). En cualquier caso, la interrupción parece no especificar qué pin de salida cambiar, solo el puerto en el que reside el pin.

La descripción de su programa no aparece completa. Suponiendo que desea controlar el LED D1 durante los primeros 5 segundos. Esto no es posible ya que no define las entradas / salidas del puerto B hasta después de los retrasos.

Suponiendo que desea un retraso de 5 segundos como en su descripción. Estás haciendo un bucle de 2 500 ms de retraso 10 veces por un total de 10 segundos.

No borras la interrupción en tu rutina de interrupción.

...

Regrese y observe detenidamente el ejemplo que parece estar usando aquí: enlace

...

@payala es correcto. Está utilizando un interruptor configurado opuesto (conectado a tierra) al del ejemplo que está utilizando (conectado a Vdd).

    
respondido por el st2000

Lea otras preguntas en las etiquetas