Autor Tema: Problemas con envio de datos de Puerto del PIC 16F628A  (Leído 6774 veces)

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

Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Problemas con envio de datos de Puerto del PIC 16F628A
« en: 16 de Abril de 2008, 18:23:02 »
Hola, les cuento que estoy simulando en el MPLAB, y entre algunas cosas, tengo la siguiente subrutina:

enviacodigo
                movf CENT,w
   movwf PORTB
;   call PDelay
   movf DEC,w
   movwf PORTB
;   call PDelay
   movf UNI,w
   movwf PORTB
;   call PDelay
                return

Lo que hace simplemente es ir enviando secuencialmente valores de registros por el puertoB, en su representacion binaria, con retardos de por medio.

pero lo que en realidad necesito es enviar los 4 primeros bits de cada registro (CENT,DEC y UNI), a los bits 3 al 6 del puerto B, esto porque los bits 1 y 2 del puerto B los voy a utilizar como Tx y Rx.
Creo que se podria hacer de forma secuencial (mover el bit 0 de CENT al bit 3 del puertoB...despues el bit 1 de CENT al bit 4 del PuertoB....y asi.....), pero como quiero generar un codigo binario que despues va a un codificador DTMF, no se si este desfase en la secuencia produzca algun error en la codificacion.
Lo otro que pensaba es hacer el puerto A como salida:

movf CENT,w
movwf PORTA
....

asi el codigo saldria todo a la vez...
pero por alguna razon no me resulta...modifique el TRISA poniendolos todos a 0, pero sin resultados.

Si alguien tiene alguna solucion, o algun comentario respecto a mis suposiciones, se los agradeceria.

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #1 en: 16 de Abril de 2008, 19:27:59 »
hola fzurita, has leido el datasheet del 16f628a, ya que hay pequeñas variaciones entre uno y otro pic y ma cuando los pines del mismo realizan varias funciones, para manejar el PORTA del pic como E/S digital antes debes cargar el numero 7 al registro CMCON, ya que este pic en el PORTA tambien tiene comparadores y cuando se porduce un reset en el pic este puerto por defecto(default) se configura como entradas analogas. Ahora el pin RA4 si lo usas como salida debes ponerle una resistencia pullup ya que este pin es del tipo opendrain(drenador abierto, que es el analogo del colector abierto). Esto lo puedes ver con mas detalles en la pagina 31 de datasheet del mismo. Ahora con respecto a mover al PORTB a partir del bit 3 del mismo los 4 primeros bits de tus registros(asumo que te referiras a los bits menos significativos (0,1,2,3)), puedes usar la rotacion a la izquierda algo asi:

Código: ASM
  1. enviar_codigo
  2.         movf    CENT,W
  3.         call    rotar_izquierda_4posiciones
  4.         movwf   PORTB
  5.         call    PDelay
  6.         movf    DEC,W
  7.         call    rotar_izquierda_4posiciones
  8.         movwf   PORTB
  9.         call    PDelay
  10.         movf    UNI,W
  11.         call    rotar_izquierda_4posiciones
  12.         movwf   PORTB
  13.         call    PDelay
  14.         return
  15.  
  16. rotar_izquierda_4posiciones
  17.         movwf   aux                     ;roto 4 posiciones para colocar el
  18.         rlf     aux,f                   ;bit0 de los registros CENT, DEC, UNI
  19.         rlf     aux,f                   ;en el bit 4 del PORTB
  20.         rlf     aux,f
  21.         rlf     aux,w
  22.         andlw   b'11110000'
  23.         return

Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #2 en: 17 de Abril de 2008, 12:44:18 »
Poseidon, te pasaste!!!! Muchas gracias, no sabes cuanto te agradezco ayer en la oficina estuve horas tratando de encontrar la solucion, es mi primera incursion en los PICs pero de a poco vamos aprendiendo. :)

Lo que hice fue enviar los registros por el Puerto B, pero desde el bit 3 al bit 6, por lo que elimine una linea rlf, y el operando  de la instruccion andlw cambia a 11111000.

Eso si, de igual forma debo modificar el CMCON y TRISA para usar el PORTA como entrada ¿?
Y el PORTB necesita alguna configuracion previa? A pesar que la simulacion en el MPLAB me funciona.

Nuevamente gracias...








Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #3 en: 17 de Abril de 2008, 13:30:55 »
Una cosa mas....si bien es cierto estoy ocupando los bits 3 al 6 del puerto B para el envio del codigo binario, os demas pines (RB0, RB1, RB2, y RB7), como los puedo utilizar en forma independiente?, puesto que la subrutina envia_codigo esta escribiendo sobre el PuertoB completo y por lo tanto sobreescribiendo estos bits, sobre cualquier modificacion que yo haga en ellos.
por ejemplo, necesito un bit que este permanentemente en 1 mientras se envie el codigo (el RB0, por ejemplo) , para habilitar la codificacion en el DTMF (a su entrada tone enable), y lo otro que necesito es usar los pines de la USART (RB1 y RB2).

Gracias de nuevo  8)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #4 en: 17 de Abril de 2008, 13:45:34 »
Yo propongo una solución alternativa a la que te da poseidon, con un par de lineas menos...

rotar_izquierda_3posiciones
movwf aux
swapf aux,f
rrf aux,w
andlw b'01111000'
return

y para no alterar los bits restantes, podrias hacer por ejemplo...

movlw b'10000111'
andwf PORTB,F
call rotar_izquierda_3posiciones
iorwf PORTB,F

Hay que destacar que durante un breve tiempo las salidas de los pines RB3-RB6 estaran en estado bajo. Si esto afecta la visualizacion, hay soluciones alternativas un poquito mas elaboradas para reducir este tiempo de apagado.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #5 en: 17 de Abril de 2008, 18:41:58 »
La alternativa de BrunoF esta mejor que la mia  :mrgreen:, y como el te recomienda, para no alterar el valor de los demas pines del puertob, antes de hacer cambios sobre el mismo, lees el puerto y lo guardas para posteriormente pegarlo con el resultado final.

Eso si, de igual forma debo modificar el CMCON y TRISA para usar el PORTA como entrada ¿?
Y el PORTB necesita alguna configuracion previa? A pesar que la simulacion en el MPLAB me funciona.
asi es, para que funcione como entrada o saldida digital. Eso esta en el datasheet del pic, asi que no estaria mal una repasadita del mismo, en la parte que habla sobre cada puerto del pic  :mrgreen:

Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #6 en: 18 de Abril de 2008, 15:44:53 »
La verdad me ha costado un poco mas entender la alternativa de BrunoF...el registro F que mencionas es un registro auxiliar? Que valores toma? Lo que pasa es que revisando los ejemplos del set de instrucciones en el datasheet, el formato es <instruccion> f, d , donde "d" toma valores 0 o 1.


Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #7 en: 21 de Abril de 2008, 16:05:02 »
Ademas en el codigo...

movlw b'10000111'
andwf PORTB,F
call rotar_izquierda_3posiciones
iorwf PORTB,F

no me queda claro cómo se carga el valor 10000111 en el registro w, si cuando se llama a  la subrutina, se debiera ingresar con el valor de los registros CENT, DEC y UNI.

Por favor si puedieran cometar e codigo para tener una mejor comprension. Gracias

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #8 en: 21 de Abril de 2008, 17:00:08 »
La verdad me ha costado un poco mas entender la alternativa de BrunoF...el registro F que mencionas es un registro auxiliar? Que valores toma? Lo que pasa es que revisando los ejemplos del set de instrucciones en el datasheet, el formato es <instruccion> f, d , donde "d" toma valores 0 o 1.



Precisamente "F" es un valor posible de "d". "d" es el destino. El destino puede adquirir dos valores posibles: 0 o 1. Si el destino es 0, entonces el resultado de la instrucción se guarda en W y el registro permanece inalterado. Si el destino es 1, el resultado de la instrucción se guarda en el regístro y W permanece inalterado. Poner "w", "W" o 0 es exáctamente lo mísmo. Poner "f", "F" o 1 es también lo mísmo. Entonces esa "F" significa que el resultado se guardará en el registro involucrado en la operación y W permanecerá con el ultimo valor cargado antes de la instrucción.

Ademas en el codigo...

movlw b'10000111'
andwf PORTB,F
call rotar_izquierda_3posiciones
iorwf PORTB,F

no me queda claro cómo se carga el valor 10000111 en el registro w, si cuando se llama a  la subrutina, se debiera ingresar con el valor de los registros CENT, DEC y UNI.

Por favor si puedieran cometar e codigo para tener una mejor comprension. Gracias

movlw b'10000111' ;W ahora vale: b'10000111'
andwf PORTB,F       ;Como el destino es F, luego de esta instrucción el PORTB valdrá b'X0000XXX'. Donde las X indican que dicho bit conservará el valor que tenía antes de la AND. Con esto se logra forzar bits a cero(Revisa la tabla de la verdad AND si tenés dudas...)

call rotar_izquierda_3posiciones es una subrutina que recibe el valor en W a rotar y lo devuelve cargado en W rotado.Acá cometí un error, ya que se me olvidó pasarle el valor a rotar...(sino rotaría el valor que tiene W en dicho momento que sería siempre b'10000111')

Entonces, lo correcto es, por ejemplo:

movf CENT,W             ;copiar en W el valor de CENT
call rotar_izquierda_3posiciones  ;rotar el valor

y finalmente:

iorwf PORTB,F     

La IOR es una instrucción lógica cuyo comportamiento es el inverso de la AND. La IOR tiene la capacidad de poner bits a 1, pero jamás a 0. Por el contrario, la AND tiene la capacidad de poner bits a 0, pero jamás a 1.

Recordemos que antes que se ejecute la IOR, habíamos forzado los bits <6:3> del PORTB a cero.
Entonces, antes de la IOR, PORTB valdrá b'X0000XXX'.
Cuando se retorna de la subrutina de rotación, W tiene un valor b'0xxxx000'. Si te fijas, verás que aquí las x aparecen precisamente en los bits en los cuales el PORTB no las tiene.

Entonces comparandolos bit a bit tendríamos:
W        = b'0xxxx000'
PORTB = b'X0000XXX'

Ahora, la IOR incluirá el valor de W en el del registro, que en este caso es el PORTB, quedando finalmente:

PORTB = b'XxxxxXXX' que es el resultado buscado.

¿Se entendió?

Saludos.


 
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #9 en: 21 de Abril de 2008, 18:49:09 »
Me queda mucho mas claro, gracias.

Mira, al final la subrutina me queda así:

envia_codigo
;----Numero1......

   bsf PORTB,0

   movlw b'10000111'
   andwf PORTB,F
   movf CENT,w
   call rotar_izquierda
   iorwf PORTB,F
   call PDelay

   movlw b'10000111'
   andwf PORTB,F
   movf DEC,w
   call rotar_izquierda
   iorwf PORTB,F
   call PDelay

   movlw b'10000111'
   andwf PORTB,F
   movf UNI,w
   call rotar_izquierda
   iorwf PORTB,F
   call PDelay

;----Numero2-------
   movlw b'10000111'
   andwf PORTB,F
   movf CAB,w
   call rotar_izquierda
   iorwf PORTB,F
   call PDelay

   bcf PORTB,0

   return

Estoy enviando 2 numeros...el primero de 3 cifras  y el segundo de 1..ademas, para probar que los demas bits no se sobreescriben, puse el RB0  a 1 antes de la ejecucion de la subrutina,  y al final lo seteo a 0.
La grafica me da bien, (envio el Numero1=123, y Numero2=1), lo que no se es si las transiciones a 0 de Rb3 y Rb4 (ver imagen), afectaran el proceso de codificacion.
Bueno, mas dudas ya tendre jejejeje...saludos

Desconectado fzurita

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #10 en: 24 de Abril de 2008, 17:33:30 »
Ok ya tengo solucionado el envio de los codigos, lo que ahora necesito es condicionar el proceso de envio, a ciertos cambios de entrada (PORTA). Especificamente, tendré (por el momento) 4 entradas (RA0:RA3).  La logica es:
(Si RA0 es 1, envia codigo) o,
(Si RA1 es 1, envia codigo) o,
((Si RA2 es 1 y RA3 es 1), envia codigo).

Como lo puedo implementar en asm? Un bucle para testear 1 bit podria ser:

espera_entrada
    btfss PORTA,0
    goto espera_entrada
    call envia_codigo
    ....
    ....
    ....

pero para las otras condiciones???


gracias ;)

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #11 en: 24 de Abril de 2008, 18:08:17 »
mira, lo puedes hacer de dos maneras, por polling o por interrupcion, en el primero esatrias chequeando constantemente cada entrada y ver que cumpla la condicion que deseas, en la segunda opcion podrias estar haciendo otra cosa con el pic y cuando se produsca un cambio en esos pines atiendes en ese momento es interrupcion y podrias poner señalizadores o flags para poder trabajar esa interrupcion en tu programa principal o si lo que va a realizar no requiere mucho tiempo lo podrias realizar en la misma interrupcion. Aca te coloco como podria hacerse de la primera opcion.

Código: ASM
  1. polling_de_entradas
  2.  
  3.         btfsc   PORTA,0                 ;pregunto si RA0=0?
  4.         goto    RA0_es_1                           ;no,entonces RA0=1
  5.         btfsc   PORTA,1                 ;si,pregunto si RA1=0
  6.         goto    RA1_es_1                           ;no,entonces RA1=1
  7.         btfss   PORTA,2                 ;si,pregunto si RA2=1?
  8.         goto    polling_de_entradas                ;no,vulvo a hacer el barrido
  9.         btfss   PORTA,3                 ;si,pregunto si RA3=1?
  10.         goto    polling_de_entradas                ;no,vuelvo a hacer el barrido
  11.  
  12.         .....                           ;aca coloco lo que tenga que hacer
  13.         .....                           ;cuando RA2=RA3=1
  14.         .....
  15.  
  16.         goto    polling_de_entradas                ;luego de terminado eso, vuelvo
  17.                                         ;a hacer el barrido
  18.  
  19. RA0_es_1
  20.  
  21.         .....                           ;aca coloco lo que tenga que hacer
  22.         .....                           ;cuando RA0=1
  23.         .....
  24.         goto    polling_de_entradas
  25.  
  26. RA1_es_1
  27.  
  28.         .....                           ;aca coloco lo que tenga que hacer
  29.         .....                           ;cuando RA1=1
  30.         .....
  31.         goto    polling_de_entradas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #12 en: 24 de Abril de 2008, 20:30:21 »
Esto es de pura maldad nomás poseidon...no te enojes :D :D :D

     btfsc   PORTA,0                           ;pregunto si RA0=0?
     goto   RA0_es_1                          ;no,entonces RA0=1
     btfsc   PORTA,1                           ;si,pregunto si RA1=0
     goto   RA1_es_1                          ;no,entonces RA1=1
     btfsc   PORTA,2                           ;si,pregunto si RA2=0?
     btfss   PORTA,3                           ;si,pregunto si RA3=1?
     goto   polling_de_entradas           ;no,vuelvo a hacer el barrido
     .....                                            ;aca coloco lo que tenga que hacer
     .....                                            ;cuando RA2=RA3=1

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #13 en: 24 de Abril de 2008, 20:51:01 »
GRRRRRRRRRRRR :5] :5] :5] :5] :5]:5] :5] :5] :5] :5]:5] :5] :5] :5] :5]:5] :5] :5] :5] :5]:5] :5] :5] :5] :5]:5] :5] :5] :5] :5]
Parece que siempre buscas acortar mis sentencias :mrgreen: :mrgreen:
si ps, maldad pura, pero no importa siempre hay diferentes maneras de atacar el problema, tambien pudimos hacerlo por tabla e interrupciones, pero eso ya es otro rollo :D, uno siempre aprende algo nuevo, hoy aprendi que me la tienes jurada :8}  :8} :8} :8}

 :-/ :-/ :-/ :-/ :-/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con envio de datos de Puerto del PIC 16F628A
« Respuesta #14 en: 24 de Abril de 2008, 20:56:19 »
Ja ja ja! Es que es así mi naturaleza molesta nomás...nada personal :D :D

Y se complicaría por interrupciones porque el PORTA carece de interrupciones.

:D :D :D

Que malvado! Mejor me callo. No quiero abusar de tu buena predisposición ;)

Saludos!

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.