Autor Tema: Multitarea con un 16F873, se puede?  (Leído 11677 veces)

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

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #15 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.

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #16 en: 13 de Abril de 2007, 18:52:12 »
Mario muchas gracias, este fin de semana leo bien esos post que me mandaste.  :-)

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #17 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  :-)

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Multitarea con un 16F873, se puede?
« Respuesta #18 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
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado sandra

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 374
Re: Multitarea con un 16F873, se puede?
« Respuesta #19 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
El pesimista se queja del viento
El optimista espera que cambie
El realista ajusta las velas

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #20 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  :)

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Multitarea con un 16F873, se puede?
« Respuesta #21 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
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #22 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.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Multitarea con un 16F873, se puede?
« Respuesta #23 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
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #24 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  :-)

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #25 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.

Desconectado literatronic

  • PIC12
  • **
  • Mensajes: 98
Re: Multitarea con un 16F873, se puede?
« Respuesta #26 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