TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: literatronic en 09 de Abril de 2007, 17:03:11

Título: Multitarea con un 16F873, se puede?
Publicado 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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: sandra en 09 de Abril de 2007, 23:30:13
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: reiniertl en 10 de Abril de 2007, 11:06:40
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 10 de Abril de 2007, 14:55:26
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 10 de Abril de 2007, 18:00:35
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: sandra en 10 de Abril de 2007, 18:51:05
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 11 de Abril de 2007, 11:37:54
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  :-)
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: reiniertl en 11 de Abril de 2007, 13:53:48
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: Mario en 11 de Abril de 2007, 15:37:23
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 11 de Abril de 2007, 17:18:37
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  :-)



Título: Re: Multitarea con un 16F873, se puede?
Publicado por: sandra en 12 de Abril de 2007, 19:39:14
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

Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 13 de Abril de 2007, 09:40:39
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 13 de Abril de 2007, 14:42:41
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: navaismo en 13 de Abril de 2007, 14:55:25
en el caso anterior usabas pullups en portb??? si es asi ahora pones las resistencias fisicas de pullup o bien tienes elportc como entrada??
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: Mario en 13 de Abril de 2007, 15:13:38
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 13 de Abril de 2007, 18:45:24
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 13 de Abril de 2007, 18:52:12
Mario muchas gracias, este fin de semana leo bien esos post que me mandaste.  :-)
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 16 de Abril de 2007, 14:27:32
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  :-)
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: navaismo en 16 de Abril de 2007, 14:30:41
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: sandra en 16 de Abril de 2007, 16:03:15
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 18 de Abril de 2007, 10:27:17
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  :)
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: Mario en 18 de Abril de 2007, 23:15:13
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 19 de Abril de 2007, 17:45:44
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: navaismo en 19 de Abril de 2007, 18:54:22
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
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 24 de Abril de 2007, 11:38:54
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  :-)
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 03 de Mayo de 2007, 15:56:22
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.
Título: Re: Multitarea con un 16F873, se puede?
Publicado por: literatronic en 03 de Mayo de 2007, 16:48:10
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