TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: literatronic en 09 de Abril de 2007, 17:03:11
-
Hola a todos!
Estoy trabajando en un proyecto en donde con un 16F873 controlo un teclado matricial, muestro unos datos en un LCD y transmito serialmente a un PC. Quiero que la transmisión sea constante pero que también pueda estar pendiente del teclado, ya que al presionar ciertas teclas cambian unas variables que transmito al PC.
He leído sobre multitarea, pero creo que en los PIC no se puede implementar, no se que hacer para solucionar este inconveniente, si alguien me puede ayudar lo agradecería.
Muchas gracias.
-
Todo esto que mencionas no tiene mucho complicación par un pic efectivamente no realiza multitarea como tal pero manejando a adecuadamente las interrupciones del pic
No tendrás mayor problema.
Tienes que leer muy bien la data del pic a utilizar para que entiendas que recursos de interrupción tiene e implementarlas de manera que realice lo que pretendes
-
El término multitarea puede ser un poco controversial, pero si que puedes hacer multiprogramación, para ello puedes utilizar un RTOS que te permitirá hacer todo eso, llégate por el siguiente post http://www.todopic.com.ar/foros/index.php?topic=15876.0
Aclararás algunas de tus dudas al respecto
Un saludo Reinier
-
reiniertl ya mire el post y muy interesante lo de los RTOS, no los conocía, pero es para dedicarle tiempo y lo que necesito hacer ahora no justifica la utilización de algo tan avanzado, muchas gracias.
sandra voy a leer bien sobre las interrupciones para ver si las utilizo, muchas gracias.
-
He leído varios post sobre interrupciones y ya entiendo, más o menos, como manejarlas. Alguien sabe si el 16F873 tiene interrupción por serial?
He pensado en poner la interrupción cuando se presione alguna tecla, en el puerto B esta el teclado matricial, pero no estoy seguro de si funciona como quiero. Voy a probar y si alguna cosa pego mi programa para que por favor me ayuden a encontrar una solución.
Muchas gracias.
-
Anda tio lee la data del pic 16f873 te aseguro que no muerde y de pasada te evitaras muchos malos ratos.
Todos los pic que cuentan con puerto serial cuentan con interrupción .
Si te atreves a preguntar si el pic 16f873 cuenta o no con puerto serie te prometo que se borra todo este tema :x
-
Listo sandra! ya leí la hoja de datos de mi 16F873 :mrgreen:
Estoy utilizando la comunicación USART por medio de los pines RC6/TX/CK para transmisión (salida) y RC7/RX/CK para recepción (entrada). Ya ví que esta comunicación si tiene interrupción por medio de los registros asociados a ella como son PIE1(4,5) y PIR1(4,5), lo que no estoy seguro es de cómo funciona, es decir, si yo estoy en la rutina de lectura del teclado, cuándo se produce una interrupción? cuando recibo algo supongo, pero cómo se que recibí algo si estoy "encerrado" en el loop de la rutina del teclado esperando que sea presionada una tecla.
Apenas le estoy cogiendo el tiro a esto de las interrupciones, por favor tenéme paciencia, gracias :-)
-
Si las interrupciones están debidamente configuradas y además habilitadas no importa donde en que parte del código se esté ejecutando tu programa, si se produce una interruipción: SE INTERRUMPE LA EJECUCIÓN PARA ATENDER LA INTERRUPCIÓN.
Esto quiere decir que antes de utilizar este poderoso mecanismo debes empaparte bien en su funcionamiento, porque tu sistema puede hacer cosas raras ya que este es un mecanismo asincrónico que puede alterar el funcionamiento del sistema o modificar datos que no pueden ser modificados en determinados momentos.
un saludo Reinier
-
Hola.
Como bien lo sugieren deberías leer un poco sobre las interrupciones y sus manejos:
http://www.todopic.com.ar/foros/index.php?topic=4264.0
http://www.todopic.com.ar/foros/index.php?topic=3613.msg106019#msg106019
http://www.todopic.com.ar/foros/index.php?topic=3925.msg28601#msg28601
Como estás colocando el mensaje en el foro de Basic, se ha realizado una búsqueda con las palabras "configuración interrupciones" en el buscador del foro, en el subforo de BASIC.
Te aconsejo leeas los temas, viene uno con lo que tu necesitas (creo); todo lo anterior en BASIC.
Sería recomendable que te "metieras" con el buscador, por lo general ya alguien lo hizo o inició y la información se encuentra dentro del foro.
Espero te ayude en algo.
-
Muchas gracias por su ayuda, de verdad que ya he leído mucho sobre interrupciones, tanto que estoy enredando todo. Como ya dije quiero utilizar la interrupción de la USART, entonces:
INTCON = %01000000 'Habilito interrupciones de periféricos
PIE1 = %00100000 'Habilito interrupción por USART
Cuando hay una interrupción, porque recibe información por el pin RC7/RX/CK, sale de la rutina del teclado y se va a atender la rutina de comunicación esto con:
ON INTERRUPT GOTO comunicacion
'El resto del programa ...
comunicacion:
DISABLE
LOW TRANS
SERIN2 RX,84,[UNIDAD1]
SERIN2 RX,84,[UNIDAD2]
SERIN2 RX,84,[UNIDAD3]
SERIN2 RX,84,[UNIDAD4]
SERIN2 RX,84,[UNIDAD5]
SERIN2 RX,84,[UNIDAD6]
IF UNIDAD1 = UBI2 THEN
HIGH TX 'Para que salga bien la primer línea de la tx.
HIGH TRANS
SEROUT2 TX,84,[UBI2,UNIDAD2,CONT,UNI1,UNI2,UNI3,_
DAPARO,CODI6,CODI7,CODI5]
LOW TRANS
RESUME
ELSE
GOTO comunicacion
ENDIF
No se si estoy mezclando todo, por favor me podrían hacer el favor de decirme si voy bien o en que me estoy equivocando :-)
-
Haber ya le diste lectura al data del pic ahora te recomiendo que te leas el manual del pbp copo pista te puedo decir que así gamas te va a funcionar ya que no estas utilizando la comunicación serie por hardware y así nunca vas a trabajar con la interrupción.
Te as metido en un lió algo complejo te pregunto sabes cual es la diferencia entre una interrupción en ASM y una en pbp noooo pues ale a quemarse las pestañas.
Nota... Para que alguien te pueda ayudar debes mostrar el código completo con el fragmento que expones es imposible saber que esta haciendo tu programa
-
Muchas gracias sandra por tus jaladas de orejas :mrgreen:
Ya me dí cuenta que los comandos para la comunicación USART son el HSEROUT y el HSERIN. Ahora estoy leyendo bien todo el manual de PBP, el DS del 16F873 y lo que encuentre sobre interrupciones.
Voy a hacer unos cambios en el hardware y en el programa para intentar unas cositas, si funcionan pego el programa completo, muchas gracias.
-
Ya hice unos cambios pero no me funciona el teclado matricial :?
Tenía el teclado en el puerto B y decidí cambiarlo para el puerto C, para poder utilizar las interrupciones del B, y ya no me funciona (no me lee las teclas que presiono).
Alguien me podría decir por qué?
Muchas gracias.
-
en el caso anterior usabas pullups en portb??? si es asi ahora pones las resistencias fisicas de pullup o bien tienes elportc como entrada??
-
Con respecto al mensaje personal:
Revisa estos enlaces, están explicados los envíos en hardware de RS232 para PBP, interrupciones en Timer1 y RB0
http://www.todopic.com.ar/foros/index.php?topic=4273.0
http://www.todopic.com.ar/foros/index.php?topic=4077.0
http://www.todopic.com.ar/foros/index.php?topic=4287.0
http://www.todopic.com.ar/foros/index.php?topic=14623.0
http://www.todopic.com.ar/foros/index.php?topic=3796.0
http://www.todopic.com.ar/foros/index.php?topic=3700.0
http://www.microengineeringlabs.com/resources/samples/pbp/onint.bas
http://www.microengineeringlabs.com/resources/samples/18F/serA452.bas
-
en el caso anterior usabas pullups en portb??? si es asi ahora pones las resistencias fisicas de pullup o bien tienes elportc como entrada??
Por ahora lo estoy simulando en Proteus y es ahí en donde no me funciona el teclado. Cambio las conexiones del puerto B al puerto C, sin poner resistencias (será que las necesito poner en Proteus?), y cambio el registro TRISC.
No lo he probado en la board, lo hago?
Muchas gracias navaismo.
-
Mario muchas gracias, este fin de semana leo bien esos post que me mandaste. :-)
-
Hola a todos! :)
He estado haciendo cambios en el software y en el hardware, y hasta el momento me han funcionado cositas con los de software (por fin le estoy cogiendo el tiro a la comunicación USART :lol: ), por ejemplo: ya recibo datos, con HSERIN, pero al momento de transmitirlos, con HSEROUT, me sale un signo raro en el último byte que transmito, de un total de 10. Tengo configurada la comunicación USART así:
'Para la comunicación USART
DEFINE HSER_RCSTA 90h 'Coloco el registro receptor en receptor habilitado
DEFINE HSER_TXSTA 24h 'Coloco el registro de transmisión en transmisión habilitada
DEFINE HSER_BAUD 9600 'Coloco el baud rate
DEFINE HSER_SPBRG 25 'Periodo de funcionamiento del generador de baudios
DEFINE HSER_CLROERR 1 'Para limpiar el bit CLEN de RCSTA automáticamente
Mario, en uno de los links que me mandaste aparece esta línea:
@ DEVICE HS_OSC
Me podrías hacer el favor de decirme para qué sirve.
En los cambios de hardware no he podido hacer que me funcione el teclado matricial en el puerto C, lo monté en la board y nada, como tengo conectado el LCD a los mismos 4 pines de salida que van al teclado (para ahorrarme pines) me aparecen en el LCD unos caracteres raros cuando debería aparecer un mensaje.
Les pido el favor de tenerme paciencia, apenas estoy empezando a cogerle el tiro a la programación, muchas gracias a todos :-)
-
La linea @ DEVICE HS_OSC sirve para configurar el Fuse del cristal externo del PIC a HighSpeed generalmente usados para cristales de 20MHZ. la linea @ DEVICE sirve para configurar todos los FUSES desde el software; ya sea codigo de pretoccion el watch dog el mclr etc etc.
Saludos
-
Hola recibir caracteres raros en el primero o ultimo bit desafortunadamente no es cosa extraña en ello interviene la velocidad a la que estés trabajando, si tu código de transmisión y recepción están trabajando al unísono, es decir mandas el primer bit y puede ser que tu código receptor no este listo para recibirlo sobre todo si lo manejas por interrupción puede que llegue a la rutina de recepción tarde tendrás que realizar muchas pruebas asta hallar el punto optimo de funcionamiento
Suerte
-
Hola! Ya pude cambiar el teclado matricial para el puerto C, agregue unas resistencias conectadas a Vdd para asegurar un estado lógico al momento de leer el puerto y me funcionó. Ahora voy a intentar utilizar la interrupción por el pin RB0 o la de los pines RB4-RB7. Tengo una especie de duda acerca de algunos comandos a utilizar, por ejemplo:
ON INTERRUPT GOTO interrupcion ' Se pone en dónde?, he leído que después de la declaración de variables y los DEFINE.
DISABLE
interrupcion:
.
.
.
RESUME
Entre la rutina de interrupcion tengo que manipular de alguna forma el registro INTCON?
Cuando configuro, al principio de mi programa, el registro INTCON tengo que habilitar las interrupciones generales y la interrupción específica que voy a utilizar, cierto?
Mario muchas gracias por los post que me mandaste. Y gracias a todos los que me han ido colaborando, ahí voy aprendido poco a poco :)
-
Hola.
Te aconsejo veas el manual en las páginas 19 (OPTION), 20 (INTCON) y 129 (interrupciones)
Tienes que configurar el OPTION_REG.INTEDG, que es lo mismo que el registro Opción,6:
OPTION_REG.6=1 si quieres que la interrupción se active en el flanco ascendente
OPTION_REG.6=0 si quieres que la interrupción se active en el flanco descendente
Debes activar el INTCON.GIE e INTCON.INTE, que es lo mismo que INTCON=%1001 0000
Ya que tienes eso, configuraste las interrupciones globales para ser aceptadas y habilitaste la interrupción externa en RB0.
Después que realices lo que tengas que hacer dentro de la interrupción, borras la bandera de interrupción externa de RB0 asi: INTCON.0= 0; luego colocas RESUME y listo.
El código que viene en la página de microengineering labs te sirve: http://www.microengineeringlabs.com/resources/samples/pbp/onint.bas
-
Mario implementé la interrupción por cambio de estado en RB4-RB7 seguiendo el ejemplo de la página de microengineering labs, cambiando el registro INTCON, y al compilar me aperece el siguiente mensaje:
Error EJ6B4C~1.ASM 1436:[218]address limit of fffh exceeded
Sabés qué significa este error?
Gracias.
-
que has sobrepasado la capacidad de programacion de tu PIC recuerda que cada PIC tiene cierta capacida en memoria para su programacion y al parecer esta se ha excedido
-
Gracias navaismo, depuré mi programa y ya me compila.
Estoy dandole a las interrupciones y ya le estoy cogiendo el tiro, me falta manejar la bandera correspondiente a la interrupción que implementé y así poder tener un "control total" de la interrupción.
Muchas gracias a todos, si me funciona el programa como quiero la publico :-)
-
Después de mucho intentar solucionar mi problema con interrupciones, sin resultados positivos, me decidí por manejar la comunicación con un 16F627 (ya que tengo muchos disponibles, pero la idea es utilizar después uno más barato) y con el 16F873 el teclado y el LCD.
Ya me funciona como quiero, pero la comunicación es muy lenta. Alguien me podría decir si la comunicación serial implementada en PBP es más lenta que la implementada en otros lenguajes de programación como por ejemplo Assembler?
Otra cosa podría ser el protocolo. Para el manejo del RS485 utilizo los DS75176 y creo que al conectar dos dispositivos la ocupación del bus es problematica, es decir, un dispositivo me bloquea al otro a veces.
Muchas gracias a todos.
-
En el mensaje anterior se me olvido pegar el programa del 16F627, el de la comunicación, para que vean como la estoy haciendo, aqui va:
'Definimos el Oscilador
DEFINE OSC 4
'Se incluye libreria para comunicación serial
Include "modedefs.bas"
TXPIC VAR PORTB.7 'Para decirle al 16F873 que esta listo para recibir datos
RXPIC VAR PORTB.6 'Para recibir los datos del 16F873
TRANS1 VAR PORTB.3 'Para saber si hay que enviar datos al 16F873
TX VAR PORTB.2 'Para enviar datos al PC
RX VAR PORTB.1 'Para recibir datos del PC
TRANS2 VAR PORTA.1 'Para controlar la transmisión por medio del DS75176
CONT var byte 'Para almacenar el número de Bytes a enviar
UNIDAD1 VAR BYTE 'Donde se van a guardar los datos recibidos del PC
UNIDAD2 VAR BYTE
UNIDAD3 VAR BYTE
UNIDAD4 VAR BYTE
UNIDAD5 VAR BYTE
UNIDAD6 VAR BYTE
UNIT1 VAR BYTE 'Donde se van a guardar los datos recibidos del 16F873
UNIT2 VAR BYTE
UNIT3 VAR BYTE
UNIT4 VAR BYTE
UNIT5 VAR BYTE
UNIT6 VAR BYTE
UNIT7 VAR BYTE
UNIT8 VAR BYTE
'****************** PROGRAMA ************************************
TRISB = %01111011
TRISA = %111101
PORTA = 0:PORTB = 0
CONT = 7
unidad1=0:unidad2=0:unidad3=0:unidad4=0:unidad5=0:unidad6=0
uniT1=0:uniT2=0:uniT3=0:uniT4=0:uniT5=0:uniT6=0:uniT7=0:uniT8=0
'RECEPCIÓN Y ENVIO DE DATOS DESDE Y HACIA EL PC
SER_UNI2:
IF TRANS1 = 1 THEN
gosub SER_UNI1
endif
LOW TRANS2
SERIN2 RX,84,1000,SER_UNI2,[UNIDAD1]
SERIN2 RX,84,1000,SER_UNI2,[UNIDAD2]
SERIN2 RX,84,1000,SER_UNI2,[UNIDAD3]
SERIN2 RX,84,1000,SER_UNI2,[UNIDAD4]
SERIN2 RX,84,1000,SER_UNI2,[UNIDAD5]
SERIN2 RX,84,1000,SER_UNI2,[UNIDAD6]
IF UNIDAD1 = UNIT1 THEN
high TX 'Para que salga bien la primer línea de la tx.
HIGH TRANS2
SEROUT2 TX,84,[UNIDAD1,UNIDAD2,CONT,UNIT2,UNIT3,UNIT4,_
UNIT5,UNIT6,UNIT7,UNIT8]
LOW TRANS2
GOTO SER_UNI2
else
unidad1=0:unidad2=0:unidad3=0:unidad4=0:unidad5=0:unidad6=0
GOTO SER_UNI2
ENDIF
'RECEPCIÓN DE DATOS QUE VIENEN DEL 16F873
SER_UNI1:
HIGH TXPIC
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT1]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT2]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT3]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT4]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT5]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT6]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT7]
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT8]
LOW TXPIC
return