TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Chuk en 11 de Febrero de 2010, 19:54:30
-
Hola, tengo un programa que tiene en cuenta las interrupciones externas en RB0 por flanco de subida y un boton en RB4 (uso un PIC 16F84A). En Option_Reg tengo: 01000011 y en INTCON tengo: 10011000
Si debugeo con el isis, nadamas empezar el programa, cuando habilito las interrupciones me hace una interrupcion por apretar el botón en RB4 cuando no me lo tendría que hacer. Qué error hay? Adjunto la imagen del esquematico.
Saludos
-
Lo que debes hacer antes de habilitar la interrupción por cambio de estado de rb4-rb7, es leer el puerto b y limpiar el flag de esa interrupción, luego si habilitarla.
-
Pues lo hago y tampoco me funciona, me hace la interrupcion justo después de habilitar el INTCON. justo antes leo el puertoB porque el clear del flag de la interrupcion no hace falta ya que despues meto el vector en el registro INTCON y ya se borra el flag de interrupción no??
Saludos
-
El flag RBIF lo debes borrar despues de leer el puerto B, no se borra solo.
debes hacer
BCF INTCON,RBIF
creo que ese era el bit.
-
Si pero para habilitar la sinterrupciones escribo ya el registro INTCON con un 0 en el bit RBIF por lo que me tendría que borrar ese bit sin necesidad de hacer un bcf solo para ese bit no?
-
No recuerdo ahora si es asi, prueba limpiando ese flag antes de habilitar y luego avisas
-
Seguimos en las mismas, ni leyendo y haciendo un clear del flag de la interrupcion ni nada. La unica opcion es iniciar una variable que es la que controla la interrupcion en el otro estado que no quiero que se inicie para que así con la interrupcion cambie y se ponga al que yo quiero. Lo que no sé es si realmente cuando monte el PIC hará esta interrupción o no
-
sube el código, para ver que es lo que sucede.
-
Debes recordar que para leer y escribir en el puertob debes seleccionar el banco de memoria correcto, sino no hace caso a la lectura o escritura. Tal vez por eso no puedes borrar el flag de interrupción. Lo eseás simulando en proteus?
-
Sí, simulo con Proteus. El código es este, pero sí que he tenido en cuenta los bancos de memotira:
INICIO: clrf estado
clrf duracion
bsf selector,0
movlw b'01010011'
movwf caracter
bsf STATUS,RP0
movlw b'01111111'
movwf TRISB
movlw b'11111100'
movwf TRISA
movlw b'01000011'
movwf OPTION_REG
bcf STATUS,RP0
bsf PORTA,1
bcf PORTA,0
movlw b'10011000'
movwf INTCON
bsf PORTB,tx
goto MAIN
Lo que me cambia la interrupcion del boton es el bit 0 del registro selector y los PORTA,0 y PORTA1. En ese código he invertido el estdado de como quiero esos bits y así cuando inicio, contando la interrupción se me queda como quiero. Para leer el puerto y poner a 0 el flag lo hacía justo antes del bsf PORTA,1, después de cambiar de banco al 0
-
Estás habilitando también la interrupción por flanco del pin RB0.
Coloca todo el código, así podemos ver si hay algun error en otro lugar y así lo puedo simular y ver que pasa. Saludos
-
Pues sí, también habilito las interrupciones en RB0 por flanco de subida ya que el PIC servirá para detectar pulsos PWM y enviar una S por RS-232 cuando detecte pulsos de mas de 2ms.
Adjunto el código,
-
Cuando asignas el valor al option_reg, habilitas las pullups del puerto B, como el proteus asigna al principio como que tiene un cero, al poner los pullup hay un cambio de estado por eso entra a la interrupcion.
No se por que el proteus no deja borrar el flag RBIF cuando hacemos un clrf PORTB, debería hacerlo. Debe ser un BUG
Antes de habilitar las interrupciones coloca estas dos lineas
movfw PORTB
Bcf INTCON,0
Con esto si simula bien el proteus, y estoy seguro que en el micro tampoco va a saltar la interrupción.
-
Gracias :) Pues habia probado lo mismo pero con movf y no me funciono :S. En este caso,creo que no me hacen falta las resistencias pull-up ya que ya uso una conectada a Vcc y a la entrada del PORTB pero bueno.
Una pregunta a parte. Yo envio el carácter "S" por el puerto serie con 10bits (1 start, 8 de datos y 1 de stop). Para reconocerlo en el PC, hace falta enviar también un EOL (la tecla return)???
Saludos
-
El return es para que el hyperterminal salte una linea, no hace falta enviarlo.
-
Vale gracias Pablo. Entonces ya tengo el programa hecho y simulado. Sabes la manera de hacer un nuevo modelo para usar en el Ares? Es que tengo que crear un PCB con un componente que no sale y querría hacer el modelo por lo menos para ponerlo en el ares. He visto un manual pero solo usa encapsulados ya creados y no explica como crear nuevos.
Gracias
-
No, en eso no te puedo ayudar, no uso ares, uso el Orcad
Edito
Mira aquí:
http://www.ucontrol.com.ar/wiki/index.php/Dise%C3%B1o_de_paquetes_de_PCB_y_modelos_para_ARES (http://www.ucontrol.com.ar/wiki/index.php/Dise%C3%B1o_de_paquetes_de_PCB_y_modelos_para_ARES)
-
Muchas gracias.
Un saludo