Autor Tema: Leer byte de un puerto entero  (Leído 2355 veces)

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

Desconectado tecno1814

  • PIC10
  • *
  • Mensajes: 2
Leer byte de un puerto entero
« en: 06 de Noviembre de 2017, 01:31:18 »
Bien, para comenzar os explico lo que quiero hacer:
Pienso hacer un reloj de cuenta regresiva, un pic 16f877a como "maestro" y un 16f84a como "esclavo". El "maestro" tendrá 2 displays de 7 segmentos y un teclado de 12 botones(10 de numeros y 2 de acciones(reset y play/stop)), este es el que va a tener cerca el usuario y le va a poner los minutos que quiera a la cuenta regresiva, el "maestro" le va a enviar los datos al "esclavo" que está a unos 4 metros de distancia usando 5 pines para transmitir los minutos y 2 pines para acciones que es la parte sencilla; la parte que se me complica es a la hora de leer los bits que le envió al esclavo... no quiero pasarme la vida haciendo if's en el codigo asi que quiero leer el byte que se forma y usarlo directamente como dato, ya que el esclavo se va a encargar de la cuenta regresiva y de mostrarlo en 4 display de 7 segmentos multiplexados.

mi super problema es el de leer el byte del puerto (quizas del puerto A por tener justo los pines que necesito) y usarlo como variable en mi cuenta regresiva.

De antemano muchas gracias por su atención.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer byte de un puerto entero
« Respuesta #1 en: 06 de Noviembre de 2017, 08:21:23 »
¿Y por que no usar uno de los modulos que esta presente en ambos y solucionarte la vida?

Por ejemplo SPI, UART, I2C

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re:Leer byte de un puerto entero
« Respuesta #2 en: 06 de Noviembre de 2017, 11:32:54 »
Buenas, independientemente de que como dice Killer puede ser mas fácil, en que lenguaje programas?

Leerlo en CCS es de una manera, en ASM de otra, en fín...

Salutes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer byte de un puerto entero
« Respuesta #3 en: 06 de Noviembre de 2017, 12:22:53 »
Es que leer los puertos de esa manera requiere al menos un uso de una señal de sincronismo, controlar tiempos, etc. Por eso evité seguir con el tema que el queria.

Mientras que con usar un módulo es poner el dato y olvidarse, además de usar menos pines.

Desconectado fuente

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 573
Re:Leer byte de un puerto entero
« Respuesta #4 en: 06 de Noviembre de 2017, 13:37:45 »
El problema es que el 16f84a viene bastante "pelado" en cuanto a módulos, y no tiene ni SPI ni UART ni I2C.
¿Por qué el 16f84a? está bastante desfasado ya y los hay más baratos y con más módulos y memoria.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer byte de un puerto entero
« Respuesta #5 en: 06 de Noviembre de 2017, 14:05:02 »
No me habia fijado en que PICs usaba, pero si, no tiene sentido ya a estas alturas usar un PIC16F84A cuando su coste es mucho mayor que otros con mas prestaciones.

Desconectado tecno1814

  • PIC10
  • *
  • Mensajes: 2
Re:Leer byte de un puerto entero
« Respuesta #6 en: 07 de Noviembre de 2017, 15:44:40 »
mis razones para usar esos pics es porque son los que tengo a la mano, programo en ccs.

habia visto por ahi la función "input" y sus respectivas variantes... como podria usarlas a mi proyecto?
además, queria usar i2c pero mi distancia es muy larga(4 mts) y uart no me apetece usarlo(y menos que el f84 no lo tiene)

De antemano gracias por tomarse el tiempo en responder.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer byte de un puerto entero
« Respuesta #7 en: 07 de Noviembre de 2017, 22:08:18 »
Como no queres estar preguntando con un if continuamente entonces te queda esta solucion:

Primero implementar un pin para "sincronizar" (cuando tomar las entradas).
El unico pin que se activa por flanco es RB0, asi que deberia ser ese.

Usar FAST_IO asi no te cambia el estado del puerto que uses para leer los datos ( al usar input o output ).
Setear los tris con set_tris_x , donde x es el puerto, sea a o b ( ej. set_tris_a(0x15) ) asi lo seleccionas como entrada o salida
Activar la interrupcion por RB0, creo que se llama EXT.
En la interrupcion leer los datos con input_a input_b, segun el puerto que desees usar.
Guardarlo en donde mas desees ( variable que te guste, array, etc).
Fin.

Luego en el programa principal, leeras esa variable.