TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: unevox en 27 de Julio de 2007, 19:22:47

Título: Sacar un byte con 16f877 por portb.7
Publicado por: unevox 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??
Título: Re: Savar un byte con 16f877 por portb.7
Publicado por: xocas 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

Título: Re: Savar un byte con 16f877 por portb.7
Publicado por: RedPic 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:


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:

(http://picmania.garcia-cuervo.net/images/IR_NEC_Modulation.gif)


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

(http://picmania.garcia-cuervo.net/images/PRJ_RRLOGICANALYZER_EditData_05.GIF)

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.