Autor Tema: Sacar un byte con 16f877 por portb.7  (Leído 3357 veces)

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

Desconectado unevox

  • PIC10
  • *
  • Mensajes: 12
Sacar un byte con 16f877 por portb.7
« en: 27 de Julio de 2007, 19:22:47 »
hola alguen me puede ayudar,

resulta que necesito sacar un byte por el puerto b mas especifico por portb7

data = $23

como saco data por portb7??
« Última modificación: 28 de Julio de 2007, 10:10:23 por unevox »

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Savar un byte con 16f877 por portb.7
« Respuesta #1 en: 28 de Julio de 2007, 05:43:08 »
hola unevox

verás, en principio no hay mayor dificultad en sacar como tu dices el valor de data por el puerto b. sería algo tan sencillo como portb = data (tras haber establecido el tipo de variable y asignado el valor a data, lógicamente) pero.... peeeero creo que tienes una pequeña confusión cuando dices que lo quieres en portb.7.

el puerto b es un puerto de 8 bits (1 byte, de portb.0..7) y cada uno de sus pines, tratándose de un bit, solo pueden tener un valor de 0 o 1 así que no es posible sacar el valor de data por portb.7 salvo que lo hagas serialmente, enviando un bit tras otro. ($23 = 00100011)

si tienes necesidad de hacerlo así revisa el datasheet y verás que el pic dispone de usart en su puerto c, con lo cual la transmisión de datos en serie se ve muy facilitada.

espero haberte ayudado en algo

« Última modificación: 28 de Julio de 2007, 05:47:07 por xocas06 »

Conectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Savar un byte con 16f877 por portb.7
« Respuesta #2 en: 28 de Julio de 2007, 09:30:01 »
Tal como te dice el amigo xocas06 por un pin del Port B sólo puedes sacar un Byte de 8 bits si envías cada bit uno tras otro.

Te lanzo una serie de ideas sobre el asunto:

  • Esto normalmente se hace  bajando y subiendo el estado del pin según una secuencia determinada compatible en tiempos y niveles con el sistema que debe recibir dicho dato.
  • Según sea el protocolo (o acuerdo en la forma de transmitir) podrás representar un bit 0 como el estado a 0 de dicho pin durante un cierto tiempo y el bit 1 como el estado a 1 de dicho pin durante un mismo tiempo, igual al anterior y depués de él.
  • De igual igual forma podrías representar los bits 0 como 1 y los bits 1 como 0 siempre y cuando los dos extremos de la comunicación estén de acuerdo en el sistema a usar.
  • Si el sistema a utilizar es en modo asíncrono ambos extremos de la comunicación acuerdan que cada bit enviado, 0 ó 1, duran un determinado espacio de tiempo tras detectar el primero que se envía, y se recibe. Este es es el típico modo de enviar información con el protocolo RS232 por ejemplo. Los bits van llegando uno tras otro cada uno con un ancho de pulso, tiempo en alto o en bajo, predeterminado por la velocidad acordada: a 9600 baudios cada bit dura exactamente 1 segundo dividido entre 9600. Un byte de 8 bits tarda en enviarse exactamente 8 veces ese tiempo.

Te pongo un ejemplo gráfico de un protocolo serie asíncrono, con un solo pin, en este caso el Protocolo NEC para transmisiones de Infrarrojos:



  • Si el sistema es en modo síncrono es otro pin del PIC el que indica cuándo hay que leer el pin donde se va a representar el bit a transmitir. A ese pin especial se le llama Clock o sincronismo. El Clock está en alto permanentemente significando que no hay nada que leer. Si queremos transmitir un bit colocamos en el pin del Dato el estado alto o bajo del bit a transmitir y después bajamos y subimos el pin del Clock para que el receptor haga la lectura del bit de Dato. Haciendo esto 8 veces consecutivas transmitimos el byte completo. Aquí los tiempos son irrelevantes ya que la lectura se produce solamente cuando se detecta en el receptor la transición de alto a bajo del pin de Clock y en ese momento el pin de data ya está actualizado así que solo debemos leer su estado y en paz.

Te muestro gráficamente un ejemplo de una transmisión de este tipo, Clock & Data:



Fíjate cómo cada vez que la señal del canal 2 (en verde) que representa el Clock baja hay un estado en el  canal 1 (en celeste) que es el data. En este ejemplo en concreto hay primero 8 ceros y despues empieza una secuencia de 1101001000001

Y como estamos en el Foro de Pic Basic pues vamos a terminar con un ejemplo en este idioma. A continuación te pongo un ejemplo de cómo realizar este último protocolo síncrono:

Código: QBasic/QuickBASIC
  1. ...
  2. NumBit          Var     Byte
  3. BitToSend       Var     Bit
  4. ByteToSend      Var     Byte
  5. ...
  6. OutCK           Var     PORTB.6                 ' Out Clock
  7. OutDA           Var     PORTB.7                 ' Out Data
  8. ...
  9. ByteToSend=$23 
  10. NumBit=8: GOSUB SendByte
  11. ...
  12. '----[ Trasmite un bit en Clock/Data ]----------------------------------------
  13. SendBit:
  14.         OutDA=BitToSend&$01     ' Coloco el bit a transmitir en el pin del dato
  15.         Pauseus 250     ' Espero 250 microsegundos
  16.         High OutCK      ' Subo el pin del Clock
  17.         Pauseus 250     ' Espero otros 250 microsegundos
  18.         LOW OutCK       ' Bajo el pin del Clock
  19. RETURN
  20.  
  21. '----[ Trasmite un byte in Clock/Data ]---------------------------------------
  22. SendByte:
  23.  
  24. LoopSendByte:
  25.         BitToSend=(ByteToSend&$01)                      ' Primer bit en BitToSend
  26.         GOSUB SendBit                                           ' Trasmito el bit
  27.         NumBit=NumBit-1                                         ' Decremento el bit a trasmitir
  28.         IF NumBit!=0 THEN                                       ' Si el bit no es el último ...
  29.                 ByteToSend=(ByteToSend>>1)              ' Desplazo hacia la derecha todos los bits
  30.                 GOTO LoopSendByte                               ' Vuelvo a empezar
  31.         EndIf  
  32. RETURN

Bueno, espero que esto te sirva de algo.

Un saludo.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania