Autor Tema: PIC16F1707 Ejemplos básicos  (Leído 18488 veces)

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

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #30 en: 09 de Noviembre de 2015, 22:09:23 »
Jugando un poco mas logramos un saludo para la comunidad.  :) 

Código: ASM
  1. #INCLUDE "P16F1707.INC"
  2.  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
  3.  __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
  4.  
  5.     CBLOCK  0X020
  6.     RET
  7.     RET2
  8.     CONTADOR_BYTES
  9.     ENDC
  10.  
  11.     ORG     0X00
  12.     GOTO    CONFIGURA_PIC
  13.     ORG     0X04
  14.     RETFIE
  15.  CONFIGURA_PIC
  16.     BANKSEL OSCCON
  17.     MOVLW   B'11111011'
  18.     MOVWF   OSCCON
  19.     MOVLW   B'00011111'
  20.     MOVWF   OSCTUNE
  21.     BANKSEL PORTA
  22.     CLRF    PORTA
  23.     CLRF    PORTB
  24.     CLRF    PORTC
  25.     BANKSEL LATA
  26.     CLRF    LATA
  27.     CLRF    LATB
  28.     CLRF    LATC
  29.     BANKSEL ANSELA
  30.     CLRF    ANSELA
  31.     CLRF    ANSELB
  32.     CLRF    ANSELC
  33.     BANKSEL TRISA
  34.     CLRF    TRISA
  35.     CLRF    TRISB
  36.     CLRF    TRISC
  37. ; NOS POSICIONAMOS EN BANCO DE PPSLOCK
  38. ; PARA DELBLOQUEARLO
  39.     BANKSEL PPSLOCK
  40.     MOVLW   0X55
  41.     MOVWF   PPSLOCK
  42.     MOVLW   0XAA
  43.     MOVWF   PPSLOCK
  44.     BCF     PPSLOCK,PPSLOCKED
  45.     BANKSEL RC0PPS
  46.     MOVLW   B'00010010'
  47.     MOVWF   RC0PPS
  48.     MOVLW   B'00010000'
  49.     MOVWF   RC1PPS
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51.     BANKSEL PPSLOCK
  52.     MOVLW   0X55
  53.     MOVWF   PPSLOCK
  54.     MOVLW   0XAA
  55.     MOVWF   PPSLOCK
  56.     BSF     PPSLOCK,PPSLOCKED
  57. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  58.     BANKSEL SSP1CON1
  59.     MOVLW   B'00110000'
  60.     MOVWF   SSP1CON1
  61.     BANKSEL PORTB
  62.    
  63.     #DEFINE LCD_NOKIA   PORTC,2
  64.     #DEFINE RST_NOKIA   PORTC,3
  65.     #DEFINE DC_NOKIA    PORTC,4
  66.  
  67.     BSF     RST_NOKIA
  68.     BSF     LCD_NOKIA
  69.     CALL    INI_LCD_NOKIA
  70.  
  71.  PRINCIPAL
  72.     MOVLW   .1
  73.     CALL    SET_Y
  74.     MOVLW   .30
  75.     CALL    SET_X
  76.     MOVLW   LOW(HOLA_MENSAJE)
  77.     MOVWF   FSR0L
  78.     MOVLW   HIGH(HOLA_MENSAJE)
  79.     MOVWF   FSR0H
  80.     MOVLW   .20
  81.     CALL    MENSAJE_X_BYTES
  82.     MOVLW   .3
  83.     CALL    SET_Y
  84.     MOVLW   .23
  85.     CALL    SET_X
  86.     MOVLW   LOW(TODO_MENSAJE)
  87.     MOVWF   FSR0L
  88.     MOVLW   HIGH(TODO_MENSAJE)
  89.     MOVWF   FSR0H
  90.     MOVLW   .21
  91.     CALL    MENSAJE_X_BYTES
  92. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  93.     MOVLW   LOW(PIC_MENSAJE)
  94.     MOVWF   FSR0L
  95.     MOVLW   HIGH(PIC_MENSAJE)
  96.     MOVWF   FSR0H
  97.     MOVLW   .14
  98.     CALL    MENSAJE_X_BYTES
  99.    
  100. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  101.     CALL    RETARDO
  102.     GOTO    PRINCIPAL
  103. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  104. MENSAJE_X_BYTES
  105.     MOVWF   CONTADOR_BYTES
  106. WRITING_LCD    
  107.     MOVIW   FSR0++
  108.     CALL    DATO_SPI
  109.     DECFSZ  CONTADOR_BYTES,F
  110.     GOTO    WRITING_LCD
  111.     RETURN
  112.    
  113.    
  114.    
  115. INI_LCD_NOKIA
  116.     BCF     RST_NOKIA
  117.     NOP
  118.     BSF     RST_NOKIA
  119.     ;CREAMOS UN RESET POR SOFTWARE DE LA LCD
  120.     MOVLW   LOW(INICIA_NOKIA)
  121.     MOVWF   FSR0L
  122.     MOVLW   HIGH(INICIA_NOKIA)
  123.     MOVWF   FSR0H
  124. INIT_NOKIA
  125.     MOVIW   FSR0++
  126.     CALL    COMANDO_SPI
  127.     MOVIW   [FSR0]
  128.     BTFSS   STATUS,Z
  129.     GOTO    INIT_NOKIA
  130.     RETURN
  131. SET_Y
  132.     ADDLW   B'01000000'
  133.     CALL    COMANDO_SPI
  134.     RETURN
  135. SET_X
  136.     ADDLW   B'10000000'
  137.     CALL    COMANDO_SPI
  138.     RETURN
  139.    
  140.    
  141.     INICIA_NOKIA: dt 0X21,0XCF,0X20,0X0C,0X00
  142.    
  143.     HOLA_MENSAJE: dt 0XFE,0X10,0X10,0XFE,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X80,0X80,0X80,0X00,0XFC,0X12,0X12,0XFC,0X00;A
  144.     TODO_MENSAJE: dt 0X02,0X02,0XFE,0X02,0X02,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X7C,0X00
  145.     PIC_MENSAJE:  dt 0X00,0X00,0XFE,0X12,0X12,0X0C,0X00,0XFE,0X00,0X7C,0X82,0X82,0X44,0X00
  146.  
  147.  
  148.  
  149.  DATO_SPI
  150.     BSF     DC_NOKIA
  151.     BCF     LCD_NOKIA
  152.     BANKSEL SSP1BUF
  153.     MOVWF   SSP1BUF
  154.     BANKSEL PIR1
  155.     BCF     PIR1,SSP1IF
  156. WSPI
  157.     BTFSS   PIR1,SSP1IF
  158.     GOTO    WSPI
  159.     BCF     PIR1,SSP1IF
  160.     BANKSEL PORTA
  161.     BSF     LCD_NOKIA
  162.     RETURN
  163. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  164. COMANDO_SPI
  165.     BCF     DC_NOKIA
  166.     BCF     LCD_NOKIA
  167.     BANKSEL SSP1BUF
  168.     MOVWF   SSP1BUF
  169.     BANKSEL PIR1
  170.     BCF     PIR1,SSP1IF
  171. WSPIC
  172.     BTFSS   PIR1,SSP1IF
  173.     GOTO    WSPIC
  174.     BCF     PIR1,SSP1IF
  175.     BANKSEL PORTA
  176.     BSF     LCD_NOKIA
  177.     RETURN
  178. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  179.  
  180.    
  181. RETARDO
  182.     MOVLW   0XFF
  183.     MOVWF   RET
  184.     MOVWF   RET2
  185. ESP
  186.     DECFSZ  RET,F
  187.     GOTO    ESP
  188.     MOVLW   0XFF
  189.     MOVWF   RET
  190.     DECFSZ  RET2,F
  191.     GOTO    ESP
  192.     RETURN
  193.     END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #31 en: 09 de Noviembre de 2015, 22:52:45 »
Bueno parece que ultimamente le estoy errando a todo..

Citar
por último no se si he encontrado el correcto data pero no encuentro las direcciones donde tengo los caracteres de esta LCD, no la he manejado mucho solo he realizado pequeños dibujitos en ella pero nunca mire que ya tenia los caracteres, no sera mucha molestia si me dices en que parte puedo encontrarlos?

Es correcto, nomas que yo me equivoque con un LCD 2x16, Ese es un LCD grafico asi que no posee una ROM con caracteres

Citar
Esto lo hice así porque al principio no me funcionaba bien esta instrucción:
MOVIW   k[FSR0]

Para mi es nueva la instruccion tambien, y solo tome lo del datasheet, me parecia raro esa k, pero como estba escrito asi en el datasheet procedi a copiarlo de esa forma. Como te decia, es nueva para mi y nunca la use, solo sabia para que se usaba.

Citar
Entonces con lo último que me dices, está bien mi codigo? Refiriendonos a la parte de las direcciones de la tabla?. Las instrucciones de las direcciones en tabla como lo acabamos de hacer si se han asignado de manera correcta se puede hacer esto con cualquier PIC?

Tal ves el compilador ya le agrega el 1 a la direccion de la etiqueta, eso no va a modificar el programa ya que los CALL/GOTO solo usan 11 bits.
Como es nuevo para mi tambien, me asegure con ponerle el bit a 1. Por si las dudas el compilador no lo tomaba. Pero si en algun momento queres leer la memoria flash recorda que tenes ese 1.
Nuevamente se el funcionamiento pero me faltaba probarlo para decirte exactametne si funciona asi o no.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #32 en: 10 de Noviembre de 2015, 14:12:17 »
Bueno parece que si esta bien el código ahora la idea es empezar a trabajar con el módulo ADC para poder hacer algo más con este micro.

Acá el bloque de la configuración del ADC vamos viendo como realizar la correcta configuración.


Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #33 en: 10 de Noviembre de 2015, 14:29:36 »
De la hoja de datos, tiene el siguiente procedimiento:

1. Configure Port:
• Disable pin output driver (Refer to the TRIS
register)
• Configure pin as analog (Refer to the ANSEL
register)
2. Configure the ADC module:
• Select ADC conversion clock
• Configure voltage reference
• Select ADC input channel
• Turn on ADC module
3. Configure ADC interrupt (optional):
• Clear ADC interrupt flag
• Enable ADC interrupt
• Enable peripheral interrupt
• Enable global interrupt(1)
4. Wait the required acquisition time(2).
5. Start conversion by setting the GO/DONE bit.
6. Wait for ADC conversion to complete by one of
the following:
• Polling the GO/DONE bit
• Waiting for the ADC interrupt (interrupts
enabled)
7. Read ADC Result.
8. Clear the ADC interrupt flag (required if interrupt
is enabled).

Con el código:

Código: ASM
  1. ;This code block configures the ADC
  2. ;for polling, Vdd and Vss references, FRC
  3. ;oscillator and AN0 input.
  4. ;
  5. ;Conversion start & polling for completion
  6. ; are included.
  7. ;
  8. BANKSEL ADCON1 ;
  9. MOVLW B’11110000;Right justify, FRC
  10. ;oscillator
  11. MOVWF ADCON1 ;Vdd and Vss Vref
  12. BANKSEL TRISA ;
  13. BSF TRISA,0 ;Set RA0 to input
  14. BANKSEL ANSEL ;
  15. BSF ANSEL,0 ;Set RA0 to analog
  16. BANKSEL ADCON0 ;
  17. MOVLW B’00000001;Select channel AN0
  18. MOVWF ADCON0 ;Turn ADC On
  19. CALL SampleTime ;Acquisiton delay
  20. BSF ADCON0,ADGO ;Start conversion
  21. BTFSC ADCON0,ADGO ;Is conversion done?
  22. GOTO $-1 ;No, test again
  23. BANKSEL ADRESH ;
  24. MOVF ADRESH,W ;Read upper 2 bits
  25. MOVWF RESULTHI ;store in GPR space
  26. BANKSEL ADRESL ;
  27. MOVF ADRESL,W ;Read lower 8 bits
  28. MOVWF RESULTLO ;Store in GPR space

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #34 en: 11 de Noviembre de 2015, 04:26:36 »
Bueno después de pelear un rato con los bancos de memoria nuevamente... Aquí esta el código ejemplo para un ADC con el PIC16F1707. Es el primero e iremos haciendo modificaciones.

Código: ASM
  1. #INCLUDE "P16F1707.INC"
  2.  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
  3.  __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
  4.  
  5.     CBLOCK  0X020
  6.     RET
  7.     RET2
  8.     CONTADOR_BYTES
  9.     RESULTHI
  10.     RESULTLO
  11.     ENDC
  12.  
  13.     ORG     0X00
  14.     GOTO    CONFIGURA_PIC
  15.     ORG     0X04
  16.     RETFIE
  17.  CONFIGURA_PIC
  18.     BANKSEL OSCCON
  19.     MOVLW   B'11111011'
  20.     MOVWF   OSCCON
  21.     MOVLW   B'00011111'
  22.     MOVWF   OSCTUNE
  23.     BANKSEL PORTA
  24.     CLRF    PORTA
  25.     CLRF    PORTB
  26.     CLRF    PORTC
  27.     BANKSEL LATA
  28.     CLRF    LATA
  29.     CLRF    LATB
  30.     CLRF    LATC
  31.     BANKSEL ANSELA
  32.     CLRF    ANSELA
  33.     CLRF    ANSELB
  34.     CLRF    ANSELC
  35.     BANKSEL TRISA
  36.     CLRF    TRISA
  37.     CLRF    TRISB
  38.     CLRF    TRISC
  39. ; NOS POSICIONAMOS EN BANCO DE PPSLOCK
  40. ; PARA DELBLOQUEARLO
  41. ;    BANKSEL PPSLOCK
  42. ;    MOVLW   0X55
  43. ;    MOVWF   PPSLOCK
  44. ;    MOVLW   0XAA
  45. ;    MOVWF   PPSLOCK
  46. ;    BCF            PPSLOCK,PPSLOCKED
  47. ;    BANKSEL RC0PPS
  48. ;    MOVLW   B'00010010'
  49. ;    MOVWF   RC0PPS
  50. ;    MOVLW   B'00010000'
  51. ;    MOVWF   RC1PPS
  52. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  53. ;    BANKSEL PPSLOCK
  54. ;    MOVLW   0X55
  55. ;    MOVWF   PPSLOCK
  56. ;    MOVLW   0XAA
  57. ;    MOVWF   PPSLOCK
  58. ;    BSF            PPSLOCK,PPSLOCKED
  59. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  60. ;    BANKSEL SSP1CON1
  61. ;    MOVLW   B'00110000'
  62. ;    MOVWF   SSP1CON1
  63. ;;;; VAMOS A CONFIGURAR EL ADC
  64.     BANKSEL ADCON1 ;
  65.     MOVLW   B'01100000'
  66.     MOVWF   ADCON1
  67.     BANKSEL TRISA
  68.     BSF     TRISA,0    
  69.     BANKSEL ANSELA ;
  70.     BSF     ANSELA,0
  71.     BANKSEL PORTB
  72.     CLRF    PORTA
  73.     CLRF    PORTB
  74.     CLRF    PORTC
  75.  
  76.  
  77. PRINCIPAL
  78.     CALL    CONV_ADC
  79.     MOVF    RESULTHI,W
  80.     BANKSEL LATC
  81.     MOVWF   LATC
  82.     BANKSEL PORTC
  83.     CALL    RETARDO
  84.     GOTO    PRINCIPAL
  85.  
  86. CONV_ADC
  87.     BANKSEL ADCON0 ;
  88.     MOVLW   B'00000001' ;Select channel AN0
  89.     MOVWF   ADCON0 ;Turn ADC On  
  90.     BSF     ADCON0,ADGO ;Start conversion
  91.     BTFSC   ADCON0,ADGO ;Is conversion done?
  92.     GOTO    $-1 ;No, test again
  93.     BANKSEL ADRESH ;
  94.     MOVF    ADRESH,W ;Read upper 2 bits
  95.     MOVWF   RESULTHI ;store in GPR space
  96.     BANKSEL ADRESL ;
  97.     MOVF    ADRESL,W ;Read lower 8 bits
  98.     MOVWF   RESULTLO ;Store in GPR space
  99.     RETURN
  100. RETARDO
  101.     MOVLW   0X0F
  102.     MOVWF   RET
  103.     MOVWF   RET2
  104. ESP
  105.     DECFSZ  RET,F
  106.     GOTO    ESP
  107.     MOVLW   0XFF
  108.     MOVWF   RET
  109.     DECFSZ  RET2,F
  110.     GOTO    ESP
  111.     RETURN
  112.  
  113.     END

Anexa la imagen de la simulación en proteus.

Bueno pues les platico que tuve problemas al mandar los datos, ya que en principio quería sacarlos por el PORTC. Pero recordé que es por el LATC así que tuve que moverme a ese banco para poder actualizar los datos del ADC correctamente.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #35 en: 11 de Noviembre de 2015, 10:35:27 »
Si solo tenes esos "registros" Usa:

Código: ASM
  1. CBLOCK  0X70
  2.     RET
  3.     RET2
  4.     CONTADOR_BYTES
  5.     RESULTHI
  6.     RESULTLO
  7.     ENDC

Eso te va a ahorrar un par de errores que tenes. Como este:

Código: ASM
  1. BANKSEL ADRESL ;
  2.     MOVF    ADRESL,W ;Read lower 8 bits
  3.     MOVWF   RESULTLO ;Store in GPR space

RESULTLO lo definiste como si fuera del banco 0, pero ahi estarias cambiando la direccion 0xA4 y no 0x24. Si pones todos tus regisrtos desde el 0x70 ( solo 15 puede haber ubicados ahi )
Podes acceder desde cualquier banco al banco 0. es decir si vos accedes a 0xF0 o 0x170 estarias accediendo a 0x70, es asi en esa porcion de memoria para evitar estar cambiando mucho de bancos.

La parte de configuracion del canal del ADC si no vas a cambiar el canal no hace falta que lo pongas dentro de la rutina, y pasalo a la configuracion.

Tenes repetido la limpieza de PORTx, que es innecesaria, ya que si tenes LATx simplemente limpias eso y listo.

Cambie el RETFIE por un RETURN, de esa forma si entra a una interrupcion por error, simplemente sale, con RETFIE se vuelven a activar las interrupciones, por lo cual existiria la posibilidad de que vuelta a entrar.

Código: ASM
  1. #INCLUDE "P16F1707.INC"
  2.  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
  3.  __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
  4.  
  5.     CBLOCK  0X70
  6.     RET
  7.     RET2
  8.     CONTADOR_BYTES
  9.     RESULTHI
  10.     RESULTLO
  11.     ENDC
  12.  
  13.     ORG     0X00
  14.     GOTO    CONFIGURA_PIC
  15.     ORG     0X04
  16.     RETURN
  17. CONFIGURA_PIC
  18.         BANKSEL OSCCON
  19.         MOVLW   B'11111011'
  20.         MOVWF   OSCCON
  21.         MOVLW   B'00011111'
  22.         MOVWF   OSCTUNE
  23.  
  24.         BANKSEL LATA
  25.         CLRF    LATA
  26.         CLRF    LATB
  27.         CLRF    LATC
  28.         BANKSEL ANSELA
  29.         CLRF    ANSELA
  30.         CLRF    ANSELB
  31.         CLRF    ANSELC
  32.         BANKSEL TRISA
  33.         CLRF    TRISA
  34.         CLRF    TRISB
  35.         CLRF    TRISC
  36.  
  37. ;;;; VAMOS A CONFIGURAR EL ADC
  38.         BANKSEL ADCON1          ; El mismo que el de TRISx
  39.         MOVLW   B'01100000'
  40.         MOVWF   ADCON1
  41.         MOVLW   B'00000001'     ;Select channel AN0
  42.         MOVWF   ADCON0          ;Turn ADC On  
  43.         BSF     TRISA,0    
  44.         BANKSEL ANSELA          ;
  45.         BSF     ANSELA,0
  46.  
  47.  
  48. PRINCIPAL
  49.         CALL    CONV_ADC
  50.         MOVF    RESULTHI,W
  51.         BANKSEL LATC
  52.         MOVWF   LATC
  53.         CALL    RETARDO
  54.         GOTO    PRINCIPAL
  55.  
  56. CONV_ADC
  57.         BANKSEL ADCON0          ;
  58.         BSF     ADCON0,ADGO     ;Start conversion
  59.         BTFSC   ADCON0,ADGO     ;Is conversion done?
  60.         GOTO    $-1             ;No, test again
  61.         MOVF    ADRESH,W        ;Read upper 2 bits
  62.         MOVWF   RESULTHI        ;store in GPR space
  63.         MOVF    ADRESL,W        ;Read lower 8 bits
  64.         MOVWF   RESULTLO        ;Store in GPR space
  65.         RETURN
  66. RETARDO
  67.         MOVLW   0X0F
  68.         MOVWF   RET
  69.         MOVWF   RET2
  70. ESP
  71.         DECFSZ  RET,F
  72.         GOTO    ESP
  73.         MOVLW   0XFF
  74.         MOVWF   RET
  75.         DECFSZ  RET2,F
  76.         GOTO    ESP
  77.         RETURN
  78.  
  79.     END

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #36 en: 15 de Noviembre de 2015, 04:18:51 »
Muchisimas gracias KillerJC por las observaciones. Ya cambie el código y esta perfecto. Ahora trabajare en unir los dos últimos programas LCD+ADC con esto haber que aplicación le podemos dar.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #37 en: 15 de Noviembre de 2015, 04:38:33 »
Ya un poco entrados juntamos ambos programas esperando no cometer errores. Acá el código y anexo el circuito, es sencillo lo unico que hace es mostrar el byte alto del ADC en la LCD. Ojo no gráfica si no que mandamos directo el byte lo que nos puede simular un movimiento.

Código: ASM
  1. #INCLUDE "P16F1707.INC"
  2.  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
  3.  __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
  4.  
  5.     CBLOCK  0X020
  6.     RET
  7.     RET2
  8.     CONTADOR_BYTES
  9.     ADC_VALUE
  10.     ENDC
  11.  
  12.     ORG     0X00
  13.     GOTO    CONFIGURA_PIC
  14.     ORG     0X04
  15.     RETURN
  16.  CONFIGURA_PIC
  17.     BANKSEL OSCCON
  18.     MOVLW   B'11111011'
  19.     MOVWF   OSCCON
  20.     MOVLW   B'00011111'
  21.     MOVWF   OSCTUNE
  22.     BANKSEL PORTA
  23.     CLRF    PORTA
  24.     CLRF    PORTB
  25.     CLRF    PORTC
  26.     BANKSEL LATA
  27.     CLRF    LATA
  28.     CLRF    LATB
  29.     CLRF    LATC
  30.     BANKSEL ANSELA
  31.     CLRF    ANSELA
  32.     CLRF    ANSELB
  33.     CLRF    ANSELC
  34.     BANKSEL TRISA
  35.     CLRF    TRISA
  36.     CLRF    TRISB
  37.     CLRF    TRISC
  38. ;CONFIGURAMOS ADC
  39.     BANKSEL ADCON1          ; El mismo que el de TRISx
  40.     MOVLW   B'01100000'
  41.     MOVWF   ADCON1
  42.     MOVLW   B'00000001'     ;Select channel AN0
  43.     MOVWF   ADCON0          ;Turn ADC On  
  44.     BSF     TRISA,0    
  45.     BANKSEL ANSELA          ;
  46.     BSF     ANSELA,0
  47. ; NOS POSICIONAMOS EN BANCO DE PPSLOCK
  48. ; PARA DELBLOQUEARLO
  49.  
  50.     BANKSEL PPSLOCK
  51.     MOVLW   0X55
  52.     MOVWF   PPSLOCK
  53.     MOVLW   0XAA
  54.     MOVWF   PPSLOCK
  55.     BCF     PPSLOCK,PPSLOCKED
  56.     BANKSEL RC0PPS
  57.     MOVLW   B'00010010'
  58.     MOVWF   RC0PPS
  59.     MOVLW   B'00010000'
  60.     MOVWF   RC1PPS
  61. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  62.     BANKSEL PPSLOCK
  63.     MOVLW   0X55
  64.     MOVWF   PPSLOCK
  65.     MOVLW   0XAA
  66.     MOVWF   PPSLOCK
  67.     BSF     PPSLOCK,PPSLOCKED
  68. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  69.     BANKSEL SSP1CON1
  70.     MOVLW   B'00110000'
  71.     MOVWF   SSP1CON1
  72.     BANKSEL PORTB
  73.    
  74.     #DEFINE LCD_NOKIA   PORTC,2
  75.     #DEFINE RST_NOKIA   PORTC,3
  76.     #DEFINE DC_NOKIA    PORTC,4
  77.  
  78.     BSF     RST_NOKIA
  79.     BSF     LCD_NOKIA
  80.     CALL    INI_LCD_NOKIA
  81.  
  82.  PRINCIPAL
  83.     CALL    CONV_ADC
  84.     MOVF    ADC_VALUE,W
  85.     CALL    DATO_SPI
  86.     CALL    RETARDO
  87.     GOTO    PRINCIPAL
  88. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SUBRUTINA ADC
  89. CONV_ADC
  90.         BANKSEL ADCON0          ;
  91.         BSF     ADCON0,ADGO     ;Start conversion
  92.         BTFSC   ADCON0,ADGO     ;Is conversion done?
  93.         GOTO    $-1             ;No, test again
  94.         MOVF    ADRESH,W        ;Read upper 2 bits
  95.         BANKSEL ADC_VALUE
  96.         MOVWF   ADC_VALUE        ;store in GPR space
  97.         RETURN
  98.    
  99. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  100. MENSAJE_X_BYTES
  101.     MOVWF   CONTADOR_BYTES
  102. WRITING_LCD    
  103.     MOVIW   FSR0++
  104.     CALL    DATO_SPI
  105.     DECFSZ  CONTADOR_BYTES,F
  106.     GOTO    WRITING_LCD
  107.     RETURN
  108.    
  109.    
  110.    
  111. INI_LCD_NOKIA
  112.     BCF     RST_NOKIA
  113.     NOP
  114.     BSF     RST_NOKIA
  115.     ;CREAMOS UN RESET POR SOFTWARE DE LA LCD
  116.     MOVLW   LOW(INICIA_NOKIA)
  117.     MOVWF   FSR0L
  118.     MOVLW   HIGH(INICIA_NOKIA)
  119.     MOVWF   FSR0H
  120. INIT_NOKIA
  121.     MOVIW   FSR0++
  122.     CALL    COMANDO_SPI
  123.     MOVIW   [FSR0]
  124.     BTFSS   STATUS,Z
  125.     GOTO    INIT_NOKIA
  126.     RETURN
  127. SET_Y
  128.     ADDLW   B'01000000'
  129.     CALL    COMANDO_SPI
  130.     RETURN
  131. SET_X
  132.     ADDLW   B'10000000'
  133.     CALL    COMANDO_SPI
  134.     RETURN
  135.    
  136.    
  137.     INICIA_NOKIA: dt 0X21,0XCF,0X20,0X0C,0X00
  138.    
  139.     HOLA_MENSAJE: dt 0XFE,0X10,0X10,0XFE,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X80,0X80,0X80,0X00,0XFC,0X12,0X12,0XFC,0X00;A
  140.     TODO_MENSAJE: dt 0X02,0X02,0XFE,0X02,0X02,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X7C,0X00
  141.     PIC_MENSAJE:  dt 0X00,0X00,0XFE,0X12,0X12,0X0C,0X00,0XFE,0X00,0X7C,0X82,0X82,0X44,0X00
  142.  
  143.  
  144.  
  145.  DATO_SPI
  146.     BSF     DC_NOKIA
  147.     BCF     LCD_NOKIA
  148.     BANKSEL SSP1BUF
  149.     MOVWF   SSP1BUF
  150.     BANKSEL PIR1
  151.     BCF     PIR1,SSP1IF
  152. WSPI
  153.     BTFSS   PIR1,SSP1IF
  154.     GOTO    WSPI
  155.     BCF     PIR1,SSP1IF
  156.     BANKSEL PORTA
  157.     BSF     LCD_NOKIA
  158.     RETURN
  159. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  160. COMANDO_SPI
  161.     BCF     DC_NOKIA
  162.     BCF     LCD_NOKIA
  163.     BANKSEL SSP1BUF
  164.     MOVWF   SSP1BUF
  165.     BANKSEL PIR1
  166.     BCF     PIR1,SSP1IF
  167. WSPIC
  168.     BTFSS   PIR1,SSP1IF
  169.     GOTO    WSPIC
  170.     BCF     PIR1,SSP1IF
  171.     BANKSEL PORTA
  172.     BSF     LCD_NOKIA
  173.     RETURN
  174. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  175.  
  176.    
  177. RETARDO
  178.     MOVLW   0XFF
  179.     MOVWF   RET
  180.     MOVWF   RET2
  181. ESP
  182.     DECFSZ  RET,F
  183.     GOTO    ESP
  184.     MOVLW   0XFF
  185.     MOVWF   RET
  186.     DECFSZ  RET2,F
  187.     GOTO    ESP
  188.     RETURN
  189.     END

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #38 en: 15 de Noviembre de 2015, 05:18:14 »
 ;-) Bueno pues ya es algo tarde por aca pero les dejo un codigo ejemplo que aun le falta pero me entretuvo un rato. Estoy pensando ahora como sera la manera mas fácil de obtener por la lectura del adc un tipo graficador como el que hice pero en lugar de utilizar 1 byte y utilice 2 para que se vea mejor. El procedimiento para lograr esto fue: Comparar el valor del ADC en 8 partes de 32 si era mayor le asignaba un valor fijo para que pareciera que la gráfica crece o disminuye. Espero que les sirva de algo.

Código: ASM
  1. #INCLUDE "P16F1707.INC"
  2.  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
  3.  __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
  4.  
  5.     CBLOCK  0X020
  6.     RET
  7.     RET2
  8.     CONTADOR_BYTES
  9.     ADC_VALUE
  10.     GH
  11.     GL
  12.     ENDC
  13.  
  14.     ORG     0X00
  15.     GOTO    CONFIGURA_PIC
  16.     ORG     0X04
  17.     RETURN
  18.  CONFIGURA_PIC
  19.     BANKSEL OSCCON
  20.     MOVLW   B'11111011'
  21.     MOVWF   OSCCON
  22.     MOVLW   B'00011111'
  23.     MOVWF   OSCTUNE
  24.     BANKSEL PORTA
  25.     CLRF    PORTA
  26.     CLRF    PORTB
  27.     CLRF    PORTC
  28.     BANKSEL LATA
  29.     CLRF    LATA
  30.     CLRF    LATB
  31.     CLRF    LATC
  32.     BANKSEL ANSELA
  33.     CLRF    ANSELA
  34.     CLRF    ANSELB
  35.     CLRF    ANSELC
  36.     BANKSEL TRISA
  37.     CLRF    TRISA
  38.     CLRF    TRISB
  39.     CLRF    TRISC
  40. ;CONFIGURAMOS ADC
  41.     BANKSEL ADCON1          ; El mismo que el de TRISx
  42.     MOVLW   B'01100000'
  43.     MOVWF   ADCON1
  44.     MOVLW   B'00000001'     ;Select channel AN0
  45.     MOVWF   ADCON0          ;Turn ADC On  
  46.     BSF     TRISA,0    
  47.     BANKSEL ANSELA          ;
  48.     BSF     ANSELA,0
  49. ; NOS POSICIONAMOS EN BANCO DE PPSLOCK
  50. ; PARA DELBLOQUEARLO
  51.  
  52.     BANKSEL PPSLOCK
  53.     MOVLW   0X55
  54.     MOVWF   PPSLOCK
  55.     MOVLW   0XAA
  56.     MOVWF   PPSLOCK
  57.     BCF     PPSLOCK,PPSLOCKED
  58.     BANKSEL RC0PPS
  59.     MOVLW   B'00010010'
  60.     MOVWF   RC0PPS
  61.     MOVLW   B'00010000'
  62.     MOVWF   RC1PPS
  63. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  64.     BANKSEL PPSLOCK
  65.     MOVLW   0X55
  66.     MOVWF   PPSLOCK
  67.     MOVLW   0XAA
  68.     MOVWF   PPSLOCK
  69.     BSF     PPSLOCK,PPSLOCKED
  70. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  71.     BANKSEL SSP1CON1
  72.     MOVLW   B'00110000'
  73.     MOVWF   SSP1CON1
  74.     BANKSEL PORTB
  75.    
  76.     #DEFINE LCD_NOKIA   PORTC,2
  77.     #DEFINE RST_NOKIA   PORTC,3
  78.     #DEFINE DC_NOKIA    PORTC,4
  79.  
  80.     BSF     RST_NOKIA
  81.     BSF     LCD_NOKIA
  82.     CALL    INI_LCD_NOKIA
  83.  
  84.  PRINCIPAL
  85.     MOVLW   .0
  86.     CALL    SET_Y
  87.     MOVLW   .0
  88.     CALL    SET_X
  89.     MOVLW   LOW(ADC_TEXT)
  90.     MOVWF   FSR0L
  91.     MOVLW   HIGH(ADC_TEXT)
  92.     MOVWF   FSR0H
  93.     MOVLW   .16
  94.     CALL    MENSAJE_X_BYTES
  95.     MOVLW   .2
  96.     CALL    SET_Y
  97.     MOVLW   .0
  98.     CALL    SET_X
  99. UPDATE_ADC  
  100.     CALL    CONV_ADC
  101.     MOVF    ADC_VALUE,W
  102.     CALL    CONVIERTE_ADC
  103. ;    MOVF    GH,W
  104.     CALL    DATO_SPI
  105.     CALL    RETARDO
  106.     GOTO    UPDATE_ADC
  107. ;;;; SUBRUTINA PARA CONVERTIR EL ADC EN VALOR 0-7
  108. CONVIERTE_ADC
  109.     SUBLW   .250
  110.     BTFSC   STATUS,C
  111.     GOTO    $+2
  112.     RETLW   .1
  113.     MOVF    ADC_VALUE,W
  114.     SUBLW   .223
  115.     BTFSC   STATUS,C
  116.     GOTO    $+2
  117.     RETLW   .2
  118.     MOVF    ADC_VALUE,W
  119.     SUBLW   .191
  120.     BTFSC   STATUS,C
  121.     GOTO    $+2
  122.     RETLW   .4
  123.     MOVF    ADC_VALUE,W
  124.     SUBLW   .159
  125.     BTFSC   STATUS,C
  126.     GOTO    $+2
  127.     RETLW   .8
  128.     MOVF    ADC_VALUE,W
  129.     SUBLW   .127
  130.     BTFSC   STATUS,C
  131.     GOTO    $+2
  132.     RETLW   .16
  133.     MOVF    ADC_VALUE,W
  134.     SUBLW   .95
  135.     BTFSC   STATUS,C
  136.     GOTO    $+2
  137.     RETLW   .32
  138.     MOVF    ADC_VALUE,W
  139.     SUBLW   .63
  140.     BTFSC   STATUS,C
  141.     GOTO    $+2
  142.     RETLW   .64
  143.     MOVF    ADC_VALUE,W
  144.     SUBLW   .31
  145.     BTFSC   STATUS,C
  146.     GOTO    $+2
  147.     RETLW   .128
  148.     RETLW   .128
  149.    
  150. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SUBRUTINA ADC
  151. CONV_ADC
  152.         BANKSEL ADCON0          ;
  153.         BSF     ADCON0,ADGO     ;Start conversion
  154.         BTFSC   ADCON0,ADGO     ;Is conversion done?
  155.         GOTO    $-1             ;No, test again
  156.         MOVF    ADRESH,W        ;Read upper 2 bits
  157.         BANKSEL ADC_VALUE
  158.         MOVWF   ADC_VALUE        ;store in GPR space
  159.         RETURN
  160.    
  161. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  162. MENSAJE_X_BYTES
  163.     MOVWF   CONTADOR_BYTES
  164. WRITING_LCD    
  165.     MOVIW   FSR0++
  166.     CALL    DATO_SPI
  167.     DECFSZ  CONTADOR_BYTES,F
  168.     GOTO    WRITING_LCD
  169.     RETURN
  170.    
  171.    
  172.    
  173. INI_LCD_NOKIA
  174.     BCF     RST_NOKIA
  175.     NOP
  176.     BSF     RST_NOKIA
  177.     ;CREAMOS UN RESET POR SOFTWARE DE LA LCD
  178.     MOVLW   LOW(INICIA_NOKIA)
  179.     MOVWF   FSR0L
  180.     MOVLW   HIGH(INICIA_NOKIA)
  181.     MOVWF   FSR0H
  182. INIT_NOKIA
  183.     MOVIW   FSR0++
  184.     CALL    COMANDO_SPI
  185.     MOVIW   [FSR0]
  186.     BTFSS   STATUS,Z
  187.     GOTO    INIT_NOKIA
  188.     RETURN
  189. SET_Y
  190.     ADDLW   B'01000000'
  191.     CALL    COMANDO_SPI
  192.     RETURN
  193. SET_X
  194.     ADDLW   B'10000000'
  195.     CALL    COMANDO_SPI
  196.     RETURN
  197.    
  198.    
  199.     INICIA_NOKIA: dt 0X21,0XCF,0X20,0X0C,0X00
  200.     ADC_TEXT:     dt 0XFC,0X12,0X12,0XFC,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X44,0X00,0X44
  201.     HOLA_MENSAJE: dt 0XFE,0X10,0X10,0XFE,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X80,0X80,0X80,0X00,0XFC,0X12,0X12,0XFC,0X00;A
  202.     TODO_MENSAJE: dt 0X02,0X02,0XFE,0X02,0X02,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X7C,0X00
  203.     PIC_MENSAJE:  dt 0X00,0X00,0XFE,0X12,0X12,0X0C,0X00,0XFE,0X00,0X7C,0X82,0X82,0X44,0X00
  204.  
  205.  
  206.  
  207.  DATO_SPI
  208.     BSF     DC_NOKIA
  209.     BCF     LCD_NOKIA
  210.     BANKSEL SSP1BUF
  211.     MOVWF   SSP1BUF
  212.     BANKSEL PIR1
  213.     BCF     PIR1,SSP1IF
  214. WSPI
  215.     BTFSS   PIR1,SSP1IF
  216.     GOTO    WSPI
  217.     BCF     PIR1,SSP1IF
  218.     BANKSEL PORTA
  219.     BSF     LCD_NOKIA
  220.     RETURN
  221. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  222. COMANDO_SPI
  223.     BCF     DC_NOKIA
  224.     BCF     LCD_NOKIA
  225.     BANKSEL SSP1BUF
  226.     MOVWF   SSP1BUF
  227.     BANKSEL PIR1
  228.     BCF     PIR1,SSP1IF
  229. WSPIC
  230.     BTFSS   PIR1,SSP1IF
  231.     GOTO    WSPIC
  232.     BCF     PIR1,SSP1IF
  233.     BANKSEL PORTA
  234.     BSF     LCD_NOKIA
  235.     RETURN
  236. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  237.  
  238.    
  239. RETARDO
  240.     MOVLW   0X3F
  241.     MOVWF   RET
  242.     MOVWF   RET2
  243. ESP
  244.     DECFSZ  RET,F
  245.     GOTO    ESP
  246.     MOVLW   0XFF
  247.     MOVWF   RET
  248.     DECFSZ  RET2,F
  249.     GOTO    ESP
  250.     RETURN
  251.     END

Saludos y buenas noches

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #39 en: 15 de Noviembre de 2015, 14:10:35 »
Bueno te dejo un codigo para que puedas reemplazar:

Lo tuyo:
Código: ASM
  1. CONVIERTE_ADC
  2.     SUBLW   .250
  3.     BTFSC   STATUS,C
  4.     GOTO    $+2
  5.     RETLW   .1
  6.     MOVF    ADC_VALUE,W
  7.     SUBLW   .223
  8.     BTFSC   STATUS,C
  9.     GOTO    $+2
  10.     RETLW   .2
  11.     MOVF    ADC_VALUE,W
  12.     SUBLW   .191
  13.     BTFSC   STATUS,C
  14.     GOTO    $+2
  15.     RETLW   .4
  16.     MOVF    ADC_VALUE,W
  17.     SUBLW   .159
  18.     BTFSC   STATUS,C
  19.     GOTO    $+2
  20.     RETLW   .8
  21.     MOVF    ADC_VALUE,W
  22.     SUBLW   .127
  23.     BTFSC   STATUS,C
  24.     GOTO    $+2
  25.     RETLW   .16
  26.     MOVF    ADC_VALUE,W
  27.     SUBLW   .95
  28.     BTFSC   STATUS,C
  29.     GOTO    $+2
  30.     RETLW   .32
  31.     MOVF    ADC_VALUE,W
  32.     SUBLW   .63
  33.     BTFSC   STATUS,C
  34.     GOTO    $+2
  35.     RETLW   .64
  36.     MOVF    ADC_VALUE,W
  37.     SUBLW   .31
  38.     BTFSC   STATUS,C
  39.     GOTO    $+2
  40.     RETLW   .128
  41.     RETLW   .128
(Que posee ese GOTO/BTFSC/RETLW de mas al final )

Por esto:

Código: ASM
  1. SWAPF   ADC_VALUE, F
  2.         LSRF    ADC_VALUE, W
  3.         SWAPF   ADC_VALUE, F
  4.         ANDLW   0x07
  5.         BRW
  6.         RETLW   .128
  7.         RETLW   .64
  8.         RETLW   .32
  9.         RETLW   .16
  10.         RETLW   .8
  11.         RETLW   .4
  12.         RETLW   .2
  13.         RETLW   .1

Explicacion, es simple.. vos estas usando solo 8 partes de 32 bits cada una. En resumen es como si dividiera por 32 el numero.

adc_result = aaax xxxx

Al dividirlo por 32 las x se irian y quedaria: 0000 0aaa
El SWAPF cambia los nibbles  ADC_RESULT = xxxx aaax
Luego una rotacion para que me quede W = 0xxx xaaa
Procedo a dejar como estaba antes ADC_RESULT ( en cosa que otra cosa lo necesite) ADC_RESULT = aaax xxxx
Finalmente le hago una AND a W para forzar el maximo a 0000 0111 como entrada en la tabla.
Fin.

Todo esto fue para no modificar el ADC_RESULT, si este valor ya no importaba. Entonces podria haber ahorrado un SWAPF mas.

PD: No te va a dar el mismo valor ya que al final no respetaste que las partes sean exactas, por ejemplo veo que tenes un 250 por ahi. Asi que tal ves difiera un poco.
« Última modificación: 15 de Noviembre de 2015, 14:20:49 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #40 en: 23 de Noviembre de 2015, 03:21:24 »
Muy buenos consejos KillerJC para optimizacion de codigo. Pregunta como funciona esta parte del codigo que me has sugerido?
Código: ASM
  1. BRW
  2.         RETLW   .128
  3.         RETLW   .64
  4.         RETLW   .32
  5.         RETLW   .16
  6.         RETLW   .8
  7.         RETLW   .4
  8.         RETLW   .2
  9.         RETLW   .1

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #41 en: 23 de Noviembre de 2015, 03:41:42 »
Es una tabla ... Lo mismo que haces con:

ADDWF PCL
RETLW ...
...
...
RETLW ....


Nomas que ese PIC posee una instruccion que lo hace por uno.. que es BRW
Esa instruccion le suma al PC el valor de W. W vale de 0 a 7 (0000 0111) por las condiciones que le pusimos antes y eso se traduce en la tabla:

Código: ASM
  1. BRW
  2.         RETLW   .128   ;W=0
  3.         RETLW   .64    ;W=1
  4.         RETLW   .32    ;W=2
  5.         RETLW   .16    ;W=3
  6.         RETLW   .8     ;W=4
  7.         RETLW   .4     ;W=5
  8.         RETLW   .2     ;W=6
  9.         RETLW   .1     ;W=7

Lo bueno es que no tengo que ir al banco donde esta el PCL , se observa tambien que antes dije PC solamente, y no PCL, esto es por que la instruccion BRW le suma el valor de W a todo el PC ( 14bits ), y no me tengo que preocupar por las "paginas", en cambio con ADDWF si lo tenia que hacer, ya que solo modifica los 8 bits de menor peso ( PCL ) y debo cargar antes el valor de la parte superior en PCLATH si es que me excedo. Lo cual requiere un poco mas de cuidado si es que uno no posiciona la tabla en un lugar que evite esto.
« Última modificación: 23 de Noviembre de 2015, 03:46:30 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #42 en: 03 de Diciembre de 2015, 22:41:25 »
Bueno retomando la parte de código que Killer me recomendó anexo un pequeño código que se ha ido acompletando que es para graficar la señal del ADC + mostrar el valor del ADC de 0 a 255. Por favor si hay algo que podamos mejorar me hacen los comentarios.

Código: ASM
  1. #INCLUDE "P16F1707.INC"
  2.  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
  3.  __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
  4.  
  5.     CBLOCK  0X020
  6.     RET
  7.     RET2
  8.     CONTADOR_BYTES
  9.     ADC_VALUE
  10.     GH
  11.     GL
  12.     CENTENAS
  13.     DECENAS
  14.     UNIDADES
  15.     BCD_AUX
  16.     X_POS
  17.     ENDC
  18. ;***********************************************************************************************
  19. ;********************************* VECTOR DE RESET DEL PIC *************************************
  20. ;***********************************************************************************************
  21.     ORG     0X00
  22.     GOTO    CONFIGURA_PIC
  23. ;***********************************************************************************************
  24. ;***************************** VECTOR DE INTERRUPCION DEL PIC **********************************
  25. ;***********************************************************************************************
  26.     ORG     0X04
  27.     RETURN
  28. ;***********************************************************************************************
  29. ;********************************* CONFIGURACION DEL PIC ***************************************
  30. ;***********************************************************************************************
  31.  CONFIGURA_PIC
  32.     BANKSEL OSCCON
  33.     MOVLW   B'11111011'
  34.     MOVWF   OSCCON
  35.     MOVLW   B'00011111'
  36.     MOVWF   OSCTUNE
  37. ;***********************************************************************************************
  38. ;*************************** CONFIGURACION DE PUERTOS DEL PIC **********************************
  39. ;***********************************************************************************************
  40.     BANKSEL PORTA
  41.     CLRF    PORTA
  42.     CLRF    PORTB
  43.     CLRF    PORTC
  44.     BANKSEL LATA
  45.     CLRF    LATA
  46.     CLRF    LATB
  47.     CLRF    LATC
  48.     BANKSEL ANSELA
  49.     CLRF    ANSELA
  50.     CLRF    ANSELB
  51.     CLRF    ANSELC
  52.     BANKSEL TRISA
  53.     CLRF    TRISA
  54.     CLRF    TRISB
  55.     CLRF    TRISC
  56. ;CONFIGURAMOS ADC
  57.     BANKSEL ADCON1          ; El mismo que el de TRISx
  58.     MOVLW   B'01100000'
  59.     MOVWF   ADCON1
  60.     MOVLW   B'00000001'     ;Select channel AN0
  61.     MOVWF   ADCON0          ;Turn ADC On  
  62.     BSF     TRISA,0    
  63.     BANKSEL ANSELA          ;
  64.     BSF     ANSELA,0
  65. ; NOS POSICIONAMOS EN BANCO DE PPSLOCK
  66. ; PARA DELBLOQUEARLO
  67.  
  68.     BANKSEL PPSLOCK
  69.     MOVLW   0X55
  70.     MOVWF   PPSLOCK
  71.     MOVLW   0XAA
  72.     MOVWF   PPSLOCK
  73.     BCF     PPSLOCK,PPSLOCKED
  74.     BANKSEL RC0PPS
  75.     MOVLW   B'00010010'
  76.     MOVWF   RC0PPS
  77.     MOVLW   B'00010000'
  78.     MOVWF   RC1PPS
  79. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  80.     BANKSEL PPSLOCK
  81.     MOVLW   0X55
  82.     MOVWF   PPSLOCK
  83.     MOVLW   0XAA
  84.     MOVWF   PPSLOCK
  85.     BSF     PPSLOCK,PPSLOCKED
  86. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  87.     BANKSEL SSP1CON1                ; ME HUBICO EN EL BANCO QUE CONTIENE EL REGISTRO SSP1CON
  88.     MOVLW   B'00110000'             ; CARGO EL VALOR DE CONFIGURACION PARA SPI
  89.     MOVWF   SSP1CON1                ; LO GUARDO EN SSP1CON PARA PODER USAR EL MODO SPI
  90.     BANKSEL PORTB                   ; ME REGRESO AL BANCO 0
  91. ;***********************************************************************************************
  92. ;****************** DEFINICION DE LOS PINES DEL PROGRAMA ***************************************
  93. ;***********************************************************************************************    
  94.     #DEFINE LCD_NOKIA   PORTC,2     ; DEFINE EL PIN DEL CHIP SELECT
  95.     #DEFINE RST_NOKIA   PORTC,3     ; DEFINE EL PIN DE RESET
  96.     #DEFINE DC_NOKIA    PORTC,4     ; DEFINE EL PIN DE INSTRUCCION/DATO DE LA LCD
  97.  
  98.     BSF     RST_NOKIA               ; PONGO EN ALTO EL RESET DE LA LCD
  99.     BSF     LCD_NOKIA               ; PONGO EN ALTO EL CHIP SELECT DE LA LCD
  100. ;***********************************************************************************************
  101. ;********************* RUTINIA DE INICIALIZACION DE LA LCD NOKIA 5110 **************************
  102. ;***********************************************************************************************
  103.     CALL    INI_LCD_NOKIA
  104. ;***********************************************************************************************
  105. ;**************************** LOOP PRINCIPAL DE FUNCIONAMIENTO *********************************
  106. ;***********************************************************************************************
  107.     CLRF    X_POS
  108.  PRINCIPAL
  109.     CALL    RETARDO                 ; LLAMAMOS UN RETARDO
  110.     MOVLW   .0                      ; CARGO EL VALOR DEL RENGLON DONDE DESEO ESCRIBIR
  111.     CALL    SET_Y                   ; LLAMO RUTINA DE SET POSICION EN Y
  112.     MOVLW   .0                      ; CARGO EL VALOR DE LA COLUMNA DONDE DESEO ESCRIBIR
  113.     CALL    SET_X                   ; LLAMO RUTINA DE SET POSICION EN X
  114.     MOVLW   LOW(ADC_TEXT)           ; MUEVO LA DIRECCION DE LA TABLA ADC_TEXT (LOW)
  115.     MOVWF   FSR0L                   ; A MI REGISTRO FSR0L
  116.     MOVLW   HIGH(ADC_TEXT)          ; MUEVO LA DIRECCION DE LA TABLA ADC_TEXT (HIGH)
  117.     MOVWF   FSR0H                   ; AL REGISTRO FSR0H
  118.     MOVLW   .17                     ; NUMERO DE BYTES A TRANSMITIR
  119.     CALL    MENSAJE_X_BYTES         ; LLAMO A SUBRUTINA DE TRANSMISION DE BYTES
  120.     CALL    MUESTRA_VALOR           ; LLAMAMOS A SUBRUTINA QUE MOSTRARA EL VALOR CONTENIDO DEL ADC 8 BITS
  121.     MOVLW   .2                      ; MUEVO MI CURSOR A RENGLON 2
  122.     CALL    SET_Y                   ; LLAMO MI SET POSICION Y
  123.     MOVF    X_POS,W                 ; MUEVO MI CURSOR A COLUMNA 0
  124.     CALL    SET_X                   ; LLAMO MI SET POSICION X
  125. ;***********************************************************************************************
  126. ;******************* RUTINA DE LECTURA Y PROCESAMIENTO DEL ADC CH=0 ****************************
  127. ;***********************************************************************************************
  128. UPDATE_ADC  
  129.     CALL    CONV_ADC                ; LLAMO A MI RUTINA DE CONVERSION ADC    
  130.     MOVF    ADC_VALUE,W             ; REGRESA CON ADRESH CARGADO A W Y LO MOVEMOS A ADC_VALUE
  131.     CALL    GRAFICA_ADC             ; LLAMAMOS A LA RUTINA DE CONVERSION PARA LA LCD
  132.     CALL    DATO_SPI                ; LLAMAMOS LA TRANSMISION DEL DATO
  133.     INCF    X_POS,F                 ; DESPUES DE ENVIAR DATO INCREMENTAMOS POS X PARA TENER MOVIMIENTO EN SEÑAL
  134.     MOVLW   .84                     ; DEBEMOS ASEGURAR NO PASAR DE 83
  135.     SUBWF   X_POS,W                 ; PARA ELLO RESTAMOS 84 PARA SABER SI HA LLEGADO Y REINICIAR POSICION
  136.     BTFSS   STATUS,Z                ; SI HA LLEGADO LA RESTA ARROJARA 0 Y PODREMOS REINICIAR
  137.     GOTO    PRINCIPAL               ; NO FUE CERO REGRESO A PRINCIPAL
  138.     CLRF    X_POS                   ; YA LLEGO AL LIMITE REINICIO VARIABLE
  139.     GOTO    PRINCIPAL               ; NOS REGRESAMOS A PRINCIPAL
  140. ;***********************************************************************************************
  141. ;************************ RUTINA PARA MOSTRAR VALOR ADC 8 BITS *********************************
  142. ;***********************************************************************************************  
  143. MUESTRA_VALOR
  144.     BANKSEL ADC_VALUE               ; ME ASEGURO ESTAR EN BANCO DONDE ESTA ADC_VALUE (MI REGISTRO)
  145.     MOVF    ADC_VALUE,W             ; MOVEMOS ADC_VALUE A W PARA OBTENER 3 BYTES CON EL DATO
  146.     CALL    CONVERSION_BCD          ; RUTINA DE CONVERISON BINARIO>>BCD
  147.     MOVF    CENTENAS,W              ; MOVEMOS CENTENAS A W PARA SABER CON QUE NÚMERO QUEDO
  148.     CALL    ENVIA_NUMERO            ; RUTINA DE ESCRITURA DE NUMEROS EN LCD
  149.     MOVF    DECENAS,W               ; MOVEMOS CENTENAS A W PARA SABER CON QUE NÚMERO QUEDO
  150.     CALL    ENVIA_NUMERO            ; RUTINA DE ESCRITURA DE NUMEROS EN LCD
  151.     MOVF    UNIDADES,W              ; MOVEMOS CENTENAS A W PARA SABER CON QUE NÚMERO QUEDO
  152.     CALL    ENVIA_NUMERO            ; RUTINA DE ESCRITURA DE NUMEROS EN LCD
  153.     RETURN  
  154. ENVIA_NUMERO
  155.     BRW                             ; INSTRUCCION CON FUNCION A TABLA SIN PCL
  156.     GOTO    SEND0                   ;
  157.     GOTO    SEND1
  158.     GOTO    SEND2
  159.     GOTO    SEND3
  160.     GOTO    SEND4
  161.     GOTO    SEND5
  162.     GOTO    SEND6
  163.     GOTO    SEND7
  164.     GOTO    SEND8
  165.     GOTO    SEND9
  166. ;***********************************************************************************************
  167. ;***************************** RUTINAS PARA MANDAR VALORES EN LCD ******************************
  168. ;***********************************************************************************************
  169. SEND9
  170.     MOVLW   B'01001100'             ; CONSTRUIMOS CON 4 BYTES
  171.     CALL    DATO_SPI                ; EL NUMERO 9
  172.     MOVLW   B'10010010'             ; DEJANDO UN ESPACIO
  173.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  174.     MOVLW   B'10010010'             ; DADO POR 0X00
  175.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  176.     MOVLW   B'01111100'             ; EL CANAL SPI
  177.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  178.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  179.     CALL    DATO_SPI
  180.     RETURN
  181. SEND8
  182.     MOVLW   B'01101100'             ; CONSTRUIMOS CON 4 BYTES
  183.     CALL    DATO_SPI                ; EL NUMERO 8
  184.     MOVLW   B'10010010'             ; DEJANDO UN ESPACIO
  185.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  186.     MOVLW   B'10010010'             ; DADO POR 0X00
  187.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  188.     MOVLW   B'01101100'             ; EL CANAL SPI
  189.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  190.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  191.     CALL    DATO_SPI
  192.     RETURN
  193. SEND7
  194.     MOVLW   B'01100010'             ; CONSTRUIMOS CON 4 BYTES
  195.     CALL    DATO_SPI                ; EL NUMERO 7
  196.     MOVLW   B'00010010'             ; DEJANDO UN ESPACIO
  197.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  198.     MOVLW   B'00001010'             ; DADO POR 0X00
  199.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  200.     MOVLW   B'00000110'             ; EL CANAL SPI
  201.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  202.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  203.     CALL    DATO_SPI
  204.     RETURN
  205. SEND6
  206.     MOVLW   B'01111100'             ; CONSTRUIMOS CON 4 BYTES
  207.     CALL    DATO_SPI                ; EL NUMERO 6
  208.     MOVLW   B'10010010'             ; DEJANDO UN ESPACIO
  209.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  210.     MOVLW   B'10010010'             ; DADO POR 0X00
  211.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  212.     MOVLW   B'01100100'             ; EL CANAL SPI
  213.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  214.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  215.     CALL    DATO_SPI
  216.     RETURN
  217. SEND5
  218.     MOVLW   B'01001110'             ; CONSTRUIMOS CON 4 BYTES
  219.     CALL    DATO_SPI                ; EL NUMERO 5
  220.     MOVLW   B'10001010'             ; DEJANDO UN ESPACIO
  221.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  222.     MOVLW   B'10001010'             ; DADO POR 0X00
  223.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  224.     MOVLW   B'01110010'             ; EL CANAL SPI
  225.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  226.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  227.     CALL    DATO_SPI
  228.     RETURN
  229. SEND4
  230.     MOVLW   B'00110000'             ; CONSTRUIMOS CON 4 BYTES
  231.     CALL    DATO_SPI                ; EL NUMERO 3
  232.     MOVLW   B'00101000'             ; DEJANDO UN ESPACIO
  233.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  234.     MOVLW   B'00100100'             ; DADO POR 0X00
  235.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  236.     MOVLW   B'11111110'             ; EL CANAL SPI
  237.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  238.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  239.     CALL    DATO_SPI
  240.     RETURN
  241. SEND3
  242.     MOVLW   B'01000100'             ; CONSTRUIMOS CON 4 BYTES
  243.     CALL    DATO_SPI                ; EL NUMERO 3
  244.     MOVLW   B'10010010'             ; DEJANDO UN ESPACIO
  245.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  246.     MOVLW   B'10010010'             ; DADO POR 0X00
  247.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  248.     MOVLW   B'01101100'             ; EL CANAL SPI
  249.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  250.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  251.     CALL    DATO_SPI
  252.     RETURN
  253. SEND2
  254.     MOVLW   B'11000100'             ; CONSTRUIMOS CON 4 BYTES
  255.     CALL    DATO_SPI                ; EL NUMERO 2
  256.     MOVLW   B'10100010'             ; DEJANDO UN ESPACIO
  257.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  258.     MOVLW   B'10010010'             ; DADO POR 0X00
  259.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  260.     MOVLW   B'10001100'             ; EL CANAL SPI
  261.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  262.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  263.     CALL    DATO_SPI
  264.     RETURN
  265. SEND1
  266.     MOVLW   B'00000000'             ; CONSTRUIMOS CON 4 BYTES
  267.     CALL    DATO_SPI                ; EL NUMERO 1
  268.     MOVLW   B'10000100'             ; DEJANDO UN ESPACIO
  269.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  270.     MOVLW   B'11111110'             ; DADO POR 0X00
  271.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  272.     MOVLW   B'10000000'             ; EL CANAL SPI
  273.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  274.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  275.     CALL    DATO_SPI
  276.     RETURN    
  277. SEND0
  278.     MOVLW   B'01111100'             ; CONSTRUIMOS CON 4 BYTES
  279.     CALL    DATO_SPI                ; EL NUMERO 0
  280.     MOVLW   B'10000010'             ; DEJANDO UN ESPACIO
  281.     CALL    DATO_SPI                ; AL FINAL DEL NUMERO
  282.     MOVLW   B'10000010'             ; DADO POR 0X00
  283.     CALL    DATO_SPI                ; MANDAMOS 5 BYTES SEGUIDOS POR
  284.     MOVLW   B'01111100'             ; EL CANAL SPI
  285.     CALL    DATO_SPI                ; PARA CONSTRUIR COMPLETO EL NUMERO
  286.     MOVLW   B'00000000'             ; SIN PERDER FORMA
  287.     CALL    DATO_SPI
  288.     RETURN
  289. ;***********************************************************************************************
  290. ;***************************** RUTINA PARA CONVERTIR BIN A BCD *********************************
  291. ;***********************************************************************************************  
  292. CONVERSION_BCD
  293.         MOVWF   BCD_AUX             ; MUEVO EL VALOR DE W A BCD_AUX
  294.         CLRF    UNIDADES            ; LIMPIO REGISTRO UNIDADES
  295.         CLRF    DECENAS             ; LIMPIO REGISTRO DECENAS
  296.         CLRF    CENTENAS            ; LIMPIO REGISTRO CENTENAS
  297. S_CENTENAS
  298.         MOVLW   .100                ; CARGO 100 A W
  299.         SUBWF   BCD_AUX,W           ; LE RESTO LOS 100 PARA SABER SI ES MAYOR O MENOR
  300.         BTFSC   STATUS,C            ; PREGUNTO SI HUBO ACARREO
  301.         GOTO    SUMA_CENTENAS       ; SI ES MAYOR SUMO CENTENAS
  302.         GOTO    S_DECENAS           ; SI ES MENOR DEJO EN 0 CENTENAS Y ACTUALIZO DECENAS
  303. SUMA_CENTENAS
  304.         MOVWF   BCD_AUX             ; GUARDAMOS EL ULTIMO VALOR
  305.         INCF    CENTENAS,F          ; INCREMENTO CENTENAS Y GUARDO
  306.         GOTO    S_CENTENAS          ; REGRESO A SUMAR SI ES AUN MAS GRANDE
  307. S_DECENAS  
  308.         MOVLW   .10                 ; CARGO 10 A W
  309.         SUBWF   BCD_AUX,W           ; LE RESTO 10 PARA SABER SI ES MAYOR O MENOR
  310.         BTFSC   STATUS,C            ; PREGUNTAMOS SI HAY ACARREO
  311.         GOTO    SUMA_DECENAS        ; SI HUBO VAMOS A SUMAR DECENAS
  312.         GOTO    SUMA_UNIDADES       ; SI NO VAMOS A SUMAR UNIDADES
  313. SUMA_DECENAS
  314.         MOVWF   BCD_AUX             ; GUARDAMOS VALOR
  315.         INCF    DECENAS,1           ; INCREMENTAMOS DECENAS EN 1 Y GUARDAMOS
  316.         GOTO    S_DECENAS           ; REGRESAMOS PARA SABER SI HAY MAS DECENAS EN VARIABLE
  317. SUMA_UNIDADES
  318.         MOVF    BCD_AUX,W           ; MOVEMOS AUXILIAR A UNIDADES
  319.         MOVWF   UNIDADES            ; YA QUE ES EL ÚLTIMO VALOR QUE NOS QUEDA
  320.         RETURN    
  321. ;***********************************************************************************************
  322. ;****************************** RUTINA PARA GRAFICAR 1 RENGLON *********************************
  323. ;***********************************************************************************************
  324. GRAFICA_ADC
  325.     SWAPF   ADC_VALUE, F            ; INTERCAMBIAMOS NIBLES
  326.     LSRF    ADC_VALUE, W            ; ROTAMOS A LA IZQUIERDA
  327.     SWAPF   ADC_VALUE, F            ; REGRESAMOS ADC_VALUE A SU VALOR ORIGINAL PARA POST PROCESAMIENTOS
  328.     ANDLW   0x07                    ; ANDEAMOS EL VALOR DADO PARA RESTRINGIR A 8 VALORES B'XXXXX111'
  329.     BRW                     ;
  330.     RETLW   .128            ; W=0
  331.     RETLW   .64             ; W=1
  332.     RETLW   .32             ; W=2
  333.     RETLW   .16             ; W=3
  334.     RETLW   .8              ; W=4
  335.     RETLW   .4              ; W=5
  336.     RETLW   .2              ; W=6
  337.     RETLW   .1              ; W=7
  338. ;***********************************************************************************************
  339. ;*************************************** RUTINA CONVERSION ADC *********************************
  340. ;***********************************************************************************************
  341. CONV_ADC
  342.         BANKSEL ADCON0              ; NOS UBICAMOS EN EL BANCO QUE CONTIENE A ADCON0
  343.         BSF     ADCON0,ADGO         ; PRENDEMOS EL BIT GO PARA INICIAR LA CONVERSION ADC
  344.         BTFSC   ADCON0,ADGO         ; SALTAMOS UNA INSTRUCCION SI ES QUE YA TERMINO LA CONVERSION ADC
  345.         GOTO    $-1                 ; REGRESAMOS UNA LINEA DE CODIGO PARA SABER SI YA TERMINO CONVERSION ADC
  346.         MOVF    ADRESH,W            ; MOVEMOS ADRESH A W UNA VEZ ACABADA LA CONVERSION
  347.         BANKSEL ADC_VALUE           ; NOS UBICAMOS EN BANCO QUE CONTIENE A VARIABLE DECLARADA
  348.         MOVWF   ADC_VALUE           ; MOVEMOS EL RESULTADO DE ADRESH A NUESTRA VARIABLE
  349.         RETURN
  350. ;***********************************************************************************************
  351. ;******************************* RUTINA DE ESCRITURA SPI X BYTES *******************************
  352. ;***********************************************************************************************
  353. MENSAJE_X_BYTES
  354.     MOVWF   CONTADOR_BYTES          ; MOVEMOS A NUESTRO REGISTRO CONTADOR BYTES EL # EN W
  355. WRITING_LCD    
  356.     MOVIW   FSR0++                  ; MOVEMOS INDF A W E INCREMENTAMOS FSR0 EN 1
  357.     CALL    DATO_SPI                ; TRASNMITIMOS VIA SPI EL BYTE EN W
  358.     DECFSZ  CONTADOR_BYTES,F        ; DECREMENTAMOS 1 EL CONTADOR Y SALTAMOS HASTA 0
  359.     GOTO    WRITING_LCD             ; REGRESAMOS A SEGUIR ESCRIBIENDO LA LCD
  360.     RETURN
  361. ;***********************************************************************************************
  362. ;************************** RUTINA DE INICIALIZACION DE LCD NOKIA5110 **************************
  363. ;***********************************************************************************************    
  364. INI_LCD_NOKIA
  365.     BCF     RST_NOKIA                ; CREAMOS UN SOFTWARE POR RESET EN LA LCD
  366.     NOP                              ; PERDEMOS UN CICLO DE INSTRUCCION
  367.     BSF     RST_NOKIA                ; REGRESAMOS DEL RESET
  368.     MOVLW   LOW(INICIA_NOKIA)
  369.     MOVWF   FSR0L
  370.     MOVLW   HIGH(INICIA_NOKIA)
  371.     MOVWF   FSR0H
  372. INIT_NOKIA
  373.     MOVIW   FSR0++
  374.     CALL    COMANDO_SPI
  375.     MOVIW   [FSR0]
  376.     BTFSS   STATUS,Z
  377.     GOTO    INIT_NOKIA
  378.     RETURN
  379. ;***********************************************************************************************
  380. ;************************** RUTINA DE POSICIONAMIENTO EN Y (RENGLONES) *************************
  381. ;***********************************************************************************************
  382. SET_Y
  383.     ADDLW   B'01000000'
  384.     CALL    COMANDO_SPI
  385.     RETURN
  386. ;***********************************************************************************************
  387. ;************************** RUTINA DE POSICIONAMIENTO EN X (COLUMNAS) **************************
  388. ;***********************************************************************************************
  389. SET_X
  390.     ADDLW   B'10000000'
  391.     CALL    COMANDO_SPI
  392.     RETURN
  393. ;***********************************************************************************************
  394. ;*************************** ZONA DE DECLARACION DE TABLAS PARA DATOS **************************
  395. ;***********************************************************************************************  
  396.     INICIA_NOKIA: dt 0X21,0XCF,0X20,0X0C,0X00
  397.     ADC_TEXT:     dt 0XFC,0X12,0X12,0XFC,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X44,0X00,0X14,0X00
  398.     HOLA_MENSAJE: dt 0XFE,0X10,0X10,0XFE,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X80,0X80,0X80,0X00,0XFC,0X12,0X12,0XFC,0X00;A
  399.     TODO_MENSAJE: dt 0X02,0X02,0XFE,0X02,0X02,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X7C,0X00
  400.     PIC_MENSAJE:  dt 0X00,0X00,0XFE,0X12,0X12,0X0C,0X00,0XFE,0X00,0X7C,0X82,0X82,0X44,0X00
  401.  
  402.  
  403.  
  404.  
  405.  DATO_SPI
  406.     BSF     DC_NOKIA
  407.     BCF     LCD_NOKIA
  408.     BANKSEL SSP1BUF
  409.     MOVWF   SSP1BUF
  410.     BANKSEL PIR1
  411.     BCF     PIR1,SSP1IF
  412. WSPI
  413.     BTFSS   PIR1,SSP1IF
  414.     GOTO    WSPI
  415.     BCF     PIR1,SSP1IF
  416.     BANKSEL PORTA
  417.     BSF     LCD_NOKIA
  418.     RETURN
  419. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  420. COMANDO_SPI
  421.     BCF     DC_NOKIA
  422.     BCF     LCD_NOKIA
  423.     BANKSEL SSP1BUF
  424.     MOVWF   SSP1BUF
  425.     BANKSEL PIR1
  426.     BCF     PIR1,SSP1IF
  427. WSPIC
  428.     BTFSS   PIR1,SSP1IF
  429.     GOTO    WSPIC
  430.     BCF     PIR1,SSP1IF
  431.     BANKSEL PORTA
  432.     BSF     LCD_NOKIA
  433.     RETURN
  434. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  435.  
  436.    
  437. RETARDO
  438.     MOVLW   0X3F
  439.     MOVWF   RET
  440.     MOVWF   RET2
  441. ESP
  442.     DECFSZ  RET,F
  443.     GOTO    ESP
  444.     MOVLW   0XFF
  445.     MOVWF   RET
  446.     DECFSZ  RET2,F
  447.     GOTO    ESP
  448.     RETURN
  449.     END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #43 en: 04 de Diciembre de 2015, 05:52:27 »
Sigamos jugando con tablas y accesos indirectos!


Código: ASM
  1. MUESTRA_VALOR
  2.  
  3.     BANKSEL ADC_VALUE               ; ME ASEGURO ESTAR EN BANCO DONDE ESTA ADC_VALUE (MI REGISTRO)
  4.     MOVF    ADC_VALUE,W             ; MOVEMOS ADC_VALUE A W PARA OBTENER 3 BYTES CON EL DATO
  5.  
  6.     CALL    CONVERSION_BCD          ; RUTINA DE CONVERISON BINARIO>>BCD
  7.  
  8.     CLRF    FSR1H                   ; Set de puntero para el valor centena, las variables deben estar ubicadas en ORDEN y SEGUIDAS Centenas, Decenas, Unidades para que funcione
  9.     MOVLW   CENTENAS                ; No puse LOW() por que es una constante, aunque no se si afectaria
  10.     MOVWF   FSR1L
  11.  
  12. Loopete
  13.  
  14.     MOVLW   LOW(NUMS)               ; MUEVO LA DIRECCION DE LA TABLA NUMS (LOW)
  15.     MOVWF   FSR0L                   ; A MI REGISTRO FSR0L
  16.     MOVLW   HIGH(NUMS)              ; MUEVO LA DIRECCION DE LA TABLA NUMS (HIGH)
  17.     MOVWF   FSR0H                   ; AL REGISTRO FSR0H
  18.  
  19.     BCF     STATUS,C                ; Carry = 0, para la rotacion me aseguro
  20.     RLF     INDF1,W                 ; W = x*2
  21.     RLF     WREG,W                  ; W = x*2*2 = x*4
  22.     ADDWF   FSR0L,F                 ; Sumo a la base de la tabla para obtener el offset
  23.     BTFSC   STATUS,C                ; Correccion por si se excedio, una precaucion solo por si se puso en un borde la tabla
  24.     INCF    FSR0H,F
  25.  
  26.     MOVLW   .4                      ; NUMERO DE BYTES A TRANSMITIR
  27.     CALL    MENSAJE_X_BYTES         ; LLAMO A SUBRUTINA DE TRANSMISION DE BYTES
  28.  
  29.     CLRW                            ; Envio el 0x00 que habia que enviar siempre al final, es esto, o ocupar "9 bytes", en realiadad 9 palabras de memoria mas mas en tabla
  30.     CALL    DATO_SPI
  31.  
  32.     MOVLW   UNIDADES                ; El valor a que apunta es las unidades? es decir se envio las unidades recien?
  33.     SUBWF   FSR1L,W
  34.     BTFSC   STATUS,Z                ; Si: Sale
  35.     RETURN
  36.     INCF    FSR1L,F                 ; No: Envia el proximo
  37.     GOTO Loopete
  38.  
  39.  
  40.  
  41.  
  42. ;***********************************************************************************************
  43. ;***************************** RUTINAS PARA MANDAR VALORES EN LCD ******************************
  44. ;***********************************************************************************************
  45.  
  46.  
  47.  
  48. NUMS:   dt 0x7C, 0x82, 0x82, 0x7C               ;0
  49.         dt 0x00, 0x84, 0xFE, 0x80               ;1
  50.         dt 0xC4, 0xA2, 0x92, 0x8C               ;2
  51.         dt 0x44, 0x92, 0x92, 0x6C               ;3
  52.         dt 0x30, 0x28, 0x24, 0xFE               ;4
  53.         dt 0x4E, 0x8A, 0x8A, 0x72               ;5
  54.         dt 0x7C, 0x92, 0x92, 0x64               ;6
  55.         dt 0x62, 0x12, 0x0A, 0x06               ;7
  56.         dt 0x6C, 0x92, 0x92, 0x6C               ;8
  57.         dt 0x4C, 0x92, 0x92, 0x7C               ;9

Solo para jugar un poco mas con los accesos indirectos nada mas, podria haber puesto un contador en ves de verificar las direcciones.
Tambien se me ocurrio implementar una  Tabla que contenga las direcciones de los registros a enviar y el orden, de esa forma los registros podian estar en cualquier valor, pero para hacerlo simple requeria de al menos 3 punteros o utilizar mas registros como para tener un "almacenamiento temporal" y luego volver a cargarlo. Aunque solo sirve para registros del primer banco, necesitaria un registro mas para hacerlo para todos los bancos. Ya que necesitaria 2 bytes para la direccion por cada registro


Código: ASM
  1. ;***********************************************************************************************
  2. ;************************ RUTINA PARA MOSTRAR VALOR ADC 8 BITS *********************************
  3. ;***********************************************************************************************  
  4. MUESTRA_VALOR
  5.  
  6.     BANKSEL ADC_VALUE               ; ME ASEGURO ESTAR EN BANCO DONDE ESTA ADC_VALUE (MI REGISTRO)
  7.     MOVF    ADC_VALUE,W             ; MOVEMOS ADC_VALUE A W PARA OBTENER 3 BYTES CON EL DATO
  8.  
  9.     CALL    CONVERSION_BCD          ; RUTINA DE CONVERISON BINARIO>>BCD
  10.  
  11.     MOVLW   HIGH(REG_A_ENVIAR)      ; Valor de la tabla en FSR1
  12.     CLRF    FSR1H              
  13.     MOVLW   LOW(REG_A_ENVIAR)
  14.     MOVWF   FSR1L
  15.  
  16. Loopete
  17.  
  18.     MOVIW   FSR1++                  ; Es 0? salgo, se termino
  19.     BTFSC   STATUS,Z
  20.     RETURN
  21.  
  22.     MOVWF   FSR1H_AUX               ; Dato recuperado desde W, valores de direccion de registros, guardo momentaneamente
  23.     MOVF    FSR1L                   ; Guardo FSR1L - Tabla
  24.     MOVWF   FSR1L_AUX               ; Seteo FSR1L - Registro
  25.     MOVF    FSR1H_AUX               ; Guardo FSR1H - Tabla
  26.     MOVWF   FSR1L                   ; Seteo FSR1H = 0x00
  27.     MOVF    FSR1H
  28.     MOVWF   FSR1H_AUX
  29.     CLRF    FSR1H
  30.  
  31.  
  32.     MOVLW   LOW(NUMS)               ; MUEVO LA DIRECCION DE LA TABLA NUMS (LOW)
  33.     MOVWF   FSR0L                   ; A MI REGISTRO FSR0L
  34.     MOVLW   HIGH(NUMS)              ; MUEVO LA DIRECCION DE LA TABLA NUMS (HIGH)
  35.     MOVWF   FSR0H                   ; AL REGISTRO FSR0H
  36.  
  37.     BCF     STATUS,C                ; Carry = 0, para la rotacion me aseguro
  38.     RLF     INDF1,W                 ; W = x*2
  39.     RLF     WREG,W                  ; W = x*2*2 = x*4
  40.     ADDWF   FSR0L,F                 ; Sumo a la base de la tabla para obtener el offset
  41.     BTFSC   STATUS,C                ; Correccion por si se excedio, una precaucion solo por si se puso en un borde la tabla
  42.     INCF    FSR0H,F
  43.  
  44.     MOVLW   .4                      ; NUMERO DE BYTES A TRANSMITIR
  45.     CALL    MENSAJE_X_BYTES         ; LLAMO A SUBRUTINA DE TRANSMISION DE BYTES
  46.  
  47.     CLRW                            ; Envio el 0x00 que habia que enviar siempre al final, es esto, o ocupar "9 bytes", en realiadad 9 palabras de memoria mas mas en tabla
  48.     CALL    DATO_SPI
  49.  
  50.     MOVF    FSR1L_AUX               ; Recupero el valor de la tabla anterior
  51.     MOVWF   FSR1L
  52.     MOVF    FSR1H_AUX
  53.     MOVWF   FSR1H
  54.  
  55.     GOTO Loopete                    ; Repito hasta que sea 0x00 y salga
  56.  
  57.  
  58.  
  59.  
  60. ;***********************************************************************************************
  61. ;***************************** RUTINAS PARA MANDAR VALORES EN LCD ******************************
  62. ;***********************************************************************************************
  63.  
  64.  
  65. REG_A_ENVIAR:
  66.         dt CENTENAS,DECENAS,UNIDADES,0x00
  67.  
  68. NUMS:   dt 0x7C, 0x82, 0x82, 0x7C               ;0
  69.         dt 0x00, 0x84, 0xFE, 0x80               ;1
  70.         dt 0xC4, 0xA2, 0x92, 0x8C               ;2
  71.         dt 0x44, 0x92, 0x92, 0x6C               ;3
  72.         dt 0x30, 0x28, 0x24, 0xFE               ;4
  73.         dt 0x4E, 0x8A, 0x8A, 0x72               ;5
  74.         dt 0x7C, 0x92, 0x92, 0x64               ;6
  75.         dt 0x62, 0x12, 0x0A, 0x06               ;7
  76.         dt 0x6C, 0x92, 0x92, 0x6C               ;8
  77.         dt 0x4C, 0x92, 0x92, 0x7C               ;9

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #44 en: 11 de Febrero de 2016, 02:57:45 »
Gracias KillerJC en unos minutos más lo implementó para saber como queda. Dos preguntas más. Como me recomiendas leer la frecuencia a la que esta entrando la señal del ADC? Y la otra pregunta es sobre como podría implementar una "ROM" con todos los caracteres ASCII? Digo si es posible