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:
...
NumBit Var Byte
BitToSend Var Bit
ByteToSend Var Byte
...
OutCK Var PORTB.6 ' Out Clock
OutDA Var PORTB.7 ' Out Data
...
ByteToSend=$23
NumBit=8: GOSUB SendByte
...
'----[ Trasmite un bit en Clock/Data ]----------------------------------------
SendBit:
OutDA=BitToSend&$01 ' Coloco el bit a transmitir en el pin del dato
Pauseus 250 ' Espero 250 microsegundos
High OutCK ' Subo el pin del Clock
Pauseus 250 ' Espero otros 250 microsegundos
LOW OutCK ' Bajo el pin del Clock
RETURN
'----[ Trasmite un byte in Clock/Data ]---------------------------------------
SendByte:
LoopSendByte:
BitToSend=(ByteToSend&$01) ' Primer bit en BitToSend
GOSUB SendBit ' Trasmito el bit
NumBit=NumBit-1 ' Decremento el bit a trasmitir
IF NumBit!=0 THEN ' Si el bit no es el último ...
ByteToSend=(ByteToSend>>1) ' Desplazo hacia la derecha todos los bits
GOTO LoopSendByte ' Vuelvo a empezar
EndIf
RETURN
Bueno, espero que esto te sirva de algo.
Un saludo.