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

Temas similares

14/06/2014 #1

Avatar de papirrin

Registro TRIS (TRISIO) tiempo de transicion
estoy utilizando un pic 12f675 en el cual necesito cambiar el puerto de entrada a salida y viceversa, pero he notado que no hace el cambio si no se deja un tiempo antes de la siguiente instrucción, algo asi como con la escritura en la memoria EEPROM, ¿alguien sabe cual es el tiempo minimo de transición de estado?
14/06/2014 #2
Moderador

Avatar de D@rkbytes

Cuando realizas un cambio de estado en un pin de entrada a salida este debe estar listo después de ejecutar la instrucción.
Pero si quieres estar seguro que el pin ya esta listo para trabajar como entrada o salida, puedes ejecutar un NOP después de hacer el cambio.
Después de ejecutarse el NOP el pin ya debe estar listo para funcionar como I/O dependiendo el caso.
La mayoría de las instrucciones son de uno a dos ciclos de reloj, con uno más que des ya puedes estar seguro.
Ahora que si requieres de más seguridad ante el cambio del TRISIO, usa un retardo de 10us.

Saludos.
14/06/2014 #3

Avatar de papirrin

Cuando realizas un cambio de estado en un pin de entrada a salida este debe estar listo después de ejecutar la instrucción.
al parecer el registro si queda listo, o sea que si lo leo en la siguiente instruccion si reconoce que hace el cambio, pero en la electronica o hardware no...

puse pausas de hasta 10 milisegundos y ahi si funciona, y cabe aclarar que en proteus no esta considerado eso, o sea que en la simulacion si es simultanea.

la cuestion es que quisiera saber si existe alguna nota de aplicacion de microchip que confirme esa observacion.
14/06/2014 #4
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
Al parecer el registro si queda listo, o sea que si lo leo en la siguiente instrucción si reconoce que hace el cambio, pero en la electrónica o hardware no...

puse pausas de hasta 10 milisegundos y ahi si funciona, y cabe aclarar que en proteus no esta considerado eso, o sea que en la simulación si es simultanea.
Si usas el oscilador interno, debes verificar que tenga correcto el valor de OSCCAL.
El problema puede deberse a los ciclos de instrucción que no están siendo ejecutados dentro del rango óptimo.
papirrin dijo: Ver Mensaje
La cuestión es que quisiera saber si existe alguna nota de aplicación de microchip que confirme esa observacion.
Tal vez exista alguna, yo no la he visto aunque la he buscado, pero tengo asesoría directa para preguntar.
Primero verifica lo que te menciono sobre el valor de OSCCAL.
Usando FOSC = XT/HS todo debería ser como te mencioné.
15/06/2014 #5

Avatar de Daniel Meza

papirrin dijo: Ver Mensaje
al parecer el registro si queda listo, o sea que si lo leo en la siguiente instruccion si reconoce que hace el cambio, pero en la electronica o hardware no...

puse pausas de hasta 10 milisegundos y ahi si funciona, y cabe aclarar que en proteus no esta considerado eso, o sea que en la simulacion si es simultanea.

la cuestion es que quisiera saber si existe alguna nota de aplicacion de microchip que confirme esa observacion.

¿Cómo determinas que aún no está configurado en hardware?, ¿que frecuencia usas para el PIC? y algo importante ¿que carga le estas poniendo al puerto?
15/06/2014 #6

Avatar de papirrin

¿que frecuencia usas para el PIC?
la frecuencia es de 4MHz con oscilador interno, el osccal esta correcto el de fabrica.


pongo un video espero contestar las preguntas restantes:
15/06/2014 #7
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
La frecuencia es de 4MHz con oscilador interno, el osccal está correcto, el de fábrica.
Es muy extraño, acabo de realizar una prueba con un programa sencillo para comprobar el cambio de estado con TRIS pero usando la instrucción Input, así como lo estás haciendo.

El cambio es inmediato cuando se ejecuta la interrupción externa.
Código:
;*******************************************************************************
; Palabra de configuración:
#Config
    __CONFIG _FOSC_INTRCIO & _WDT_OFF & _PWRTE_ON & _BOREN_OFF
#EndConfig
;*******************************************************************************
Rem FOSC = 4MHz.


Inicio:
    ANSEL = 0               ; Conversores ADC = OFF
    CMCON = 7               ; Comparadores analógicos = OFF
    OPTION_REG.6 = 0        ; Interrupción por flanco de bajada
    INTCON = %11010000      ; Interrupción externa por GP2
    High GPIO.0             ; Encender LED en GP0
    
    On Interrupt GoTo INTE_ISR
    
    
Programa:
; Bucle infinito solo para esperar interrupción.
    GoTo Programa
    
; Controlador de la interrupción externa por GP2
INTE_ISR:
    Disable    ; Desactivar interrupciones
    INTCON.1 = 0            ; Limpiar bandera INTF
    Input GPIO.0            ; GPO como entrada (Apaga LED)
    Resume    ; Retomar el programa principal
    Enable  ; Activar interrupciones
    

    End
Está escrito en MCS v5 con PBP3

¿Ya probaste usando TRISIO.X = X?
17/06/2014 #8
Moderador

Avatar de Chico3001

Microchip si da esos datos en sus manuales de referencia.. pero el tiempo que el chip tarda en trancisionar de entrada a salida es despreciable (en el orden de nS) por lo que para la gran mayoria de las aplicaciones se puede considerar que el PIN ya esta listo para trabajar en la siguiente instruccion

Si mal no recuerdo el problema que habia era cuando uno cambia de salida a entrada y lee el valor del puerto, ya que no esta leyendo directamente el puerto sino un registro intermedio, pero ya tiene rato que no uso los PICs asi que mejor alguien confirme este ultimo dato...
17/06/2014 #9

Avatar de Daniel Meza

Chico3001 dijo: Ver Mensaje
Microchip si da esos datos en sus manuales de referencia.. pero el tiempo que el chip tarda en trancisionar de entrada a salida es despreciable (en el orden de nS) por lo que para la gran mayoria de las aplicaciones se puede considerar que el PIN ya esta listo para trabajar en la siguiente instruccion

Si mal no recuerdo el problema que habia era cuando uno cambia de salida a entrada y lee el valor del puerto, ya que no esta leyendo directamente el puerto sino un registro intermedio, pero ya tiene rato que no uso los PICs asi que mejor alguien confirme este ultimo dato...
Esto último es cierto, pero sólo en la serie 18F y superior, de hecho se tiene un registro específico para leer datos (PORTX) y otro para enviar datos (LATX)

port.png

En la serie 16 no se tiene el registro LATX, y el tiempo que tarde en cambiar de dirección es despreciable a comparación de la frecuencia con la que trabaja esa serie de micros
17/06/2014 #10

Avatar de papirrin

¿Ya probaste usando TRISIO.X = X?
ya, probe con trisio y es lo mismo, pero hice la prueba que pusiste y si el cambio es inmediato. estoy depurando todo el codigo a ver si doy con el error.


En la serie 16 no se tiene el registro LATX, y el tiempo que tarde en cambiar de dirección es despreciable a comparación de la frecuencia con la que trabaja esa serie de micros
ok. voy a dar por echo que es inmediato el cambio, porque en realidad no tiene razon de tardar tanto.

en cuanto tenga algo posteo.... saludos.
17/06/2014 #11

Avatar de Daniel Meza

Sólo por curiosidad ¿que aplicación traes entre manos que demanda tiempos tan cortos de conmutación E/S? ¿DSP?
17/06/2014 #12

Avatar de papirrin

¿que aplicación traes entre manos que demanda tiempos tan cortos de conmutación E/S?
no son los tiempos, lo que traigo escasa es la memoria de programa, uso varios cambios y si cada cambio es una pause me come memoria, de echo no me habia molestado hasta que quedo en ceros la memoria XD.
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.