Autor Tema: Interrupción por flanco de Subida PIC16F877  (Leído 6629 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado GalagaRX

  • PIC10
  • *
  • Mensajes: 2
Interrupción por flanco de Subida PIC16F877
« en: 01 de Diciembre de 2012, 09:39:39 »
Buenas tardes gente. Soy algo nuevo en esto de programar PIC y tengo una serie de dudas.

Quería saber como poder activar las interrupciones del PIC16F877, para poder utilizar el flanco de subida.

Necesito utilizar el flanco de subida para sincronizar los disparos de un tiristor, ya que mi programa no es lo suficientemente rápido y la señal se ve desincronizada.

Bueno, eso según mi propia experiencia. Quizá mi idea no es la correcta o quizá hay otras formas más eficientes de sincronizar el tiristor.
Actualmente tengo diseñado un detector de cruce por cero, que me genera un pulso en cada cero. Ese pulso lo estoy usando con un programa bien sencillo.
Aquí el programa.

define OSC 4


A Var Byte
B var byte

A=5
B=5

Inicio:
    IF portb.7=1   then pulso      'Entrada del Detector de Cruce por Cero  <--------
   
goto Inicio

                                                       
pulso:
IF a>9 then a=9
IF a==0 then A=1
B = 10-A


high portb.1
PAuse A
low portb.1
Pause B
Gosub Pulso2
   


IF portb.4=1 then   A=A+1  'Amplía el pulso
IF portb.5=1 then   A=A-1  'Disminuye el pulso 
               


goto pulso
               
'Subrutina fuera del ciclo   "La subrutina es innecesaria, aunque funciona
    Pulso2
    High portd.2
    Pause A
    low portd.2
    Pause B
    Return

Al parecer utilizar éste método no es lo suficientemente rápido, por lo cual, no alcanza a sincronizar bien la señal. Por eso es que quería utilizar el flanco de subida del puso generado por el detector de cruce por cero, que a mi juicio es más rápido. Quizá incluso ni siquiera es aquello lo que hace reaccionar mal el circuito.

Agradezco sus sugerencias y ayudas y si faltan más datos me dicen.
Gracias.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #1 en: 01 de Diciembre de 2012, 10:59:28 »

Seria bueno que consultes el buscador del foro el tema se ha tratado bastante. Aquí se enseña como detectar un flanco (de subida o de bajada) con el PIC16F877, los programa ejemplo se encuentran en ASM pero no debe ser difícil hacer la respectiva traducción a Basic.   
Un saludo desde Pereira - Colombia

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #2 en: 03 de Diciembre de 2012, 19:44:44 »
Este ejemplo simple no es para tu versión de basic ni para el mismo micro, pero a ver si te puede orientar.

http://www.todopic.com.ar/foros/index.php?topic=14917.msg113849#msg113849
Saludos desde Granada, España.

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #3 en: 04 de Diciembre de 2012, 15:07:57 »
hola GalagaRX  lo que quieres hacer es una deteccion de cruce por cero utilizando un pic me imagino que lo que quieres hacer es un dimmer digital o un arrancado de un motor ac y lo que quieres es controlar la velocidad del motor o la intencidad de una lampara (foco,bombillo o como lo conoscas..)

yo lei un monton sobre eso en sangoogle hay mucha informacion sobre dimmer digitales con el pic12f28 y algunos otros.
 todos concuerdan que lo mejor y mas facil es mediante la interrupcion por cambio de estado rb0. supongo yo que ya as trabajado con interrupciones y puedes implementar esta sino te combendria darle una vuelta al datashet que como ami me lo an sugerido un gran  maestro (dougflog) y ver lo que son el registro itcon para activar la interrupcion por cambio de estado en rb0 y el registro option para el suicheo de cambio acendente y decendente para que te detecte las 2 interrupciones de la onda alterna.

y haciendo esto le puedes poner una resistencia de 5 Mohm o maayor  a este pin de Rb0 directamente ala luz  para limitar la corriente que entra al pic y hacia detectar los cruces por cero.

espero esto te sirva si tienes mas dudas comentarlas para seguir apoyandote en lo que pueda

saludos



Desconectado GalagaRX

  • PIC10
  • *
  • Mensajes: 2
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #4 en: 11 de Diciembre de 2012, 14:55:32 »
Gracias por sus respuestas. Intenté utilizar el buscador para ver mi consulta, pero no pude encontrar el link que me enviaste, gracias por ello. De todas formas me complica usar un lenguaje que no conozco, pero lo intentaré.

Un compañero me ayudó un poco con las interrupciones en Basic, y aún así no logro hacer que ingrese al ciclo que le tengo programado.

On Interrupt GoTo Interr1
uno: INTCON = %10001000
    GoTo inicio
   
inicio: Clear PORTB
        TRISB = %11111100
        Clear OPTION_REG   
   
tres: GoTo tres
Interr1: PORTB.0 = 0
        Clear INTCON.0
        GoTo pulso


                                                       
pulso:

If a>9 Then a=9
If a==0 Then A=1
B = 10-A
....
...
..
.

Le tengo ingresada una señal por RB7 y no parece hacerle ningún efecto a la interrupcion, ni activandola ni dando paso al siguiente ciclo.
¿en que ando mal?
Muchas gracias por sus respuestas.

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #5 en: 12 de Diciembre de 2012, 18:41:09 »
GalagaRX  Hola amigo perdon por no contestar antes es que se me pasa dar una vuelta si quieres lo mas rapido mandarme un mensaje privado.
menciona el lenguaje que utilizas amigo es la forma mas facil para ayudarte aunque para hacer una activacion de alguna interrupcion que tiene el pic no es problema :)

como veo no as leido el datashet del pic como te lo sugeri es por donde deverias empesar amigo que me e dado cuenta que si los (pic)  fueran arboles el datashet del mismo seria las raices 

bueno en la hoja de datos o datashet del pic1f877a que es el que estas utilizando en la hoja #25 y 26 son las que necesitas leer
en la hoja 25 esta habla sobre el registro option por si quieres cambiar la interrupcion por cambio de estado ascendente y decendente en rb0(nadamas) si lo quieres en rb7
ignora la hoja 25

en la hoja 26 esta habla del registro itcon y mediante ese registro puedes activar la interrupcion que tu necesitas
se activan=1 y desactivan=0
te las enlisto

gie= esta opcion permite la interupcion global osea que activa todas las interrupciones ,hojo y mucho  este bit del registro itcon activa todas  las interrupciones pero no se ejecutan asta que tu le digas que interrupcion en especial vas a utilizar un ejemplo cotidiano de la vida seria que esta es la llave principal de tu casa y si quieres tomar agua de cualquier llave de tu casa y esta esta cerrada nunca saldra el agua por mas que intentes.

peie= es la interupcion glabal de perifericos ignorala ya que no la utilizaras si te interesa mas leer por tu cuenta jejeje  :) no te creas si tienes duda preguntar

tmr0ie=esta es para activar la interrupcion por desborde de tmr0

inte=activa la interrupcion por cambio de estado en rb0

rbie=activa la interrupcion por cambio de estado en los pines (rb4,rb5,rb6,rb7 ) que es lo que necesitas tu

tmr0if=este es un bit de bandera

intf= otro bit de bandera para la interrupcion por rb.0

rbif=bit de bandera de interrupcion por (rb4,rb5,rb6,rb7) tambien lo necesitas

si eres buen observador veras que hay 5 bits del registro itcon que terminan con la letra E y 3 bits que terminan con la letra F
esto que significa significa que que las 5 que terminan con letra E son para activar la interupcion que tu necesitas y las F son banderas que te indican que interrupcion se a activado y que tu sepas leyendo estas banderas cual fue activada,




 




Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #6 en: 12 de Diciembre de 2012, 18:55:00 »
aqui te dejo un ejemplo este biene en los manuales de pic simulador ide este ejemplo es para activar la interrupcion por cambio de estado en rb0 este te servira para que te des una idea de como configurar el registro itcon y como deve ir la rutina donde atendera la interrupcion

biene en ingles no creo que eso sea problema y si no saves ingles tal vez sea momento de enfrentarlo

TRISA = 0x00 'set all PORTA pins as outputs        /  puerto a como salida
PORTA = 0xff 'make all PORTA pins high              /saca por el puerto a puros ceros esto es para que no se cuele ningun 1 por hay al iniciar el programa
INTCON.INTE = 1 'enable RB0/INT interrupts       /activa la interupcion por cambio de estado en rb0 en el registro itcon
INTCON.GIE = 1 'enable all un-masked interrupts  /y activa la interrupcion global para que todas las interrupciones funcionen y disiendole cual usar rb0
End
 
On Interrupt 'interrupt routine                             /subrutina donde entrara cada que se crea una interrupcion
PORTA = PORTA - 1 'decrement the value on PORTA /puerto a se decrementa 1 cada que se activa una interrupcion
INTCON.INTF = 0 'enable new RB0/INT interrupts  /cada que se activa la interrupcion por rb0 cambia de estado la bandera intf pasa de ser 0 a 1 indicando que se activo
Resume                                                             /la interrupcion por rb0 para que pueda entrar otra ves la interrupcion se necesita borra esa bandera poniendola a
                                                                        /cero nuevamente INTCON.INTF = 0 es por eso que se pone asi

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Interrupción por flanco de Subida PIC16F877
« Respuesta #7 en: 12 de Diciembre de 2012, 18:57:18 »
creo que con eso ya quedo resolvido tus dudas si no es asi asmelo saver y veremos que mas puedo hacer
saludos amigo GalagaRX


 

anything