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

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #45 en: 11 de Febrero de 2016, 03:12:01 »
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

A no ser que tengas una senoidal y quieras medir eso es la unica razon por la que mediria "frecuencia". Si es una señal aleatoria se complica ( y no se por que lo harias realmente).
Creo que lo mejor es un circuito externo ( 2 diodos de clamping + resistencia ) y que observar cuando pasa de 1 a 0 y con un timer ver el tiempo del mismo, o podes hacer uso del CCP.

Respecto a los caracteres ASCII, si es posible, pero te va a llevar tiempo hacerlos todos o casi todos. Y luego los vas a tener que poner con .dt al igual que se hizo lo demas. Incluso los podes poner en una direccion especifica con un ORG antes. Eso depende de vos nomas. Y recorda que te va a consumir bastante flash.
Pero por que hacerlo uno mismo cuando podria sacarlo de otro lado?

http://sunge.awardspace.com/glcd-sd/node4.html

Agregar los .dt y quitar todo lo demas. WIN, tenes tu tabla ya realizada :P obviamente que comienza de 0x20 ( 32 ), asi que si usas la tabla esa al valor a escribir deberias restarle 0x20 asi coincide con los de la tabla :)
« Última modificación: 11 de Febrero de 2016, 18:04:12 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #46 en: 26 de Febrero de 2016, 03:57:04 »
jejej disculpa la demora KillerJC deberás que estas lleno de mucha información muy interesante. La verdad no he tenido mucho tiempo libre para seguir practicando, y bueno respecto a los caracteres eso haré para ya tener listos todos. Sobre el calculo de la frecuencia realmente solo lo decia pensado en alguna aplicación interesante como hacer un mini osciloscopio pero creo que es mas dificil. Alguna idea que tengas para seguir trabajando con esta LCD Nokia? Este PIC me ha gustado mucho respecto algunos otros mas maduros.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #47 en: 26 de Febrero de 2016, 04:02:17 »
Para complementar un poco este post. Me decidi a manejar ahora una LCD 1602 que básicamente muchos conocen, debido a la restriccion que hay en cuanto el numero de pines hice la interfaz de 4 bits. No me rompi la cabeza mucho para adecuar la muy famosa libreria de LCD 4BIT. Aqui el código de la Librería:

Código: ASM
  1. CBLOCK
  2. LCD_DATO
  3. LCD_GuardaDato
  4. LCD_Auxiliar1
  5. LCD_Auxiliar2
  6. ENDC
  7.  
  8. CHAR_X_LINEA    EQU     .16             ; Número de caracteres por línea de la pantalla.
  9.  
  10. #DEFINE  RS             PORTC,0
  11. #DEFINE  RE             PORTC,1
  12. #DEFINE  LCD_BUS        PORTB
  13.  
  14. INI_LCD
  15. ;*********************************************************
  16.     BANKSEL T1CON
  17.     MOVLW   B'00110000'             ; CONFIGURO TMR1
  18.     MOVWF   T1CON                   ; PARA RETARDOS
  19. ;*********************************************************
  20.        
  21.     BCF         RE                      ; DESHABILITAMOS PIN
  22.     BCF         RS                      ; ACTIVAMOS MODO COMANDO PONIENDO RS EN 0
  23.     CALL        RET_10ms                ; RETARDO PARA ESTABILIZACIÓN LCD
  24.     MOVLW       B'00110000'             ;
  25.     CALL        LCD_WRITE               ; ESCRIBIMOS DATO EN LCD
  26.     CALL        RET_5ms
  27.     MOVLW       B'00110000'    
  28.     CALL        LCD_WRITE
  29.     CALL        RET_100us
  30.     MOVLW       B'00110000'    
  31.     CALL        LCD_WRITE
  32.     CALL        RET_100us               ; Este retardo es necesario para simular en PROTEUS.
  33.     MOVLW       B'00100000'             ; Interface de 4 bits.
  34.     CALL        LCD_WRITE
  35.     CALL        RET_100us               ; Este retardo es necesario para simular en PROTEUS.
  36.     CALL        LCD_2Lineas4Bits5x7     ; LCD de 2 líneas y caracteres de 5x7 puntos.
  37.     CALL        LCD_CLEAR               ; Pantalla encendida y limpia. Cursor al principio
  38.     CALL        LCD_C_OFF               ; de la línea 1. Cursor apagado.
  39.     CALL        LCD_CursorIncr          ; Cursor en modo incrementar.
  40.     RETURN
  41. LCD_WRITE
  42.     ANDLW       B'11110000'             ; Se queda con el nibble alto del dato que es el
  43.     MOVWF       LCD_DATO                ; que hay que enviar y lo guarda.
  44.     MOVF        LCD_BUS,W               ; Lee la información actual de la parte baja
  45.     ANDLW       B'00001111'             ; del Puerto B, que no se debe alterar.
  46.     IORWF       LCD_DATO,F              ; Enviará la parte alta del dato de entrada
  47.     MOVF        LCD_DATO,W              ; Recupera el dato a enviar.
  48.     MOVWF       LCD_BUS                 ; Envía el dato al módulo LCD.
  49.     BSF         RE                      ; Permite funcionamiento del LCD mediante un pequeño
  50.     BCF         RE                      ; pulso y termina impidiendo el funcionamiento del LC
  51.     RETURN
  52. LCD_CursorIncr                          ; Cursor en modo incrementar.
  53.     MOVLW       B'00000110'
  54.     BRA         LCD_CMD
  55. LCD_L1                                                  ; Cursor al principio de la Línea 1.
  56.     MOVLW       B'10000000'                             ; Dirección 00h de la DDRAM
  57.     BRA         LCD_CMD
  58. LCD_L2                                                  ; Cursor al principio de la Línea 2.
  59.     MOVLW       B'11000000'                             ; Dirección 40h de la DDRAM
  60.     BRA         LCD_CMD
  61. LCD_L3                                                  ; Cursor al principio de la Línea 3
  62.     MOVLW       B'10010100'                             ; Dirección 14h de la DDRAM
  63.     BRA         LCD_CMD
  64. LCD_L4                                                  ; Cursor al principio de la Línea 4
  65.     MOVLW       B'11010100'                             ; Dirección 54h de la DDRAM
  66.     BRA         LCD_CMD
  67. LCD_PosicionLinea1                                      ; Cursor a posición de la Línea 1, a partir de la
  68.     IORLW       b'10000000'                             ; dirección 00h de la DDRAM más el valor del
  69.     BRA         LCD_CMD         ; registro W.
  70. LCD_PosicionLinea2                                      ; Cursor a posición de la Línea 2, a partir de la
  71.     IORLW       b'11000000'                             ; dirección 40h de la DDRAM más el valor del
  72.     BRA         LCD_CMD         ; registro W.
  73. LCD_OFF                                                         ; Pantalla apagada.
  74.     MOVLW       B'00001000'
  75.     BRA         LCD_CMD
  76. LCD_C_ON                                                ; Pantalla encendida y cursor encendido.
  77.     MOVLW       B'00001110'
  78.     BRA         LCD_CMD
  79. LCD_C_OFF                                               ; Pantalla encendida y cursor apagado.
  80.     MOVLW       B'00001100'
  81.     BRA         LCD_CMD
  82. LCD_CLEAR                                                       ; Borra toda la pantalla, memoria DDRAM y pone el
  83.     MOVLW       B'00000001'                             ; cursor a principio de la línea 1.
  84.     BRA LCD_CMD
  85. LCD_2Lineas4Bits5x7                                     ; Define la pantalla de 2 líneas, con caracteres
  86.     MOVLW       B'00101000'                             ; de 5x7 puntos y conexión al PIC mediante bus de
  87. LCD_CMD
  88.     BCF RS                              ; Activa el Modo Comando, poniendo RS=0.
  89.     BRA LCD_Envia
  90. ENVIAR_DATO
  91.     BSF RS                              ; Activa el "Modo Dato", poniendo RS=1.
  92.     CALL        LCD_CodigoCGROM                 ; Obtiene el código para correcta visualización.
  93. LCD_Envia
  94.     MOVWF       LCD_GuardaDato                  ; Guarda el dato a enviar.
  95.     CALL        LCD_WRITE                       ; Primero envía el nibble alto.
  96.     SWAPF       LCD_GuardaDato,W                ; Ahora envía el nibble bajo. Para ello pasa el
  97.                                                 ; nibble bajo del dato a enviar a parte alta del byte.
  98.     CALL        LCD_WRITE                       ; Se envía al visualizador LCD.
  99.     BTFSS       RS                              ; Debe garantizar una correcta escritura manteniendo
  100.     CALL        RET_1ms                         ; 2 ms en modo comando y 50 µs en modo cáracter.
  101.     CALL        RET_100us
  102.     RETURN     
  103. LCD_CodigoCGROM
  104.     MOVWF       LCD_DATO                                ; Guarda el valor del carácter y comprueba si es
  105. LCD_EnheMinuscula                                       ; un carácter especial.
  106.     SUBLW       'ñ'                                    ; ¿Es la "ñ"?
  107.     BTFSS       STATUS,Z
  108.     GOTO        LCD_EnheMayuscula               ; No es "ñ".
  109.     MOVLW       B'11101110'                             ; Código CGROM de la "ñ".
  110.     MOVWF       LCD_DATO
  111.     GOTO        LCD_FinCGROM
  112. LCD_EnheMayuscula
  113.     MOVF        LCD_DATO,W                              ; Recupera el código ASCII de entrada.
  114.     SUBLW       'Ñ'                                    ; ¿Es la "Ñ"?
  115.     BTFSS       STATUS,Z
  116.     GOTO        LCD_Grado                               ; No es "Ñ".
  117.     MOVLW       b'11101110'                             ; Código CGROM de la "ñ". (No hay símbolo para
  118.     MOVWF       LCD_DATO                                ; la "Ñ" mayúscula en la CGROM).
  119.     GOTO        LCD_FinCGROM   
  120. LCD_Grado
  121.     MOVF    LCD_DATO,W                          ; Recupera el código ASCII de entrada.
  122.     SUBLW       'º'                                    ; ¿Es el símbolo "º"?
  123.     BTFSS   STATUS,Z
  124.     GOTO    LCD_FinCGROM                        ; No es "º".
  125.     MOVLW   b'11011111'                         ; Código CGROM del símbolo "º".
  126.     MOVWF   LCD_DATO
  127. LCD_FinCGROM
  128.     MOVF        LCD_DATO,W                              ; En (W) el código buscado.
  129.     RETURN
  130. LCD_LineaEnBlanco
  131.     MOVLW   CHAR_X_LINEA
  132.     BRA     LCD_EnviaBlancos
  133. LCD_UnEspacioBlanco
  134.     MOVLW   .1
  135.     BRA     LCD_EnviaBlancos
  136. LCD_DosEspaciosBlancos
  137.     MOVLW   .2
  138.     BRA     LCD_EnviaBlancos
  139. LCD_TresEspaciosBlancos
  140.     MOVLW   .3
  141. LCD_EnviaBlancos
  142.     MOVWF   LCD_Auxiliar1                       ; (LCD_Auxiliar1) se utiliza como contador.
  143. LCD_EnviaOtroBlanco    
  144.     MOVLW       ' '                                             ; Esto es un espacio en blanco.
  145.     CALL        LCD_DATO                        ; Visualiza tanto espacios en blanco como se
  146.     DECFSZ      LCD_Auxiliar1,F                 ; haya cargado en (LCD_Auxiliar1).
  147.     GOTO        LCD_EnviaOtroBlanco
  148.     RETURN
  149.  
  150. ; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
  151. ;
  152. ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
  153. ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
  154. ;
  155. ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
  156. ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
  157. ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
  158. ;
  159. ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
  160. LCD_Byte
  161.         movwf   LCD_Auxiliar2                   ; Guarda el valor de entrada.
  162.         andlw   b'11110000'                             ; Analiza si el nibble alto es cero.
  163.         btfss   STATUS,Z                                ; Si es cero lo apaga.
  164.         goto    LCD_VisualizaAlto               ; No es cero y lo visualiza.
  165.         movlw   ' '                                             ; Visualiza un espacio en blanco.
  166.         call    LCD_DATO
  167.         goto    LCD_VisualizaBajo
  168.  
  169. LCD_ByteCompleto
  170.         movwf   LCD_Auxiliar2                   ; Guarda el valor de entrada.
  171. LCD_VisualizaAlto
  172.         swapf   LCD_Auxiliar2,W                 ; Pone el nibble alto en la parte baja.
  173.         call    LCD_Nibble                              ; Lo visualiza.
  174. LCD_VisualizaBajo
  175.         movf    LCD_Auxiliar2,W                 ; Repite el proceso con el nibble bajo.
  176. LCD_Nibble
  177.         andlw   b'00001111'                             ; Se queda con la parte baja.
  178.         movwf   LCD_Auxiliar1                   ; Lo guarda.
  179.         sublw   0x09                                    ; Comprueba si hay que representarlo con letra.
  180.         btfss   STATUS,C       
  181.         goto    LCD_EnviaByteLetra
  182.         movf    LCD_Auxiliar1,W
  183.         addlw   '0'                                             ; El número se pasa a carácter ASCII sumándole
  184.         goto    LCD_FinVisualizaDigito  ; el ASCII del cero y lo visualiza.
  185. LCD_EnviaByteLetra
  186.         movf    LCD_Auxiliar1,W
  187.         addlw   'A'-0x0A                                ; Sí, por tanto, se le suma el ASCII de la 'A'.
  188. LCD_FinVisualizaDigito
  189.         goto    LCD_DATO                        ; Y visualiza el carácter. Se hace con un "goto"
  190.                                                                         ; para no sobrecargar la pila.
  191.  
  192. RET_37us
  193.         BCF     PIR1,TMR1IF
  194.         MOVLW   0XFF
  195.         MOVWF   TMR1H
  196.         MOVLW   0XDC
  197.         MOVWF   TMR1L
  198.         BSF     T1CON,TMR1ON
  199.         BTFSS   PIR1,TMR1IF
  200.         GOTO    $-1
  201.         BCF     T1CON,TMR1ON
  202.         RETURN
  203. RET_100us
  204.         BCF     PIR1,TMR1IF
  205.         MOVLW   0XFF
  206.         MOVWF   TMR1H
  207.         MOVLW   0X9C
  208.         MOVWF   TMR1L
  209.         BSF     T1CON,TMR1ON
  210.         BTFSS   PIR1,TMR1IF
  211.         GOTO    $-1
  212.         BCF     T1CON,TMR1ON
  213.         RETURN
  214. RET_1ms
  215.         BCF     PIR1,TMR1IF
  216.         MOVLW   0XFC
  217.         MOVWF   TMR1H
  218.         MOVLW   0X18
  219.         MOVWF   TMR1L
  220.         BSF     T1CON,TMR1ON
  221.         BTFSS   PIR1,TMR1IF
  222.         GOTO    $-1
  223.         BCF     T1CON,TMR1ON
  224.         RETURN
  225. RET_5ms
  226.         BCF     PIR1,TMR1IF
  227.         MOVLW   0XEC
  228.         MOVWF   TMR1H
  229.         MOVLW   0X78
  230.         MOVWF   TMR1L
  231.         BSF     T1CON,TMR1ON
  232.         BTFSS   PIR1,TMR1IF
  233.         GOTO    $-1
  234.         BCF     T1CON,TMR1ON
  235.         RETURN
  236. RET_10ms
  237.         BCF     PIR1,TMR1IF
  238.         MOVLW   0XD8
  239.         MOVWF   TMR1H
  240.         MOVLW   0XF0
  241.         MOVWF   TMR1L
  242.         BSF     T1CON,TMR1ON
  243.         BTFSS   PIR1,TMR1IF
  244.         GOTO    $-1
  245.         BCF     T1CON,TMR1ON
  246.         RETURN
  247. RET_50ms
  248.         BCF     PIR1,TMR1IF
  249.         MOVLW   0X3C
  250.         MOVWF   TMR1H
  251.         MOVLW   0XB0
  252.         MOVWF   TMR1L
  253.         BSF     T1CON,TMR1ON
  254.         BTFSS   PIR1,TMR1IF
  255.         GOTO    $-1
  256.         BCF     T1CON,TMR1ON
  257.         RETURN
  258. RET_100ms
  259.         BCF     PIR1,TMR1IF
  260.         MOVLW   0X3C
  261.         MOVWF   TMR1H
  262.         MOVLW   0XB0
  263.         MOVWF   TMR1L
  264.         BSF     T1CON,TMR1ON
  265.         BTFSS   PIR1,TMR1IF
  266.         GOTO    $-1
  267.         BCF     T1CON,TMR1ON
  268.         BCF     PIR1,TMR1IF
  269.         MOVLW   0X3C
  270.         MOVWF   TMR1H
  271.         MOVLW   0XB0
  272.         MOVWF   TMR1L
  273.         BSF     T1CON,TMR1ON
  274.         BTFSS   PIR1,TMR1IF
  275.         GOTO    $-1
  276.         BCF     T1CON,TMR1ON
  277.         RETURN
  278. RET_500ms
  279.         MOVLW   .5
  280.         MOVWF   TIME_AUX
  281.         CALL    RET_100ms
  282.         DECFSZ  TIME_AUX,F
  283.         GOTO    $-2
  284.         RETURN
  285. RET_1s
  286.         MOVLW   .10
  287.         MOVWF   TIME_AUX
  288.         CALL    RET_100ms
  289.         DECFSZ  TIME_AUX,F
  290.         GOTO    $-2
  291.         RETURN

Como se ve al final, genere unas rutinas para retardos con el timer 1. Fueron sustituidos en la libreria. Y para empezar este pequeño código de prueba.

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.     TIME_AUX
  7.     LCD_AUX
  8.     ENDC
  9. ;***********************************************************************************************
  10. ;********************************* VECTOR DE RESET DEL PIC *************************************
  11. ;***********************************************************************************************
  12.     ORG     0X00
  13.     GOTO    CONFIGURA_PIC
  14. ;***********************************************************************************************
  15. ;***************************** VECTOR DE INTERRUPCION DEL PIC **********************************
  16. ;***********************************************************************************************
  17.     ORG     0X04
  18.     RETURN
  19. ;***********************************************************************************************
  20. ;********************************* CONFIGURACION DEL PIC ***************************************
  21. ;***********************************************************************************************
  22.  CONFIGURA_PIC
  23.     BANKSEL OSCCON
  24.     MOVLW   B'11111011'
  25.     MOVWF   OSCCON
  26.     MOVLW   B'00011111'
  27.     MOVWF   OSCTUNE
  28. ;***********************************************************************************************
  29. ;*************************** CONFIGURACION DE PUERTOS DEL PIC **********************************
  30. ;***********************************************************************************************
  31.     BANKSEL PORTA                   ; ME COLOCO EN EL BANCO DE LOS PORTX
  32.     CLRF    PORTA                   ; LIMPIO PINES ASIGNADOS A PORTA
  33.     CLRF    PORTB                   ; LIMPIO PINEAS ASIGNADOS A PORTB
  34.     CLRF    PORTC                   ; LIMPIO PINEAS ASIGNADOS A PORTC
  35.     BANKSEL LATA                    ; NOS DIRIGIMOS A BANCO DE MEMORIA DONDE ESTA LATX
  36.     CLRF    LATA                    ; LIMPIAMOS LATCH DE PUERTO A
  37.     CLRF    LATB                    ; LIMPIAMOS LATCH DE PUERTO B
  38.     CLRF    LATC                    ; LIMPIAMOS LATCH DE PUERTO C
  39.     BANKSEL ANSELA                  ; ME HUBICO EN BANCO DONDE SE ENCUENTRA ANSELX
  40.     CLRF    ANSELA                  ; LIMPIO REGISTROS ADC ASIGNADOS A PORTA
  41.     CLRF    ANSELB                  ; LIMPIO REGISTROS ADC ASIGNADOS A PORTB
  42.     CLRF    ANSELC                  ; LIMPIO REGISTROS ADC ASIGNADOS A PORTC
  43.     BANKSEL TRISA                   ; ME HUBICO EN BANCO QUE CONTIENE A TRISX
  44.     CLRF    TRISA                   ; CONFIGURO PORTA COMO SALIDAS
  45.     CLRF    TRISB                   ; CONFIGURO PORTB COMO SALIDAS
  46.     CLRF    TRISC                   ; CONFIGURO PORTC COMO SALIDAS
  47. ;;CONFIGURAMOS ADC
  48. ;    BANKSEL ADCON1          ; El mismo que el de TRISx
  49. ;    MOVLW   B'01100000'
  50. ;    MOVWF   ADCON1
  51. ;    MOVLW   B'00000001'     ;Select channel AN0
  52. ;    MOVWF   ADCON0          ;Turn ADC On  
  53. ;    BSF     TRISA,0    
  54. ;    BANKSEL ANSELA          ;
  55. ;    BSF     ANSELA,0
  56.  
  57.    
  58.    
  59. ;***************************************************************************************************
  60. ;********************** DEFINICION DE PINES Y BUS DE CONTROL LCD 16X2 ******************************
  61. ;***************************************************************************************************    
  62.         CALL    INI_LCD
  63.  PRINCIPAL
  64.         CALL    LCD_L1
  65.         CALL    MENSAJE_UNO
  66.         CALL    RET_1s
  67.         CALL    LCD_L2
  68.         CALL    MENSAJE_DOS
  69.         CALL    RET_1s
  70.         CALL    LCD_CursorIncr
  71.         GOTO    PRINCIPAL
  72.        
  73. MENSAJE_UNO
  74.         MOVLW   HIGH(MENSAJE_PIC)
  75.         MOVWF   FSR0H
  76.         MOVLW   LOW(MENSAJE_PIC)
  77.         MOVWF   FSR0L
  78.         GOTO    SENDING_TEXT
  79. MENSAJE_DOS
  80.         MOVLW   HIGH(MENSAJE_PIC2)
  81.         MOVWF   FSR0H
  82.         MOVLW   LOW(MENSAJE_PIC2)
  83.         MOVWF   FSR0L
  84.         GOTO    SENDING_TEXT
  85. SENDING_TEXT
  86.         CALL    RET_100ms
  87.         MOVIW   FSR0++
  88.         CALL    ENVIAR_DATO
  89.         MOVIW   [FSR0]
  90.         BTFSS   STATUS,Z
  91.         BRA     SENDING_TEXT
  92.         RETURN
  93.  
  94. ;***************************************************************************************************
  95. ;******************************* ZONA DE DECLARACION DE TABLAS PARA DATOS **************************
  96. ;***************************************************************************************************  
  97.  
  98.         MENSAJE_PIC:  dt "Hola Amigos del Foro", 0X00
  99.         MENSAJE_PIC2: dt "Prueba de Tablas", 0X00
  100.  
  101.   #INCLUDE<LCD_4BIT.INC>
  102.  
  103.     END



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #48 en: 26 de Febrero de 2016, 04:18:46 »
Te quedo muy bueno. Felicidades!

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #49 en: 29 de Febrero de 2016, 23:11:26 »
Bueno gracias KillerJC es muy bueno recibir una felicitacion de tu parte.  ;-) ahora trabajare en un pequeño proyecto donde debo implementar un menu de configuración. Hice el código para poder navegar solo con dos opciones.

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.     TIME_AUX
  7.     LCD_AUX
  8.     C1
  9.     C2
  10.     ENDC
  11. ;***********************************************************************************************
  12. ;********************************* VECTOR DE RESET DEL PIC *************************************
  13. ;***********************************************************************************************
  14.     ORG     0X00
  15.     GOTO    CONFIGURA_PIC
  16. ;***********************************************************************************************
  17. ;***************************** VECTOR DE INTERRUPCION DEL PIC **********************************
  18. ;***********************************************************************************************
  19.     ORG     0X04
  20.     RETURN
  21. ;***********************************************************************************************
  22. ;********************************* CONFIGURACION DEL PIC ***************************************
  23. ;***********************************************************************************************
  24.  CONFIGURA_PIC
  25.     BANKSEL OSCCON
  26.     MOVLW   B'11111011'
  27.     MOVWF   OSCCON
  28.     MOVLW   B'00011111'
  29.     MOVWF   OSCTUNE
  30. ;***********************************************************************************************
  31. ;*************************** CONFIGURACION DE PUERTOS DEL PIC **********************************
  32. ;***********************************************************************************************
  33.     BANKSEL PORTA                   ; ME COLOCO EN EL BANCO DE LOS PORTX
  34.     CLRF    PORTA                   ; LIMPIO PINES ASIGNADOS A PORTA
  35.     CLRF    PORTB                   ; LIMPIO PINEAS ASIGNADOS A PORTB
  36.     CLRF    PORTC                   ; LIMPIO PINEAS ASIGNADOS A PORTC
  37.     BANKSEL LATA                    ; NOS DIRIGIMOS A BANCO DE MEMORIA DONDE ESTA LATX
  38.     CLRF    LATA                    ; LIMPIAMOS LATCH DE PUERTO A
  39.     CLRF    LATB                    ; LIMPIAMOS LATCH DE PUERTO B
  40.     CLRF    LATC                    ; LIMPIAMOS LATCH DE PUERTO C
  41.     BANKSEL ANSELA                  ; ME HUBICO EN BANCO DONDE SE ENCUENTRA ANSELX
  42.     CLRF    ANSELA                  ; LIMPIO REGISTROS ADC ASIGNADOS A PORTA
  43.     CLRF    ANSELB                  ; LIMPIO REGISTROS ADC ASIGNADOS A PORTB
  44.     CLRF    ANSELC                  ; LIMPIO REGISTROS ADC ASIGNADOS A PORTC
  45.     BANKSEL TRISA                   ; ME HUBICO EN BANCO QUE CONTIENE A TRISX
  46.     CLRF    TRISA                   ; CONFIGURO PORTA COMO SALIDAS
  47.     CLRF    TRISB                   ; CONFIGURO PORTB COMO SALIDAS
  48.     CLRF    TRISC                   ; CONFIGURO PORTC COMO SALIDAS
  49.    
  50.     BSF     TRISC,7                 ; PINES DEFINIDOS COMO ENTRADA
  51.     BSF     TRISC,6                 ; CORRESPONDIENTE A BOTONES USUARIO
  52.    
  53.    
  54. #DEFINE UP      PORTC,7             ; BOTON PARA INCREMENTAR
  55. #DEFINE DOWN    PORTC,6             ; BOTON PARA DECREMENTAR
  56.  
  57.     CURSOR  EQU B'01111110'
  58.    
  59.    
  60. ;***************************************************************************************************
  61. ;********************** DEFINICION DE PINES Y BUS DE CONTROL LCD 16X2 ******************************
  62. ;***************************************************************************************************    
  63.         CALL    INI_LCD
  64. MAIN_SCREEN
  65.         MOVLW   CURSOR
  66.         MOVWF   C1
  67.         CALL    LCD_L1MENU
  68.         CALL    MENSAJE_UNO
  69.         CALL    LCD_L2MENU
  70.         CALL    MENSAJE_DOS
  71.         CALL    WRITE_CURSOR
  72. PRINCIPAL
  73.         BTFSS   UP
  74.         BRA     CAMBIA_CURSOR
  75.         BTFSS   DOWN
  76.         BRA     CAMBIA_CURSOR
  77.         GOTO    PRINCIPAL
  78. CAMBIA_CURSOR
  79.         BTFSS   UP
  80.         GOTO    CAMBIA_CURSOR
  81.         BTFSS   DOWN
  82.         GOTO    CAMBIA_CURSOR
  83.         MOVF    C1,W
  84.         SUBLW   CURSOR
  85.         BTFSS   STATUS,Z
  86.         GOTO    CAMBIA_C1
  87.         MOVLW   ' '
  88.         MOVWF   C1
  89.         MOVLW   CURSOR
  90.         MOVWF   C2
  91.         CALL    WRITE_CURSOR
  92.         GOTO    PRINCIPAL
  93. CAMBIA_C1
  94.         MOVLW   CURSOR
  95.         MOVWF   C1
  96.         MOVLW   ' '
  97.         MOVWF   C2
  98.         CALL    WRITE_CURSOR
  99.         GOTO    PRINCIPAL
  100. WRITE_CURSOR
  101.         CALL    LCD_L1
  102.         MOVF    C1,W
  103.         CALL    ENVIAR_DATO
  104.         CALL    LCD_L2
  105.         MOVF    C2,W
  106.         CALL    ENVIAR_DATO
  107.         RETURN
  108.        
  109. MENSAJE_UNO
  110.         MOVLW   HIGH(MENSAJE_PIC)
  111.         MOVWF   FSR0H
  112.         MOVLW   LOW(MENSAJE_PIC)
  113.         MOVWF   FSR0L
  114.         GOTO    SENDING_TEXT
  115. MENSAJE_DOS
  116.         MOVLW   HIGH(MENSAJE_PIC2)
  117.         MOVWF   FSR0H
  118.         MOVLW   LOW(MENSAJE_PIC2)
  119.         MOVWF   FSR0L
  120.         GOTO    SENDING_TEXT
  121. SENDING_TEXT
  122.         MOVIW   FSR0++
  123.         CALL    ENVIAR_DATO
  124.         MOVIW   [FSR0]
  125.         BTFSS   STATUS,Z
  126.         BRA     SENDING_TEXT
  127.         RETURN
  128.  
  129. ;***************************************************************************************************
  130. ;******************************* ZONA DE DECLARACION DE TABLAS PARA DATOS **************************
  131. ;***************************************************************************************************  
  132.  
  133. ;        MENSAJE_PIC:  dt "Absoluto x 2 Ch", 0X00
  134. ;       MENSAJE_PIC2: dt "Diferencial", 0X00
  135.        
  136.         MENSAJE_PIC:  dt "Opcion 1", 0X00
  137.         MENSAJE_PIC2: dt "Opcion 2", 0X00
  138.  
  139.   #INCLUDE<LCD_4BIT.INC>
  140.  
  141.     END

Saludos

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #50 en: 16 de Marzo de 2016, 22:33:20 »
Bueno pues me quiero hacer un espacio, esta vez para diseñarme una tarjeta entrenadora para este PIC. Entonces quisiera que me dieran su punto de vista que puedo implementar?

Pensaba lo siguiente, electronica de alimentacion basica, conexion para LCD Nokia 5110 y LCD 16x2. Pero la pregunta es que mas puedo incorporar?


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #51 en: 16 de Marzo de 2016, 23:19:16 »
La verdad que yo solo hice una ves una tarjeta entrenadora. Luego me di cuenta de lo limitado que era y ahora la tengo guardada y no la toque nunca mas. Limitado en el sentido que no se adapta a todas las situaciones sino que terminas rebuscandotela para poder hacer funcionar algo que tal ves si tuvieras la libertad de acomodar los pines seria muy facil.
No quiero decir que no sirva, muchos aca han realizado tarjetas entrenadoras para varios PICs, algunos ejemplos creo que Suky hizo una, LABmouse otra dsRRBOARD, y hay miles mas que han usado una en proyectos y me parece excelente. Recuerdo una que tenia CAN/ LIN / etc etc etc, creo que era de MGLSOFT.

Pero al menos mi intento no me gusto para nada ejeje. Y termina siendo mas rapido poner un par de cablecitos en el protoboard.

Asi que no te podria ayudar demasiado en eso.

Si tiene UART tiene que tener una salida UART, ya que hay muchas cosas UART, a no ser que incorpores algunas en la placa y las demas lo dejes aparte.
Si tiene I2C podes conectar muchas cosas por I2C, esta esta mucho mejor por que podes poner lo que quieras que se maneje por I2C y dejar un conector para agregar en cualquier caso.
SPI Comparte normalmente con I2C, asi que en ese sentido lo veo un poco mas complejo tener los 2 juntos, a no ser que pueda remapearse el SPI a otro pin que no sea I2C.
Tener salidas de puertos al exterior.

Recuerdo que la placa que habia realizado ( encima la habia hecho con bastantes errores ) podia con jumpers pasar de leds a jumpers y 2 canales con potenciometros + 1 con un pin que podia tomar de afuera. Todo eso llevo a una placa bastante grande y con muchas muchas vias soldadas todas a mano, en un laburo para nada lindo.

EDIT: lo unico que sobrevivio fue un video:
La placa supereior izquierda posee simplemente un boton de reset, cristal para el oscilador, cristal 32Khz para timer1 + 1 pin de GND para conectar la masa del osciloscopio. Todos los demas conectores son los puertos, el cual tienen ademas salidas de tension +5V,+3.3V y GND. La hice para conectarle el dsPIC33FJ32MC202 que tengo y un PIC32MX795L512 ( o algo asi eran, no recuerdo bien ). La de la derecha es la que comentaba. Creo que esa fue una prueba de la interrupcion del timer.

Pero bueno eso fue hace 5 años atras, cuando recien retomaba los PICs ya que hacia mucho que no los tocaba, y cuando pedi ayuda sobre los dsPIC en ASM y nadie ayudo xD jeje, que momentos tristes  :(
http://www.todopic.com.ar/foros/index.php?topic=35392.msg294820#msg294820
Eso me paso por aficionado al ASM y bueno eso hace que no quiero que nadie se quede sin una respuesta al menos ( aunque sea una respuesta pobre ).
« Última modificación: 16 de Marzo de 2016, 23:31:18 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #52 en: 01 de Abril de 2016, 05:05:38 »
 :shock: Killer JC tenías toda la razón sobre este entrenador que estaba planeando por ahí hice dos o tres intentos diferentes pero no me convencieron ya que cada uno lo hice pensando en aplicaciones distintas Jaja mejor seguiré complementando más este post con algunos ejemplos.

Bueno ya encarrerados con SPI quisiera pedir tu opinión sobre que otros dispositivos con este protocolo puedo hacer funcionar, verás me ha llamado mucho la atención manejar memorias SD con este micro, no he leído mucho al respecto pero te pregunto de acuerdo a tu experiencia que tan complejo es hacerlo en Asm? Y también si el micro tiene suficiente memoria para poder hacer lecturas y escrituras de la SD?

Así mismo me gustaría me recomendaras otro dispositivo interesante para usarlo con SPI?


Muchas gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #53 en: 01 de Abril de 2016, 06:04:06 »
Bueno ya encarrerados con SPI quisiera pedir tu opinión sobre que otros dispositivos con este protocolo puedo hacer funcionar, verás me ha llamado mucho la atención manejar memorias SD con este micro, no he leído mucho al respecto pero te pregunto de acuerdo a tu experiencia que tan complejo es hacerlo en Asm? Y también si el micro tiene suficiente memoria para poder hacer lecturas y escrituras de la SD?

Así mismo me gustaría me recomendaras otro dispositivo interesante para usarlo con SPI?

Si solo vas a grabar la SD como si fuera una memoria comun, deberias investigar como es la rutina de inicializacion de la SD para que funcione con SPI ( creo que lo podes sacar de cualquier libreria FAT ) y luego grabar directamente (no recuerdo si hay algo mas que hacer aca), ya que implementar FAT en ASM realmente no le veo sentido, seria complicarse demasiado para algo que usando C lo tendrias realizado. Y si lo haces luego te sirva unicamente para ese solo micro, o tengas que implementar muchisimos cambios para llevarlo a otro, lo cual deja de ser viable gastarse cientos de horas en eso. Incluso si lo haces en C , lo compilas y luego lo "mejoras" desde alli.

Respecto a la memoria del micro son 2 , el mayor limitador es la Flash, y la otra es la RAM, para poder crear un buffer grande y continuo.
Que ese PIC lo tiene un poco mas facil, pero como decia implementar FAT creo que seria un suicidio jeje. Si grabarlo en crudo.

Y dispositivos con SPI no se realmente, hay muchos y no se me ocurre ninguno. Ademas hay que ver que conseguis por que tal ves supongamos un acelerometro lo conseguis pero posee interfaz I2C, a pesar que exista uno con SPI.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #54 en: 07 de Abril de 2016, 04:23:49 »
Que tal, amigos. Bueno el planteamiento es el siguiente:

Para la complementación de este post deseo implementar un lector de temperatura. Después de hacerlo para seguir manejando SPI comenzare con la uSD como le había comentado a KillerJC. Bueno como tengo a la mano un MAX31855J y Termopar J, son los que deseo implementar. Anteriormente con otro micro ya lo había realizado con un SPI por software tratando bit a bit, en vista de que manejarlo vía hardware es mucho mejor implemente el siguiente código:

Código: ASM
  1. GET_TEMP1
  2.         CLRF    BYTE1
  3.         CLRF    BYTE2
  4.         CLRF    BYTE3
  5.         CLRF    BYTE4
  6.         BANKSEL SSP1BUF
  7.         CLRF    SSP1BUF
  8.         BANKSEL PIR1
  9.         BCF     PIR1,SSP1IF
  10.         BCF     MAX1
  11.         BTFSS   PIR1,SSP1IF
  12.         GOTO    $-1
  13.         BCF     PIR1,SSP1IF
  14.         BANKSEL SSP1BUF
  15.         MOVF    SSP1BUF,W
  16.         BANKSEL BYTE1
  17.         MOVWF   BYTE1
  18.  
  19.         BANKSEL SSP1BUF
  20.         CLRF    SSP1BUF
  21.         BANKSEL PIR1
  22.         BCF     PIR1,SSP1IF
  23.         BTFSS   PIR1,SSP1IF
  24.         GOTO    $-1
  25.         BCF     PIR1,SSP1IF
  26.         BANKSEL SSP1BUF
  27.         MOVF    SSP1BUF,W
  28.         BANKSEL BYTE2
  29.         MOVWF   BYTE2
  30.        
  31.         BANKSEL SSP1BUF
  32.         CLRF    SSP1BUF
  33.         BANKSEL PIR1
  34.         BCF     PIR1,SSP1IF
  35.         BTFSS   PIR1,SSP1IF
  36.         GOTO    $-1
  37.         BCF     PIR1,SSP1IF
  38.         BANKSEL SSP1BUF
  39.         MOVF    SSP1BUF,W
  40.         BANKSEL BYTE3
  41.         MOVWF   BYTE3
  42.  
  43.         BANKSEL SSP1BUF
  44.         CLRF    SSP1BUF
  45.         BANKSEL PIR1
  46.         BCF     PIR1,SSP1IF
  47.         BTFSS   PIR1,SSP1IF
  48.         GOTO    $-1
  49.         BCF     PIR1,SSP1IF
  50.         BANKSEL SSP1BUF
  51.         MOVF    SSP1BUF,W
  52.         BANKSEL BYTE4
  53.         MOVWF   BYTE4
  54.        
  55.         BSF     MAX1
  56.        
  57.         MOVLW   '+'
  58.         MOVWF   SIGNO_AUX
  59.         BTFSS   BYTE1,7
  60.         GOTO    KEEP_WS1
  61.         MOVLW   '-'
  62.         MOVWF   SIGNO_AUX
  63.  
  64.         BCF     BYTE1,7
  65.         MOVF    BYTE1,W
  66.         MOVWF   TEMP_AUX
  67.         SWAPF   TEMP_AUX,F
  68.         BCF     TEMP_AUX,0
  69.         BCF     TEMP_AUX,1
  70.         BCF     TEMP_AUX,2
  71.         BCF     TEMP_AUX,3
  72.         MOVF    BYTE2,W
  73.         MOVLW   B'11110000'
  74.         ANDWF   BYTE2,F
  75.         SWAPF   BYTE2,F
  76.         MOVF    BYTE2,W
  77.         ADDWF   TEMP_AUX,F
  78.         MOVF    TEMP_AUX,W
  79.         RETURN

El punto es que si logro la lectura pero deseo me ayuden a obtener la temperatura real. En la simulación con proteus mis datos no coinciden para nada.

En la imagen anexa obtenida de la hoja de datos del MAX me dice que en los primeros 2 bytes tengo la temperatura del termopar bien con mi programa pretendo hacer lo siguiente:

BYTE1 = SIGNO + 7 BITS DE TEMPERATURA       
BYTE2= 4 BITS DE TEMPERATURA + 2 BITS DE DECIMALES + BIT RESERVADO + BIT FAULT

Dados estos primeros Bytes. Solo quiero primero obtener el Byte Bajo de temperatura que es donde encontrare temperaturas de 0 a 255°C

Para ello el procedimiento de acuerdo al código es:

- Pregunto por Signo, después limpio Bit 7 del Byte 1. Me quedan los 3 bits del Byte Alto de temperatura y los 4 bits altos del Byte Bajo
- Aplico un SWAPF para despues limpiar los bits correspondientes al Byte alto.
- Aplico una and con el Byte 2 y la literal b'11110000' para quedarme solo con el nible alto del byte 2 que segun yo es en realidad el nible bajo del Byte bajo de temperatura.
- Despues de la operacion and vuelvo a realizar un SWAP para cambiar los nibles y poder sumarlos directamente.

Bueno segun yo deberia quedarme al final el Byte Low de temperatura. Me queda un numero muy distante al de la simulacion. Las preguntas son:

¿Es correcto mi planteamiento?
¿Existe una forma mas corta para obtener ese byte?

Se que sonara extraño pero solo deseo poder leer de 0 a 250°C maximo por ello no me preocupan los bits altos.

Espero su apoyo colegas.

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #55 en: 07 de Abril de 2016, 06:59:35 »
No se donde esta el problema, personalmente lo haria de otra forma al envio/recepcion, con direccionamiento indirecto, con postincremento seria lo idea para tener un buffer, aunque bueno veo que estas borrando 2 veces sin sentido el flag, asi que quedaria algo asi:

Código: ASM
  1. BANKSEL SSP1BUF
  2.         CLRF    SSP1BUF
  3.         BANKSEL PIR1
  4.         BTFSS   PIR1,SSP1IF
  5.         GOTO    $-1
  6.         BCF     PIR1,SSP1IF          ; Aca borro el flag, no hace falta hacerlo 2 veces
  7.         BANKSEL SSP1BUF
  8.         MOVF    SSP1BUF,W
  9.         BANKSEL BYTE2
  10.         MOVWF   BYTE2

Lo recibido es:

- 1 bit de signo de Temperatura del sensor
- 13 bits de temperatura los cuales 2 son decimales, es decir 0000 0000 000,0 0
- 1 bit que es siempre 0
- 1 bit que deberia si o si ser 0, sino indica falla, es lo primero a ver.
- 1 bit de signo de temperatura interna del MAX
- 11 bits de temperatura interna del MAX, 4 son decimales. 0000 000,0 0000
- 1 bit que siempre es 0
- 3 bits mas que indican cuales fueron las fallas.


Entonces comenzando con el tratamiento lo primero es ver si existe una falla (bit 16 - Bit0 del 2do byte ). Luego tratarlo.

Código: ASM
  1. ANALIZAR_BYTES
  2.         BTFSC   BYTE2,0
  3.         GOTO    CON_FALLA
  4. SIN_FALLA
  5.  
  6.         ;Aca codigo para sacar ambas temperaturas.
  7.  
  8.         ; Primero temperatura interna que es la mas simple
  9.         ; En el segundo byte se encuentra el signo y el entero de esta misma
  10.         MOVLW   '+'
  11.         BTFSC   BYTE3,7
  12.         MOVLW   '-'
  13.         MOVWF   SIGNO_TEMP_INT          ; Signo en ASCII '+' o '-'
  14.         MOVLW   0x7F
  15.         ANDWF   BYTE3, W
  16.         MOVWF   ENTERO_TEMP_INT         ; Valor Entero de esa temperatura
  17.         SWAPF   BYTE4, W
  18.         ANDLW   0x0F
  19.         MOVWF   FRACCION_TEMP_INT       ; Fraccionario ( 4 bits )
  20.  
  21.         ; Segundo temperatura termopar
  22.         ; siii iiii | iiii, ff        - s = signo, i = entero, ff = Fraccion , en Byte1 y 2
  23.  
  24.         MOVLW   '+'
  25.         BTFSC   BYTE1,1
  26.         MOVLW   '-'
  27.         MOVWF   SIGNO_TEMP_TERMOPAR
  28.         RRF     BYTE2, W
  29.         MOVWF   FRACCION_TEMP_TERMOPAR          ; Registro = xiii iffx
  30.         RRF     FRACCION_TEMP_TERMOPAR, F       ; Registro = xxii iiff
  31.         MOVLW   0x03
  32.         ANDWF   FRACCION_TEMP_TERMOPAR, F       ; Registro = 0000 00ff
  33.         SWAPF   BYTE2, W                        ; W = xxff iiii
  34.         ANDLW   0x0F
  35.         MOVWF   ENTERO_LOW_TEMP_TERMOPAR        ; Registro_low = 0000 iiii
  36.         SWAPF   BYTE1, W                        ; W = iiii siii
  37.         MOVWF   ENTERO_HIGH_TEMP_TERMOPAR, F    ; Registro_high = iiii siii
  38.         ANDLW   0xF0                            ; W = iiii 0000
  39.         IORWF   ENTERO_LOW_TEMP_TERMOPAR, F     ; Registro_low = iiii iiii
  40.         MOVLW   0x07
  41.         ANDWF   ENTERO_HIGH_TEMP_TERMOPAR, F    ; Registro_high = 0000 0iii
  42.        
  43.         RETLW   0
  44.  
  45.  
  46. CON_FALLA
  47.         BTFSC   BYTE4,0
  48.         GOTO    FALLA_OC
  49.         BTFSC   BYTE4,1
  50.         GOTO    FALLA_SCG
  51. FALLA_SVC
  52.         ;Aca entra si hay una falla de corto a VCC
  53.         RETLW -1
  54. FALLA_SCG
  55.         ;Aca entra si hay una falla de corto a GND
  56.         RETLW -1
  57. FALLA_OC
  58.         ;Aca entra si no hay nada conectado
  59.         RETLW -1

No tuve en cuenta ningun banco, asi que ojo con eso, y seguro que debe haber un error por ahi, tambien jamas modifico los valores de BYTE1/2/3/4 quedan con sus valores originales por si queres debugearlo.
Pero tu codigo al menos saca el valor entero ( los 8 bits mas bajos obviamente ), Asi que no veo cual seria el problema.
Estas respetando los tiempos de transmision, es decir con una frecuencia de menos de 5Mhz y tambien por ahora mejor tener el CS del MAX en 0, ya que creo que este es el CS:

Código: ASM
  1. BCF     MAX1

Si lo estas haciendo asi, observa que ya enviaste 0x00 para que el SPI comienze a transmitir y luego pones el CS en 0. Esto tal ves te introduzca uno o 2 ceros mas sin querer. El tiempo entre el CS en bajo y el comienzo de envio es de 100ns minimo, asi que si estas a 20Mhz solo pone el BCF del CS antes del los CLRF y vas sobrado. El BSF esta bien, ya que se termino la comunicacion.
« Última modificación: 07 de Abril de 2016, 07:08:10 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #56 en: 12 de Abril de 2016, 03:22:42 »
Siguiendo en el desarrollo de la practica me encontre con esto  :oops: KillerJC que debo hacer?

Código: ASM
  1. Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000004, length=0x0000107c

Lei varios post donde recomiendan partir el programa. Como lo hago? Si es que se puede, que mas puedo hacer.


Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #57 en: 12 de Abril de 2016, 05:01:41 »
Pregunta... que micro estas usando? Si es el PIC16F1707 entonces te quedaste sin memoria..

Pero estamos hablando que te pasaste por MUCHO en la memoria. Por mas que lo dividas es imposible
El PIC16F1707 puede almacenar un maximo de 2048 palabras de flash, desde 0x000 a 0x7FF , por eso mismo ves en el archivo del linker :

16f1707_g.lkr
Citar
CODEPAGE   NAME=page0      START=0x0               END=0x7FF                   
CODEPAGE   NAME=.idlocs    START=0x8000            END=0x8003         PROTECTED
CODEPAGE   NAME=.devid     START=0x8006            END=0x8006         PROTECTED
CODEPAGE   NAME=.config    START=0x8007            END=0x8008         PROTECTED

Normalmente uno lo que hace es poner un ORG (0x00) en el reset, y luego un ORG en el vector de interrupcion, entonces comienza de 0x04 todo lo que esta debajo de esa ORG (por eso dice start 0x04), El problema comienza cuando el compilador linker intenta meter ese pedazo de instrucciones/datos de un largo de 0x107C palabras en la memoria ( 4220 palabras! ) en el unico lugar que posee en flash que es de 0x0 a 0x7FF. Y por lo cual es evidente que no va a entrar ni queriendo en 2044 lugares (4 menos por los vectores). Entonces te dice "la org_1 (por que no le diste nombre) que comienza en 0x04 no entra en el espacio asignado(can not fit) y el largo que intentas meter es de 0x107C"

Si queres ver que es eso, trata de comentar 1 sola instruccion cualquiera (que no sea un MOVIW/MOVWI que ocupan 2 lugares)y fijate que el length deberia cambiar a 0x107B

----------------------------------------------------------------------------------------------------

Otra forma de probarlo. El 16F1708 tiene hasta 4096 palabras y el 16F1709 tiene hasta 8192

Archivo linker del 16F1709:

16f1709_g.lkr
Citar
CODEPAGE   NAME=page0      START=0x0               END=0x7FF                   
CODEPAGE   NAME=page1      START=0x800             END=0xFFF                   
CODEPAGE   NAME=page2      START=0x1000            END=0x17FF                   
CODEPAGE   NAME=page3      START=0x1800            END=0x1FFF                  
CODEPAGE   NAME=.idlocs    START=0x8000            END=0x8003         PROTECTED
CODEPAGE   NAME=.devid     START=0x8006            END=0x8006         PROTECTED
CODEPAGE   NAME=.config    START=0x8007            END=0x8008         PROTECTED

Como ves en este ultimo esta separado en paginas, cada pagina con 2048 palabras, abarcando desde 0x0 a 0x1FFF.  Si lo "compilas" con este PIC (ya que es de la misma familia y no tendiras problemas) deberias tener aproximadamente el 51.5% ocupado del micro. Y que nuevamente te va a dar una idea de que el problema es la falta de espacio en flash.

----------------------------------------------------------------------------------------------------

Tambien otra forma simple de que aparezca este error en el PIC16F1707 sin necesidad de escribir demasiado codigo ( solo 3 lineas ) es asi:

Código: ASM
  1. test ORG 0x7FF
  2.         MOVLW   0x10            ; <- Correcto ya que ocupa la direccion 0x7FF
  3.         MOVLW   0x15            ; <- Problema no hay mas lugar, no existe 0x800

El cual el error deberia ser:

Código: ASM
  1. Error - section '.test' can not fit the absolute section. Section '.test' start=0x000007FF, length=0x00000002

Podes probar si gustas :P, no estoy muy seguro que ocurra asi, pero no le voy a errar tanto.
« Última modificación: 12 de Abril de 2016, 05:26:52 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:PIC16F1707 Ejemplos básicos
« Respuesta #58 en: 25 de Abril de 2016, 03:01:36 »
Gracias nuevamente KillerJC por esa explicacion. Efectivamente di con el error que era la memoria, migre el codigo para esa aplicacion a un 18F13K22. Sin problemas, bueno para darle seguimiento a lo de la MicroSD me puse a buscar informacion y hay bastante. En particular os dejo este link para que lo revisen:

https://prezi.com/pudfdp-ploth/micro-sd-bajo-comunicacion-spi/
http://elm-chan.org/docs/mmc/mmc_e.html

Me parecio muy intuitivo. Respecto a la informacion presentada en este link comprendo lo siguiente:

- La velocidad Máxima de transmisión es de 400khz antes de la incialización, despues puede ser mayor?
- Se envian comandos de 6 Bytes y se reciben de 1 u 2 bytes.
- Seguido del bloque de datos que deseamos leer/escribir respectivamente.

Despues seguimos con la rutina de incializcion:
- Delay para estabilizacion de alimentacion
- Configurar SPI en baja velocidad
- Mandar 74 pulsos de reloj
- Mandar Comando 00 que pone la tarjeta en SPI y recibe como respuesta tipo R1 con el IDLE STATE. (Se requiere un CRC 00x95) Esto ultimo no me quedo tan claro.
- Si funciono el Comando 00 mandamos ahora el comando 08 con argumento 0x1AA y CRC 0x87
- Si no fue aceptado el comando 08 mandamos ahora el comando 37 seguido del comando 29 no se precisan argumentos pero se recomienda manda 4 bytes en 0 despues de los comandos?
- Si lo acepto mandamos de nuevo el comando 01 con argumento 0 y CRC cualquiera
- Despues de esto se puede utilizar el comando BLOCKLEN para especificar el tamaño del bloque. Pero para escritura siempre son 512 Bytes y para lectura puede ser desde 1
- Por ultimo se puede utilizar una velocidad mas alta.

Bueno pues parece algo sencillo aunque me quedan un par de preguntas, los CRC son bytes especificos que se tienen que mandar con los comandos?

Bueno y dado que hay que mandar muchos bytes u leer que metodo de escritura lectura me recomiendan?

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F1707 Ejemplos básicos
« Respuesta #59 en: 25 de Abril de 2016, 09:14:40 »
Citar
- Se envian comandos de 6 Bytes y se reciben de 1 u 2 bytes.

Supuestamente la mayoria de las respuestas son R1, 8 bits y que con que lleguen con 0x00 significa correcto, las R1b poseen un bit extra que es un flag de busy, las R3/R7 ya son 5 bytes, en la cual es una R1 + 4 bytes. Lo que no dice nada es de R2, pero no lo veo como respuesta a ningun comando.

Supuestamente el CRC del comando que vos envias, no es verificado. Asi que no te molestarias en ponerlo. ESTO EN SPI!

Citar
- Mandar Comando 00 que pone la tarjeta en SPI y recibe como respuesta tipo R1 con el IDLE STATE. (Se requiere un CRC 00x95) Esto ultimo no me quedo tan claro.

Ahi lo explica, como todavia NO esta en modo SPI (sino en el nativo de SD ), el CRC debe ser correcto. Entonces el comando que tenes que enviar que es : 01 + Index + Argumento + CRC

Deberia ser

Index: 0x00
Argumento: 0x00000000
CRC = 0x95

De ahi deberias obtener una respuesta, y deberias obtener un 0x01, diciendo que la tarjeta esta en Idle Mode.
No se por que existe que el comando CMD08 sea enviado tambien con CRC, pero no es necesario que lo calcules, simplemente tener el CRC ya precalculado para esos 2 casos, incluso podes ver los archivos .c para guiarte un poco.

Citar
Bueno pues parece algo sencillo aunque me quedan un par de preguntas, los CRC son bytes especificos que se tienen que mandar con los comandos?

Creo que lo respondi arriba, pero solo se necesitan 2 CRC con los valores precalculados, asi que no tenes que crear ninguna rutina para calcular eso.
Y si se envian con los comandos, fijate los bits a enviar en lso comandos

Citar
Bueno y dado que hay que mandar muchos bytes u leer que metodo de escritura lectura me recomiendan?

Depende de tamaño de buffer que poseas, si tenes 2 buffer de 128 en el cual 1 se va llenando y el otro se transmite a la SD, entonces que sean paquetes de 128bytes. O tal ves tenes 2 buffer de lectura de 128bytes tambien y vas llenando uno mientras el otro lees, depende exclusivamente de tu uso.

Y tenes en cuenta que solo estas escribiendo la SD en RAW, no vas a poder abrirlo con la PC y encontrar un archivo, ya que no estas usando ningun formato ( FAT es el mas comun )