Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

21/05/2008 #1


Como Almacenar dato en PIC
Un saludo:

Estoy usando un pic16F877A.

Deseo almacenar en un registro un numero que viene del PC, este numero es decimal, tengo disponible 1 pin del PC para llevar este dato al PIC.

Mi pregunta es, si el dato es binario y lo envio por un solo pin, por decir envio 0101 como almaceno esto en un registro del PIC.

Gracias.

(Uso el PIC SIMULATOR IDE)
21/05/2008 #2

Avatar de Ardogan

¿Te comunicás con la PC con 1 solo pin?. No creo que no se pueda hacer pero lo veo "exótico" (*).
¿Ese único pin lo usas para enviar y recibir información o solamente para recibir?.
¿Que puerto usás de la PC?.

Bueno, si la información viene del puerto serie para recibir los datos podrías usar la pata RX del modulo USART o UART del pic, usando el puerto en modo asíncrono.
El pic va a tener que conocer de antemano con qué velocidad la pc le va a enviar los datos (configurando el "baud rate" etc).
Por otra parte, de cuántos bits es el número decimal?, usando el usart del pic vas a poder recibir de a 8 bits.
Si usás el usart del pic la opción más lógica sería usar el puerto serie de la pc (si tenés uno, la mayoría de las pc nuevas no lo traen).

Información sobre como usar el USART sobra en el sitio microchip, hace una búsqueda ahí que no tengo dudas que vas a encontrar todo lo necesario (información del módulo usart, código fuente, notas de aplicación, etc)

Creo que se utilizaba una sola línea para comunicación por LIN también (también hay información en uchip).

A ver si te sirve y nos contás como vas a hacer.
Saludos

(*): tengo que reconocer que por mi corta experiencia me falta muuuuucho para ver, seguramente es una más en esa larga lista
21/05/2008 #3


No estoy usando ningun puerto del PC, uso una tarjeta de national instrument.

Ese pin lo uso para enviar datos del pc al pic, se que depronto se necesite usar otro pin para indicar cuando inicia el envio se podria usar otro.

Estaba pensado como crear un vector donde se guarde el numero que va llegando, lo que no se es como ir moviendo las pociones del vector para ir almacenando cada dato. tengoque enviar numeros que en deciamal seria de 0 a 1000 eso los convierto primero a binario para poder enviarlos.
21/05/2008 #4

Avatar de Ardogan

Bueno, un número decimal de 0 a 1000 necesitás log2 1000 = 9,xxxx -> 10 bits para representarlo.
En el pic vas a necesitar un par de registros de 8 bits para guardar ese valor (si queremos amarretear podrías usar dos bits de otro lado).
Entonces habría que hacer dos lecturas de 8 bits con el usart.
Pero antes de seguir con eso, cómo te envía ese dato la tarjeta?, son los 10 bits uno atrás de otro... para decirlo mejor, que protocolo usa la tarjeta para enviar los datos?.
La forma en que manejes el vector dentro del pic va a depender de eso.
21/05/2008 #5


Gracias por la respuesta rapida.

En realidad el protocolo se puede hacer, es decir yo puedo programar el tiempo en que va un pulso detras del otro.

yo estaba intentando hacer algo como esto

TRISD = %11111111

Dim almacen(50) As Byte
Dim a As Byte
Dim b As Byte

almacen = 0
a = 0
b = 0
loop:
If PORTD.0 = 1 Then

If PORTD.1 = 1 Then
almacen.b = PORTD.1
a = 1
b = b + a
Else
almacen.b = PORTD.1
a = 1
b = b + a
Endif
Endif
Goto loop

pero no es posible mover las posiciones del vector "almacen" con la variable "b"
21/05/2008 #6

Avatar de Ardogan

Ah bien, bárbaro entonces.
Lo que estás planteando es hacer la recepción por soft en el pic. No he usado basic para el pic, pero me resulta confusa ésta sentencia:

almacen.b = PORTD.1
Es decir, con almacen.b estarías haciendo referencia a un byte no?, y PORTD.1 es un bit. No hay conflicto con eso.
Pero hay otra cosa más importante, y es tenés que leer la entrada por la que vienen los datos cada cierto tiempo (ahi estás leyendo a máxima velocidad), para respetar la tasa de transferencia con que te transmite la tarjeta.
Si transmite a 56 kbit/s pensá que viene un bit cada 1/56K = 17.85 us, tendrías que meter un retardo de ese tiempo entre lectura y lectura.

Por otro lado, si vos podes fijar el protocolo que usa la tarjeta y tenés un módulo usart o uart en el pic (cual pic usas?), te diría que lo uses.
¿Por qué?, porque podés hacer la recepción más sencilla, con menos código, te olvidás de los retardos, y el pic se puede dedicar a hacer otra cosa mientras se recibe la información.

Tendrías que hacer que la tarjeta de transmitiera en conjuntos de 10 bits (marca de inicio + 8 bits de datos + marca stop, puede haber un bit de paridad opcional), el pic puede generar y atender una interrupción cuando se recibe un paquete de 10 bits que tendrá 8 bits de información, y podrías usar dos variables: DatoLSB (byte menos significativo) y Dato MSB (byte más significativo, en los que en realidad se usan solo dos bits).

Antes de seguir por este camino que te propongo, tendrías que leer ésto para que me termines de entender, lo que digo es con esa información en la cabeza.
Si es un pic de la familia 16 acá hay más.

Igualmente, si lo querés hacer por software sin usar el usart, acordate de los retardos primero; tendrías que hacer algo como (lo pongo en pseudocódigo porque basic no es lo mío):
Código:
Esperar transferencia:
  si PinInicioTransferencia = 1 entonces
    contadorBits = 0 //supongo contadorBits variable de 2 bytes, o 1 word
    EsperarRetardoMedioBit //para que el primer bit se muestree a la mitad y no en los flancos
  LeerBit:
    DatoRecibido.contadorBits= PinRX //PORTD.1 veo que usaste como PinRX
    contadorBits = contadorBits-1

    si contadorBits = 10 entonces
      irA FinRecepcion     
    EsperarRetardo1Bit
    irA LeerBit
  sino // viene acá si PinInicioTransferencia = 0
    IrA EsperarTransferencia

FinRecepcion:
    sigue el resto del programa
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.