Autor Tema: LCD con oscilador a 20MHz (no funciona)  (Leído 3513 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
LCD con oscilador a 20MHz (no funciona)
« en: 27 de Mayo de 2015, 18:05:04 »
Hola, llevo días intentando hacer funcionar el LCD con el oscilador del pic a 20MHz pero no consigo que me funcione y no soy capaz de ver el porque, en un principio creí que podría ser problema de temporización pero después de simular dichas temporizaciones he podido comprobar que son correctas. ¿Hay alguna diferencia de 4MHz o 20MHz aparte de los delays? de ser así ¿alguien podría decirme cual es la diferencia?
Código: ASM
  1. LIST      p=16F88              ; list directive to define processor
  2.      #INCLUDE <p16f88.inc>          ; processor specific variable definitions
  3.  
  4. ;------------------------------------------------------------------------------
  5. ;
  6. ; CONFIGURATION WORD SETUP
  7. ;
  8. ; The 'CONFIG' directive is used to embed the configuration word within the
  9. ; .asm file. The lables following the directive are located in the respective
  10. ; .inc file.  See the data sheet for additional information on configuration
  11. ; word settings.
  12. ;
  13. ;------------------------------------------------------------------------------
  14.  
  15.      __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _FOSC_HS
  16.      __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
  17.  
  18.      ERRORLEVEL -302
  19.      ERRORLEVEL -305
  20. ;------------------------------------------------------------------------------
  21. ;
  22. ; VARIABLE DEFINITIONS
  23. ;
  24. ; Available Data Memory divided into Bank 0 through Bank 3.  Each Bank contains
  25. ; Special Function Registers and General Purpose Registers at the locations
  26. ; below:
  27. ;
  28. ;           SFR           GPR               SHARED GPR's
  29. ; Bank 0    0x00-0x1F     0x20-0x6F         0x70-0x7F
  30. ; Bank 1    0x80-0x9F     0xA0-0xEF         0xF0-0xFF
  31. ; Bank 2    0x100-0x10F   0x110-0x16F       0x170-0x17F
  32. ; Bank 3    0x180-0x18F   0x190-0x1EF       0x1F0-0x1FF
  33. ;
  34. ;------------------------------------------------------------------------------
  35. ; ZONA DE DATOS
  36. ;------------------------------------------------------------------------------
  37.  
  38.     CBLOCK  0x20
  39.     LCD_ApuntaCaracter         
  40.         LCD_ValorCaracter              
  41.     LCD_Dato
  42.         LCD_GuardaDato
  43.         LCD_GuardaTRISB
  44.     Temp1_20ms
  45.     Temp2_20ms
  46.     Temp1_5ms
  47.     Temp2_5ms
  48.     Temp1_200micros
  49.     Temp2_200micros
  50.     Temp1_2ms
  51.     Temp2_2ms
  52.     Temp1_50micros
  53.     ENDC
  54.  
  55. LCD_CaracteresPorLinea      EQU     .16     ;Numero de caracteres por linea de la pantalla
  56.  
  57. #DEFINE  LCD_PinRW       PORTA,1
  58. #DEFINE  LCD_PinRS       PORTA,2
  59. #DEFINE  LCD_PinEnable   PORTA,3
  60. #DEFINE  LCD_BusDatos    PORTB
  61.  
  62. ;------------------------------------------------------------------------------
  63. ; RESET VECTOR
  64. ;------------------------------------------------------------------------------
  65.  
  66. RESET     ORG     0x0000            ;processor reset vector
  67.           PAGESEL START
  68.           GOTO    START             ;go to beginning of program
  69.  
  70. ;Tabla para Mensajes.........................
  71. Mensajes                        ;Etiqueta obligatoria
  72.         addwf       PCL,F
  73. Mensaje0                        ;Posicion inicial del mensaje
  74.         DT "PRUEBA LCD",0x00    ;Mensaje terminado en 0x00
  75. Mensaje1
  76.         DT "MIQUEL SERVERA",0x00
  77.  
  78. ;------------------------------------------------------------------------------
  79. ; MAIN PROGRAM
  80. ;------------------------------------------------------------------------------
  81.  
  82. START
  83. ;Configuramos los puertos del PIC
  84.         banksel     PORTA
  85.         clrf        PORTA
  86.         clrf        PORTB
  87.         banksel     ANSEL
  88.         movlw       b'00000000'
  89.         movwf       ANSEL
  90.         clrf        TRISA
  91.         clrf        TRISB
  92.  
  93. ;Configuramos el LCD
  94.         call        LCD_Inicializa
  95.  
  96. Principal
  97.         pageselw    Mensaje0
  98.         movlw       Mensaje0
  99.         call        LCD_Mensaje
  100.         call        LCD_Linea2
  101.         pageselw    Mensaje1
  102.         movlw       Mensaje1
  103.         call        LCD_Mensaje
  104.         sleep
  105.  
  106. ;********************************************************************************************
  107. ;Subrutina "LCD_Inicializa"
  108. ;********************************************************************************************
  109. LCD_Inicializa
  110.         ;bsf        STATUS,RP0          ;Banco 1
  111.         bcf         LCD_PinRS
  112.         bcf         LCD_PinEnable
  113.         bcf         LCD_PinRW
  114.         bcf         STATUS,RP0          ;Banco 0
  115.         bcf         LCD_PinRW           ;En caso de que este conectado le indica que
  116.                                         ;se va a escribir en el LCD
  117.         bcf         LCD_PinEnable       ;Impide funcionamiento del LCD poniendo E=0
  118.         bcf         LCD_PinRS           ;Activa el Modo Comando poniendo RS=0
  119.         call        Retardo_20ms
  120.         movlw       b'00110000'
  121.         call        LCD_EscribeLCD      ;Escribe el dato en el LCD
  122.         call        Retardo_5ms
  123.         movlw       b'00110000'
  124.         call        LCD_EscribeLCD
  125.         call        Retardo_200micros
  126.         movlw       b'00110000'
  127.         call        LCD_EscribeLCD
  128.         movlw       b'00100000'         ;Interface de 4 bits
  129.         call        LCD_EscribeLCD
  130.  
  131. ;Ahora configuramos el resto de parámetros
  132.         call        LCD_2Lineas4Bits5x7 ;LCD de 2 lineas y caracteres de 5x7 puntos
  133.         call        LCD_Borra           ;Pantalla encendida y limpia. Cursor al principio
  134.         call        LCD_CursorOFF       ;de la linea 1. Cursor apagado
  135.         call        LCD_CursorIncr      ;Cursor en modo incrementar
  136.         return
  137.  
  138. ;********************************************************************************************
  139. ;Subrutina "LCD_EscribeLCD"
  140. ;********************************************************************************************
  141. LCD_EscribeLCD
  142.         andlw       b'11110000'         ;Se queda con el nibble alto del dato que es el
  143.         movwf       LCD_Dato            ;que hay que enviar y lo guarda
  144.         movf        LCD_BusDatos,W      ;Lee la informacion actual de la parte baja
  145.         andlw       b'00001111'         ;del PORTB que no se debe alterar
  146.         iorwf       LCD_Dato,F          ;Enviara la parte alta del dato de entrada
  147.                                         ;y en la parte baja lo que habia antes
  148.         bsf         STATUS,RP0          ;Banco 1
  149.         movf        TRISB,W             ;Guarda la configuracion que tenia antes TRISB
  150.         movwf       LCD_GuardaTRISB
  151.         movlw       b'00001111'         ;Las 4 lineas inferiores del PORTB se dejan
  152.         andwf       PORTB,F             ;como estaban y las 4 superiores como salida
  153.         bcf         STATUS,RP0          ;Banco 0
  154.         movf        LCD_Dato,W          ;Recupera el dato a enviar
  155.         movwf       LCD_BusDatos        ;Envia el dato al módulo LCD
  156.         bsf         LCD_PinEnable       ;Permite funcionamiento del LCD mediante un pequeño
  157.         bcf         LCD_PinEnable       ;pulso y termina impidiendo el funcionamiento del LCD
  158.         bsf         STATUS,RP0          ;Banco 1
  159.         movf        LCD_GuardaTRISB,W   ;Restaura el antiguo valor en la configuracion del PORTB
  160.         movwf       PORTB               ;Realmente es TRISB
  161.         bcf         STATUS,RP0          ;Banco 0
  162.         return
  163.  
  164. ;********************************************************************************************
  165. ;Subrutinas variadas para el control del modulo LCD
  166. ;********************************************************************************************
  167. LCD_CursorIncr                          ;Cursor en modo incrementar.
  168.         movlw       b'00000110'
  169.         goto        LCD_EnviaComando
  170. LCD_Linea1                              ;Cursor al principio de la Línea 1.
  171.         movlw       b'10000000'         ;Dirección 00h de la DDRAM
  172.         goto        LCD_EnviaComando
  173. LCD_Linea2                              ;Cursor al principio de la Línea 2.
  174.         movlw       b'11000000'         ;Dirección 40h de la DDRAM
  175.         goto        LCD_EnviaComando
  176. LCD_PosicionLinea1                      ;Cursor a posición de la Línea 1, a partir de la
  177.         iorlw       b'10000000'         ;dirección 00h de la DDRAM más el valor del
  178.         goto        LCD_EnviaComando    ;registro W.
  179. LCD_PosicionLinea2                      ;Cursor a posición de la Línea 2, a partir de la
  180.         iorlw       b'11000000'         ;dirección 40h de la DDRAM más el valor del
  181.         goto        LCD_EnviaComando    ;registro W.
  182. LCD_OFF                                 ;Pantalla apagada.
  183.         movlw       b'00001000'
  184.         goto        LCD_EnviaComando
  185. LCD_CursorON                            ;Pantalla encendida y cursor encendido.
  186.         movlw       b'00001110'
  187.         goto        LCD_EnviaComando
  188. LCD_CursorOFF                           ;Pantalla encendida y cursor apagado.
  189.         movlw       b'00001100'
  190.         goto        LCD_EnviaComando
  191. LCD_Borra                               ;Borra toda la pantalla, memoria DDRAM y pone el
  192.         movlw       b'00000001'         ;cursor a principio de la línea 1.
  193.         goto        LCD_EnviaComando
  194. LCD_2Lineas4Bits5x7                     ;Define la pantalla de 2 líneas, con caracteres
  195.         movlw       b'00101000'         ;de 5x7 puntos y conexión al PIC mediante bus de
  196.        ;goto        LCD_EnviaComando    ;4 bits.
  197.  
  198. ;********************************************************************************************
  199. ;Subrutina "LCD_Mensaje"
  200. ;********************************************************************************************
  201. LCD_Mensaje
  202.         movwf       LCD_ApuntaCaracter
  203.         movlw       Mensajes
  204.         subwf       LCD_ApuntaCaracter,F
  205.         decf        LCD_ApuntaCaracter,F
  206.  
  207. LCD_VisualizaOtroCaracter
  208.         movf        LCD_ApuntaCaracter,W
  209.         call        Mensajes
  210.         movwf       LCD_ValorCaracter
  211.         movf        LCD_ValorCaracter,F
  212.         btfsc       STATUS,Z
  213.         goto        LCD_FinMensaje
  214.  
  215. LCD_NoUltimoCaracter
  216.         call        LCD_Caracter
  217.         incf        LCD_ApuntaCaracter,F
  218. ;-------------------------------------------------------------------------------------
  219.         btfss       STATUS,C    ;Si hay acarreo al incrementar LCD_ApuntaCaracter es por
  220.         incf        PCLATH      ;haber cambiado de pagina por lo que hay que sumar 1 al PCLATH
  221. ;-------------------------------------------------------------------------------------
  222.         goto        LCD_VisualizaOtroCaracter
  223.  
  224. LCD_FinMensaje
  225.         return
  226.  
  227. ;********************************************************************************************
  228. ;Subrutinas "LCD_EnviaComando" y "LCD_Caracter"
  229. ;********************************************************************************************
  230. LCD_EnviaComando
  231.         bcf         LCD_PinRS           ;Activa el "Modo Comando", poniendo RS=0
  232.         goto        LCD_Envia
  233. LCD_Caracter
  234.         bsf         LCD_PinRS           ;Activa el "Modo Dato", poniendo RS=1
  235.         call        LCD_CodigoCGROM     ;Obtiene el codigo para su correcta visualizacion
  236. LCD_Envia
  237.         movwf       LCD_GuardaDato      ;Guarda el dato a enviar
  238.         call        LCD_EscribeLCD      ;Primero envia el nibble alto
  239.         swapf       LCD_GuardaDato,W    ;Ahora envia el nibble bajo, para ello pasa el
  240.                                         ;nibble bajo del dato a enviar a parte alta del byte
  241.         call        LCD_EscribeLCD      ;Se envia al visualizador LCD
  242.         btfss       LCD_PinRS           ;Debe garantizar una correcta escritura manteniendo
  243.         call        Retardo_2ms         ;2ms en modo comando y 50us en modo caracter
  244.         call        Retardo_50micros
  245.         return
  246.  
  247. ;********************************************************************************************
  248. ;Subrutina "LCD_CodigoCGROM"
  249. ;********************************************************************************************
  250. LCD_CodigoCGROM
  251.         movwf       LCD_Dato            ;Guarda el valor del caracter
  252.         goto        LCD_FinCGROM
  253. LCD_FinCGROM
  254.         movf        LCD_Dato,W          ;En (W) el codigo buscado
  255.         return
  256.  
  257. ;********************************************************************************************
  258. ;Subrutinas de retardos para uso del LCD
  259. ;********************************************************************************************
  260. Retardo_20ms:
  261.         movlw       .110
  262.         movwf       Temp1_20ms
  263.         movlw       .181
  264.         movwf       Temp2_20ms
  265.         nop
  266.         nop
  267.         decfsz      Temp2_20ms,F
  268.         goto        $-3
  269.         decfsz      Temp1_20ms,F
  270.         goto        $-7
  271.         goto        $+1
  272.         goto        $+1
  273.         nop
  274.         return
  275. ;------------------------------------------------------------
  276. Retardo_5ms:
  277.         movlw       .44
  278.         movwf       Temp1_5ms
  279.         movlw       .141
  280.         movwf       Temp2_5ms
  281.         nop
  282.         decfsz      Temp2_5ms,F
  283.         goto        $-2
  284.         decfsz      Temp1_5ms,F
  285.         goto        $-6
  286.         goto        $+1
  287.         nop
  288.         return
  289. ;------------------------------------------------------------
  290. Retardo_200micros:
  291.         movlw       .248
  292.         movwf       Temp1_200micros
  293.         nop
  294.         decfsz      Temp1_200micros,F
  295.         goto        $-2
  296.         goto        $+1
  297.         nop
  298.         return
  299. ;------------------------------------------------------------
  300. Retardo_2ms:
  301.         movlw       .8
  302.         movwf       Temp1_2ms
  303.         movlw       .249
  304.         movwf       Temp2_2ms
  305.         nop
  306.         nop
  307.         decfsz      Temp2_2ms,F
  308.         goto        $-3
  309.         decfsz      Temp1_2ms,F
  310.         goto        $-7
  311.         goto        $+1
  312.         nop
  313.         return
  314. ;------------------------------------------------------------
  315. Retardo_50micros:
  316.         movlw       .61
  317.         movwf       Temp1_50micros
  318.         nop
  319.         decfsz      Temp1_50micros,F
  320.         goto        $-2
  321.         nop
  322.         return
  323.  
  324.         END

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #1 en: 27 de Mayo de 2015, 18:54:58 »
No vi todo el codigo. Como bien decis, si andaba a 4Mhz y luego a 20Mhz no y es el mismo programa, entonces es tema de tiempos.
Suele haber algunas limitaciones tambien en estos pulsos:

Código: ASM
  1. bsf         LCD_PinEnable       ;Permite funcionamiento del LCD mediante un pequeño
  2.         bcf         LCD_PinEnable       ;pulso y termina impidiendo el funcionamiento del LCD

que tal ves con 4Mhz cumplia el tiempo, pero ahora no por ser la ejecucion mucho mas rapida no lo hace. Asi que ojo con eso y no solo los delays. Tambien el tiempo que estan en el dato los puertos, etc.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #2 en: 28 de Mayo de 2015, 02:59:18 »
Ok, voy a comprobar todos estos tiempos seguro que el fallo esta en esto, eso se me había pasado por alto.

Muchas Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #3 en: 31 de Mayo de 2015, 12:24:49 »
Alguien seria tan amable de simular estas rutinas para 20MHz, es que no estoy seguro si hago la simulación en MPLABX correctamente o si me faltan 200ns en alguna de ellas.
Código: ASM
  1. ; Libreria con multiples subrutinas de retardos, desde 1 microsegundo hasta 20 segundos.
  2. ; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
  3. ; de cuarzo a 20 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
  4. ; ciclo máquina tarda 4 x 1/20MHz = 200 ns => 0,2 us.
  5. ; En los comentarios, "cm" significa "ciclos máquina".
  6.  
  7. ; ZONA DE DATOS *********************************************************************
  8.  
  9.         CBLOCK  0x20
  10.  
  11.         R_ContA                         ;Contadores para los retardos.
  12.  
  13.         ;R_ContB
  14.  
  15.         ;R_ContC
  16.  
  17.         ENDC
  18.  
  19. ; RETARDOS de 1 hasta 4 microsegundos ---------------------------------------------------
  20.  
  21. ; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 20 MHZ,
  22. ; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
  23. ; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
  24.  
  25. Retardo_1micro:         ;La llamada "call" aporta 2 ciclos máquina. (400ns)
  26.         ;nop             ;Aporta 1 ciclo máquina. (200ns)
  27.         return          ;El salto del retorno aporta 2 ciclos máquina. (400ns)
  28.  
  29. Retardo_2micros:                ;La llamada "call" aporta 2 ciclos máquina. (400ns)
  30.         ;nop             ;Aporta 1 ciclo máquina. (200ns)
  31.         goto $+1        ;Aporta 2 ciclos máquina. (400ns)
  32.         goto $+1        ;Aporta 2 ciclos máquina. (400ns)
  33.         nop             ;Aporta 1 ciclos máquina. (200ns)
  34.         return          ;El salto del retorno aporta 2 ciclos máquina. (400ns)
  35.  
  36. Retardo_4micros:        ;La llamada "call" aporta 2 ciclos máquina. (400ns)
  37.         nop             ;Aporta 2 ciclos máquina. (400ns)
  38.         goto $+1                ;Aporta 2 ciclos máquina. (400ns)
  39.         goto $+1                ;Aporta 2 ciclos máquina. (400ns)
  40.         goto $+1        ;Aporta 2 ciclos máquina. (400ns)
  41.         goto $+1                ;Aporta 2 ciclos máquina. (400ns)
  42.         goto $+1                ;Aporta 2 ciclos máquina. (400ns)
  43.         goto $+1                ;Aporta 2 ciclos máquina. (400ns)
  44.         goto $+1                ;Aporta 2 ciclos máquina. (400ns)
  45.         return          ;El salto del retorno aporta 2 ciclos máquina. (400ns)
  46.  
  47. ; RETARDOS de 5 hasta 500 microsegundos ------------------------------------------------
  48. Retardo_20micros:               ;La llamada "call" aporta 2 ciclos máquina. (400ns)
  49.         movlw   d'30'           ;Aporta 1 ciclo máquina. Este es el valor de "K".
  50.         ;nop                     ;Aporta 1 ciclo máquina.
  51.         nop                     ;Aporta 1 ciclo máquina.
  52.         goto    RetardoMicros   ;Aporta 2 ciclos máquina.
  53.  
  54. Retardo_10micros:               ;La llamada "call" aporta 2 ciclos máquina. (400ns)
  55.         movlw   d'13'           ;Aporta 1 ciclo máquina. Este es el valor de "K".
  56.         nop                     ;Aporta 1 ciclo máquina.
  57.         nop                     ;Aporta 1 ciclo máquina.
  58.         goto    RetardoMicros   ;Aporta 2 ciclos máquina.
  59.  
  60. Retardo_5micros:                ;La llamada "call" aporta 2 ciclos máquina. (400ns)
  61.         movlw   d'6'            ;Aporta 1 ciclo máquina. Este es el valor de "K".
  62.  
  63. ;Rutina RetardoMicros ------------------------------------------------------------------
  64. RetardoMicros:
  65.         movwf   R_ContA         ;Aporta 1 ciclo máquina.
  66.         nop
  67. Rmicros_Bucle:
  68.         decfsz  R_ContA,F               ;(K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
  69.         goto    Rmicros_Bucle   ;Aporta (K-1)x2 ciclos máquina.
  70.         return                  ;El salto del retorno aporta 2 ciclos máquina
Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #4 en: 31 de Mayo de 2015, 17:52:30 »
Codigo:

Código: ASM
  1. CALL Retardo_1micro
  2.     CALL Retardo_2micros
  3.     CALL Retardo_4micros
  4.     CALL Retardo_20micros
  5.     CALL Retardo_10micros
  6.     CALL Retardo_5micros


Estos son los valores que me dan:

Target halted. Stopwatch cycle count = 4 (800 ns)
Target halted. Stopwatch cycle count = 9 (1,8 µs)
Target halted. Stopwatch cycle count = 19 (3,8 µs)
Target halted. Stopwatch cycle count = 99 (19,8 µs)
Target halted. Stopwatch cycle count = 49 (9,8 µs)
Target halted. Stopwatch cycle count = 24 (4,8 µs)

o te falta un nop, o reemplazas el nop por un goto $+1

El ultimo retardo lo probe con los valores 0x10 y 0x20 hexa y me dio como valor:

Target halted. Stopwatch cycle count = 53 (10,6 µs) . No deberia ser 16?
Target halted. Stopwatch cycle count = 101 (20,2 µs) No deberia ser 32?
Creo que es lo que estas intentando probar con ese retardo..
« Última modificación: 31 de Mayo de 2015, 18:18:07 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #5 en: 31 de Mayo de 2015, 18:21:20 »
Gracias KILLERJC por molestarte en probar las rutinas, esta es la duda que tenia, no estaba seguro de los valores cargados, por eso tengo algún que otro nop comentado ya que según como lo simulaba me faltaba un nop o me sobraba.
Ahora estoy seguro que entre breakpoint y breakpoint al tiempo que llevamos hay que sumarle la rutina.

Muchas Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #6 en: 02 de Junio de 2015, 18:40:39 »
Alguien puede decirme si la manera de calcular los tiempos de esta rutina es correcta y de no ser así como seria.
Código: ASM
  1. RetardoMicros
  2. movwf              R_Conta
  3.  
  4. RMicros_Bucle
  5. decfsz              R_Conta,F
  6. goto                 RMicros_Bucle
  7. goto                 $+1
  8. return
  9.  
  10. 1+(K-1)+2+(K-1)x2+2+2 = (4+3K)
Gracias.

PD: Animo a todos los que pueda haber que hagan copiar y pegar "yo era uno de ellos" a que lo intenten por ellos mismos. Ahora es cuando estoy aprendiendo.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #7 en: 02 de Junio de 2015, 18:54:27 »
Entrada hasta el loop (RMicros_Bucle): 3 ciclos ( CALL + MOVWF )

Salida (ultimo valor del bucle, lo que tarda en salir): 6 ciclos (DEFSZ salto + goto $+1 + RETURN)

Mediante el proceso ( es decir mientras no es el ultimo, o sea el loop ): (W-1)*3 (DECFSZ sin salto + GOTO RMicros_Bucle), el -1 es debido a que el ultimo valor cuenta como "salida"

Total: 3 + 6 + (W-1)*3 = 9 +3W -3 = 3W + 6

W es el valor de W cuando entra.

3W + 6 para 0<W<256
774      para W=0

Pruebas realizadas (Comenzando con W=1 e incrementando en 1):

Citar
Target halted. Stopwatch cycle count = 9 (1,8 µs)
Target halted. Stopwatch cycle count = 12 (2,4 µs)
Target halted. Stopwatch cycle count = 15 (3 µs)
Target halted. Stopwatch cycle count = 18 (3,6 µs)
Target halted. Stopwatch cycle count = 21 (4,2 µs)
Target halted. Stopwatch cycle count = 24 (4,8 µs)
Target halted. Stopwatch cycle count = 27 (5,4 µs)
Target halted. Stopwatch cycle count = 30 (6 µs)
Target halted. Stopwatch cycle count = 33 (6,6 µs)
Target halted. Stopwatch cycle count = 36 (7,2 µs)
Target halted. Stopwatch cycle count = 39 (7,8 µs)
Target halted. Stopwatch cycle count = 42 (8,4 µs)
Target halted. Stopwatch cycle count = 45 (9 µs)
Target halted. Stopwatch cycle count = 48 (9,6 µs)

Probando con el valor de W=200 para  comprobar

Citar
Target halted. Stopwatch cycle count = 606 (121,2 µs)

No te fijes en los tiempos

Posible mejora (o tal ves no) para que sea multiplo de 5:

Código: ASM
  1. RetardoMicros
  2.     movwf              R_Conta
  3.     nop
  4.  
  5. RMicros_Bucle
  6.     decfsz              R_Conta,F
  7.     goto                 $+2
  8.     goto                 $+2
  9.     goto                RMicros_Bucle
  10.     return

Entrada: 4 ciclos (nop,movwf,call)
Salida : 6 ciclos (decfsz + goto + return)
Vuelta : (W-1)*5   (decfsz + 2 x goto)

Total:
5W + 5   para 0<W<256
1285       para W=0

Minimo: 10 ciclos (W=1)
Maximo: 1280 ciclos (Tome W=255 como maximo, aunque si entras con W=0 serian 256 pasos y por lo tanto 1285 ciclos)


EDIT:
Arregle el codigo para que quede el RETURN al ultimo, me parecio mas prolijo

Y tambien modifico el codigo para que quede valido de 0 a 255 la formula

Código: ASM
  1. RetardoMicros
  2.     movwf       R_Conta
  3.     incf        R_Conta,F      
  4.  
  5. RMicros_Bucle
  6.     decfsz      R_Conta,F
  7.     goto        $+2
  8.     goto        $+2
  9.     goto        RMicros_Bucle
  10.     return



Entrada: 4 ciclos (incf,movwf,call)
Salida : 6 ciclos (decfsz + goto + return)
Vuelta : (W-1+1)*5   (decfsz + 2 x goto)

Total: 5W + 10 ciclos para todo W
Minimo : 10 ciclos (W=0)
Maximo: 1280 ciclos (W=255)
« Última modificación: 02 de Junio de 2015, 20:51:00 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #8 en: 02 de Junio de 2015, 19:07:39 »
Gracias KILLERJC, mañana porque para mi son las 00:05 de la noche y mañana trabajo le doy una mirada a lo que has posteado haber si lo entiendo.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #9 en: 07 de Junio de 2015, 07:13:36 »
Todavía no pero lo conseguire  :5]

Saludos y buen Domingo.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #10 en: 23 de Agosto de 2015, 12:40:47 »
Todavía no, sigo con ello, pero lo conseguiré  :mrgreen:

Lo que ocurre cuando el PIC me escucha hablar solo.
 :D :D :D :D :D :D :D :D :D
« Última modificación: 23 de Agosto de 2015, 12:43:23 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #11 en: 23 de Agosto de 2015, 18:52:06 »
Dale, no te preocupes xD, algun dia vas a tener un tiempo :P

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #12 en: 23 de Agosto de 2015, 19:28:56 »
Dale, no te preocupes xD, algun dia vas a tener un tiempo :P
No si tiempo tengo KILLERJC, lo que no consigo son las temporizaciones correctas para el uso del Lcd.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: LCD con oscilador a 20MHz (no funciona)
« Respuesta #13 en: 23 de Agosto de 2015, 20:03:04 »
Y por que no usas una pagina online que te genere unas demoras fijas para tu cristal

http://www.piclist.com/techref/piclist/codegen/delay.htm

Y no te complicas generando un codigo para que de tu tiempo :P
PD: Sino pasate el programa como lo tenes y vemos. Y no te olvides decirme el driver del LCD cual es asi busco los diagramas de tiempo.

Mirando un poco mas y asumiendo que es un HD44780 las unicas 2 limitantes son el pulso de E, que uno es de 220ns minimo y el ciclo es de 500ns antes del proximo pulso ascendente.
Si reemplazas cada uno de las demoras para ese cristal y ademas en

LCD_EscribeLCD le agregas 2 nop imagino que deberia funcionar.

Código: ASM
  1. bsf         LCD_PinEnable       ; Activa : 0ns
  2.         nop                             ;200ns
  3.         bcf         LCD_PinEnable       ; aproximadamente 300/400ns pulso alto (no se exactamente el tiempo por que eso depende exclusivamente del pipeline) y se pone a 0 la salida
  4.         nop                             ; 200ns y la proxima instruccion no tiene nada que ver asi que se cumple el otro tiempo

« Última modificación: 24 de Agosto de 2015, 00:20:34 por KILLERJC »