Autor Tema: Algunas dudas.  (Leído 3781 veces)

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

Desconectado Yehoshafat

  • PIC10
  • *
  • Mensajes: 3
Algunas dudas.
« en: 02 de Noviembre de 2015, 04:06:06 »
Tengo este pequeño proyecto para calificación. Me parece que funciona bien (no lo he podido probar en físico por falta de material)

Lo que hace: Recibe una entrada analógica del puerto [a especificar el día de la prueba], esta entrada se refleja en una salida digital. Ademas, recibe otra entrada digital que se refleja en una salida digital. ( A mi me parece bastante sencillo)

Código: [Seleccionar]
PROCESSOR 16F877A
    INCLUDE <P16F877A.INC>
     __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

ANVAL EQU 0x20 ;ANALOG VALUE OF AN0 INPUT
CNT0 EQU 0x21 ;COUNTER IN BANK 00
CNT1 EQU 0xA1 ;COUNTER IN BANK 01
d1 EQU 0xA2
    ORG 0 ;WE MAKE USE OF INTERUPTS

    BSF STATUS, 5 ;SELECT BANK 01
    ;PORTA IS SET TO INPUT MODE
    MOVLW B'11111111'
    MOVWF TRISA
    MOVLW B'11111111'
    MOVWF TRISB
    ;PORTB IS SET TO OUTPUT MODE
    MOVLW B'00000000'
    MOVWF TRISC
    MOVLW B'00000000'
    MOVWF TRISD
    BCF STATUS, 5 ;SELECT BANK 00
 
 
MAIN:
   
    CALL ADC_INIT ;INIT ADC MODULE
    CALL ADC_READ ;READ ANALOG VALUE AND STORE TO ANVAL REGISTER
    ;OUTPUT ANVAL TO PORTB
   
    MOVFW   PORTB
    MOVWF   PORTC
    MOVFW   ANVAL
    MOVWF   PORTD
   
    GOTO MAIN
   
;;;;ADC INIT PROC;;;;
ADC_INIT:
    BSF STATUS, 5 ;SELECT BANK 01
    ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
    MOVLW B'10000000'
    MOVWF ADCON1
    BCF STATUS, 5 ;SELECT BANK 00
    ;FOSC/8, ADON=1
    MOVLW B'10111001'
    MOVWF ADCON0
    RETURN
;;;;ADC READ PROC;;;;
ADC_READ:
    BCF STATUS, 5 ;SELECT BANK 00
    CALL DELAY
    BSF ADCON0, 2 ;START CONVERTION PROCESS (WE SET THE GO BIT)
WAIT:
    BTFSC ADCON0, 2
    GOTO WAIT ;WAIT FOR CONVERTION TO FINISH (WAIT FOR GO BIT TO CLEAR)
    ;;;WE SAVE RESULT INTO AN 8BIT REGISTER TO USE FOR OUTPUT (WE DROP THE TWO LESS SIGNIFICANT BITS);;;
    ;FIRST WE PROCESS THE HIGH BYTE OF RESULT
    MOVLW 0x06
    MOVWF CNT0
AGAIN_0:
    BCF STATUS, C ;WE WANT SHIFT (NOT ROTATE), SO WE CLEAR CARRY
    RLF ADRESH, 1 ;SHIFT LEFT 6 BITS A/D RESULT HIGH BYTE
    DECFSZ CNT0
    GOTO AGAIN_0
    MOVF ADRESH, W ;MOVE ADRESH TO W
    MOVWF ANVAL ;MOVE W TO ANVAL
    ;NOW WE PROCESS THE LOW BYTE OF RESULT
    BSF STATUS, 5 ;SELECT BANK 01
    MOVLW 0x02
    MOVWF CNT1
AGAIN_1:
    BCF STATUS, C ;WE WANT SHIFT (NOT ROTATE), SO WE CLEAR CARRY
    RRF ADRESL, 1 ;SHIFT RIGHT 2 BITS A/D RESULT LOW BYTE
    DECFSZ CNT1
    GOTO AGAIN_1
    MOVF ADRESL, W ;MOVE ADRESL TO W
    BCF STATUS, 5 ;SELECT BANK 00
    ADDWF ANVAL, 1 ;ADD W TO ANVAL
    RETURN
   
DELAY:
movlw   0X16          ; Cargamos valor XX que controla duración (1)
        movwf   d1        ; Iniciamos Contador (1)
Repeticion
        Decfsz  d1       ; Decrementa contador y si es cero sale  (1 si no sale, 2 si sale)
        goto    Repeticion      ; No es 0, repetimos (2)
        return
   
   
    END
Este es mi códiigo en cuestión.
Lo que me gustaría que me ayudaran es a resolver una duda y a limpiar malos hábitos en mi código.
Duda: El profesor nos dijo que podríamos tener un código para usar cualquier entrada y seria valido, yo creo que lo ha dicho como trampa. He leído sobre el pic y solo cuenta con una convertidor ADC por lo cual seria improbable seleccionar todas las entradas AN# y hacer una sumatoria de estas, así podría usar cualquier pin como entrada.

Ahora, en cuanto a malos hábitos, seguro que tengo muchos errores por falta de experencia e ignorancia.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Algunas dudas.
« Respuesta #1 en: 02 de Noviembre de 2015, 11:06:15 »
Malos habitos.... depende, hay algunas cosas mal, otras cosas que ni siqueira valen la pena hacerlas pero se hicieron, otras que dan a dudar que sean tu codigo.

- Lo primero que haria es cambiar los comentarios del ingles al español, sino es como si lo hubieras copiado ( y voy a suponer que no lo hiciste :P )

- Reemplace los cambios de banco por BANKSEL, luego el compilador cambiara los BANKSEL por sus correspondientes instrucciones

- Tratar de usar los nombres de los bits, no es lo mismo hacer BSF STATUS,5 que BSF STATUS,RP0  ,al menos te acordas que es RP0 y no cual era el bit de todo el registro status. ( Aunque esto lo reemplazas con el BANKSEL)

- Cuando definis constantes es decir lo que apunta a tus registros, vi que lo habian dividido en 2 bancos, eso no es necesario, podes usar de 0x70 en adelante que de todos los bancos se accede a eso.

- Tenias puesto una configuracion del ADC dentro del loop principal, eso lo haces una sola ves y listo

- No se quien hizo el codigo, pero se re complico girando todos los bits, cuando con un justificado izquierda ya tenia todo realizado y armado como el queria. Aviso que se estan descartando 2 bits de los 10 del ADC

- Habia muchos MOVLW b'00111111' los deje solo por que dependia mucho de cual iba a ser tu entrada

- Finalmente modifique un poco el codigo para que sea facil de modificar

- Agregue el vector de interrupcion por si las dudas alguna ves tocas y entra a una, asi volveria sin hacer daño a nadie

Este es el mio:
Código: ASM
  1. ; ********************************************************************************************
  2. ;                               Fuses e Includes
  3. ; ********************************************************************************************
  4.  
  5.  
  6. PROCESSOR 16F877A
  7.     INCLUDE <P16F877A.INC>
  8.      __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
  9.  
  10.  
  11. ; ********************************************************************************************
  12. ;                               Definicion de registros
  13. ; ********************************************************************************************
  14.  
  15.  
  16.         ANVAL   EQU     0x70    ; Valor de resultado analogico
  17.         d1      EQU     0x71    ; Auxiliar para el delay
  18.  
  19. ; ********************************************************************************************
  20. ;                               Vectores
  21. ; ********************************************************************************************
  22.  
  23.         ORG     0x00                    ;Vector de reset
  24.         GOTO    Configuracion
  25.         ORG     0x04                    ;Vector de interrupcion
  26.         RETURN
  27.  
  28. ; ********************************************************************************************
  29. ;                               Configuracion de Modulos
  30. ; ********************************************************************************************
  31.  
  32.         ; PUERTOS
  33.  
  34.         BANKSEL TRISA
  35.         MOVLW   B'11111111'             ; Por si es necesario cambiar algun bit
  36.         MOVWF   TRISA                   ; A y B entradas
  37.         MOVLW   B'11111111'             ; Por si es necesario cambiar algun bit
  38.         MOVWF   TRISB
  39.         MOVLW   B'00000000'             ; Por si es necesario cambiar algun bit
  40.         CLRF    TRISC                   ; C y D salidas
  41.         MOVLW   B'00000000'             ; Por si es necesario cambiar algun bit
  42.         CLRF    TRISD
  43.  
  44.         ; ADC
  45.  
  46.         MOVLW B'00000000'               ;Justificado izquierda, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  47.         MOVWF ADCON1                    ; PuertoA y E son analogicos
  48.         BANKSEL ADCON0                  ; Modificar los bits 5 a 7 para determinar que canal usar
  49.         MOVLW B'10111001'
  50.         MOVWF ADCON0                    ;FOSC/8, ADON=1, AN7
  51.  
  52. ; ********************************************************************************************
  53. ;                               Loop Principal
  54. ; ********************************************************************************************
  55.  
  56. MAIN:
  57.    
  58.         CALL    ADC_READ                ;READ ANALOG VALUE AND STORE TO ANVAL REGISTER
  59.                                        
  60.         ; Digital Pin a Pin
  61.         CALL    Pin_to_Pin
  62.  
  63.         ; Analogico a Puerto
  64.         MOVF    ANVAL                   ; Tomamos ANVAL
  65.         MOVWF   PORTx                   ; Escribimos en PuertoX , vos elegis cual
  66.    
  67.         GOTO MAIN
  68.  
  69. ; ********************************************************************************************
  70. ;                               Sub rutinas
  71. ; ********************************************************************************************
  72.  
  73.         ; ADC
  74.  
  75. ADC_READ:
  76.         BANKSEL ADCON0                  ; Banco 0 por si se cambio algo
  77.         BSF     ADCON0, 2               ;START CONVERTION PROCESS (WE SET THE GO BIT)
  78.         CALL    DELAY                   ;
  79. WAIT:
  80.         BTFSC   ADCON0, 2
  81.         GOTO    WAIT                    ;Esperamos que se ponga a 0 el bit (termino)
  82.  
  83.         MOVF    ADRESH, W               ;Guardamos en ANVAL
  84.         MOVWF   ANVAL
  85.         RETURN
  86.  
  87.  
  88.         ; Digital Pin a PIN    
  89.  
  90. Pin_to_Pin:
  91.         BANKSEL PORTA                   ; Banco 0 si es que cambiaste algo, por las dudas
  92.         BTFSS   PORT_IN, 1              ; Es 1 ?
  93.         GOTO    Turn_on
  94.         BCF     PORT_OUT, 1             ; Bit a cambiar, Apago
  95.         RETURN
  96. Turn_on:
  97.         BSF     PORT_OUT, 1             ; Encendido de la salida
  98.         RETURN
  99.  
  100.  
  101.         ; Delay
  102.  
  103. DELAY:
  104.         movlw   0xFF                    ; Cargamos valor XX que controla duración
  105.         movwf   d1                      ; Iniciamos Contador
  106. Repeticion
  107.         Decfsz  d1                      ; Decrementa contador y si es cero sale
  108.         goto    Repeticion              ; No es 0, repetimos
  109.         return
  110.    
  111.    
  112.     END

Cambios a realizar para que cuando sepas las entradas sepas que modificar:

- TRISx al comienzo, vas a poder seleccionar 1 por 1 si es entrada o no.
- En la configuracion tambien tenes que cambiar los bits tanto de ADCON1 como ADCON0, ya que uno selecciona si son entradas digitales o analogicas, y ADCON0 selecciona el canal por donde se toma la señal analogica.
- En el main tenes que cambiar a que puerto vas a mostrar los datos analogos, suponiendo que vaya todo a un puerto y solo se muestre los 8 bits mas significantes
- En Pin_to_Pin, tenes para cambiar PORT_IN y PORT_OUT, de esa forma podes elegir cualquier puerto como entrada y cualquiera como salida, ademas tenes que cambiar los bits de cada uno, asi podes tomar el bit 5 y escribirlo en el bit 3 por ejemplos
« Última modificación: 02 de Noviembre de 2015, 17:19:54 por KILLERJC »

Desconectado Yehoshafat

  • PIC10
  • *
  • Mensajes: 3
Re:Algunas dudas.
« Respuesta #2 en: 02 de Noviembre de 2015, 16:20:36 »
Efectivamente mi código es un copiadero y edición de otros códigos.
El convertidor de ADC fue suministrado por el propio maestro de clase, por eso es que estoy por aquí. No me fío mucho de lo que nos va dando.

Muchas gracias por la respuesta, me pongo a estudiarlo.

Desconectado Yehoshafat

  • PIC10
  • *
  • Mensajes: 3
Re:Algunas dudas.
« Respuesta #3 en: 20 de Noviembre de 2015, 22:47:46 »
No estaba seguro de si seria mejor hacer un tema nuevo o compartir

Este es un control de iluminacion y dos ventiladores para una recamara.

Código: ASM
  1. ; ********************************************************************************************
  2. ;                               Fuses e Includes
  3. ; ********************************************************************************************
  4.  
  5.  
  6. PROCESSOR 16F877A
  7.     INCLUDE <P16F877A.INC>
  8.      __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
  9.  
  10.  
  11. ; ********************************************************************************************
  12. ;                               Definicion de registros
  13. ; ********************************************************************************************
  14.  
  15.  
  16.     ANVAL   EQU     0x70    ; ANALOG RESULT
  17.     CNT0    EQU     0x21    ;COUNTER IN BANK 00
  18.     CNT1    EQU     0xA1    ;COUNTER IN BANK 01
  19.     d1      EQU     0x71    ; DELAY AUXILIAR
  20.     LROOM   EQU     0X72    ; ROOM LUMINOSITY
  21.     TEMP    EQU     0X73    ; ROOM TEMPERATURE
  22.     PRESENCE EQU    0X74    ; PRESENCE 0) BED   1)DESK  2)ANY
  23.     LBED    EQU     0X75    ; BED LUMINOSITY
  24.     LDESK   EQU     0X76    ; DESK LUMINOSITY
  25.  
  26. ; ********************************************************************************************
  27. ;                               Vectores
  28. ; ********************************************************************************************
  29.  
  30.         ORG     0x00                ;Vector de reset
  31.  
  32.  
  33. ; ********************************************************************************************
  34. ;                               Configuracion de Modulos
  35. ; ********************************************************************************************
  36.  
  37.         ; PUERTOS
  38.  
  39.         BSF STATUS, 5 ;SELECT BANK 01
  40.         ;A AND B ARE SET TO INPUT MODE
  41.         MOVLW B'11111111'
  42.         MOVWF TRISA
  43.         MOVLW B'11111111'
  44.         MOVWF TRISB
  45.         ;C AND D ARE SET TO OUTPUT MODE
  46.         MOVLW B'00000000'
  47.         MOVWF TRISC
  48.         MOVLW B'00000000'
  49.         MOVWF TRISD
  50.         BCF STATUS, 5 ;SELECT BANK 00
  51.  
  52.  
  53. ; ********************************************************************************************
  54. ;                               Loop Principal
  55. ; ********************************************************************************************
  56. PRESTAR:
  57.         CALL BED_RESET
  58.         CALL DESK_RESET
  59.         CALL LIGHT_RESET
  60.         BCF PORTC,0
  61.         BCF PORTC,1
  62.         GOTO MAIN
  63.        
  64. MAIN:
  65.        
  66.         BTFSS   PORTB,1 ;SWITCH ON SET?
  67.         GOTO PRESTAR   ;NO
  68.         ;YES
  69.         BTFSS   PORTB,0 ;THERE'S SOMEONE ON THE ROOM?
  70.         GOTO PRESTAR   ;NO
  71.         ;YES
  72.         CALL TEMP_READ
  73.         CALL FAN    
  74.         CALL L_ROOM
  75.         CALL P_BED
  76.         CALL P_DESK
  77.         CALL LIGHT_SELECT
  78.         CALL LIGHT_RESET
  79.         BTFSC   PRESENCE,2
  80.         CALL DIM_LIGHT
  81.         CALL ROOM_LIGHT
  82.         CALL BED_RESET
  83.         BTFSC PRESENCE,0 ; SKIP IS NO ONE IN BED
  84.         CALL BED_LIGHT
  85.         CALL DESK_RESET
  86.         BTFSC PRESENCE,1 ; SKIP IS NO ONE IN DESK
  87.         CALL DESK_LIGHT
  88.         CALL DELAY_ADC              
  89.    
  90.         GOTO MAIN
  91.  
  92. ; ********************************************************************************************
  93. ;                               Sub rutinas
  94. ; ********************************************************************************************
  95. DESK_LIGHT:
  96.         BTFSS PRESENCE,0
  97.         RETURN ;PRESENCE,0 =0
  98.         CALL L_DESK
  99.         MOVLW b'00111111'
  100.         SUBWF LDESK,0
  101.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  102.         BSF PORTD,3
  103.         MOVLW b'01111110'
  104.         SUBWF LDESK,0
  105.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  106.         BSF PORTD,2
  107.         MOVLW b'10111101'
  108.         SUBWF LDESK,0
  109.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  110.         BSF PORTD,1
  111.         BSF PORTD,0
  112.  
  113. L_DESK:
  114.         CALL ADC_LDESK  ;SET A6
  115.         CALL ADC_READ   ;READ ANALOG A1 AND RETURN AS ANVAL
  116.         MOVFW   ANVAL  
  117.         MOVWF   LDESK   ;MOVE ANVAL TO LROOM
  118.         RETURN
  119.        
  120. DESK_RESET:
  121.         BCF PORTD,0
  122.         BCF PORTD,1
  123.         BCF PORTD,2
  124.         BCF PORTD,3
  125.         RETURN
  126.  
  127.  
  128. BED_LIGHT:
  129.         BTFSS PRESENCE,0
  130.         RETURN ;PRESENCE,0 =0
  131.         CALL L_BED
  132.         MOVLW b'00111111'
  133.         SUBWF LBED,0
  134.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  135.         BSF PORTD,7
  136.         MOVLW b'01111110'
  137.         SUBWF LBED,0
  138.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  139.         BSF PORTD,6
  140.         MOVLW b'10111101'
  141.         SUBWF LBED,0
  142.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  143.         BSF PORTD,5
  144.         BSF PORTD,4
  145.  
  146. L_BED:
  147.         CALL ADC_LBED   ;SET A7
  148.         CALL ADC_READ   ;READ ANALOG A1 AND RETURN AS ANVAL
  149.         MOVFW   ANVAL  
  150.         MOVWF   LBED    ;MOVE ANVAL TO LROOM
  151.         RETURN
  152.        
  153. BED_RESET:
  154.         BCF PORTD,4
  155.         BCF PORTD,5
  156.         BCF PORTD,6
  157.         BCF PORTD,7
  158.         RETURN
  159.  
  160. ROOM_LIGHT:
  161.         BTFSC PRESENCE,2
  162.         RETURN ;PRESENCE,2 =1
  163.         MOVLW b'00101010'   ;42 THERE'S NO LIGHT ON THE ROOM
  164.         SUBWF LROOM,0
  165.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  166.         BSF PORTC,7
  167.         MOVLW b'01010100'   ;84
  168.         SUBWF LROOM,0
  169.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  170.         BSF PORTC,6
  171.         MOVLW b'01111110'   ;126
  172.         SUBWF LROOM,0
  173.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  174.         BSF PORTC,5
  175.         MOVLW b'01010100'   ;168
  176.         SUBWF LROOM,0
  177.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  178.         BSF PORTC,4
  179.         MOVLW b'11010010'   ;210
  180.         SUBWF LROOM,0
  181.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  182.         BSF PORTC,3
  183.         MOVLW b'11111010'   ;250
  184.         SUBWF LROOM,0
  185.         BTFSS STATUS,;C=0 W>LROOM C=1 W<=LROOM
  186.         BSF PORTC,2
  187.         RETURN
  188.  
  189. LIGHT_RESET:
  190.         BCF PORTC,7
  191.         BCF PORTC,6
  192.         BCF PORTC,5
  193.         BCF PORTC,4
  194.         BCF PORTC,3
  195.         BCF PORTC,2
  196.         RETURN
  197.        
  198. DIM_LIGHT:
  199.         BCF PORTC,7
  200.         BCF PORTC,6
  201.         BCF PORTC,5
  202.         BCF PORTC,4
  203.         BSF PORTC,3
  204.         BSF PORTC,2
  205.         RETURN
  206.        
  207. LIGHT_SELECT:
  208.         BCF PRESENCE,2
  209.         BTFSC PRESENCE,0
  210.         BSF PRESENCE,2  ;SOMEONE IN BED
  211.         BTFSC PRESENCE,1
  212.         BSF PRESENCE,2  ;SOMEONE IN DESK
  213.         RETURN
  214.  
  215. P_DESK:
  216.         BCF PRESENCE,1
  217.         CALL ADC_PDESK  ;SET A5
  218.         CALL ADC_READ   ;READ ANALOG A1 AND RETURN AS ANVAL
  219.         MOVFW   ANVAL  
  220.         MOVLW   b'01111111' ;SET VALUE TO 50cm OBJECT REFLECTING EQUIVALENT RESISTANCE
  221.         SUBWF   ANVAL,0
  222.         BTFSS   STATUS,C
  223.         BSF PRESENCE,1  ;C=0 OBJECT CLOSER THAN 50cm
  224.         RETURN
  225.  
  226. P_BED:
  227.         BCF PRESENCE,0
  228.         CALL ADC_PBED   ;SET A4
  229.         CALL ADC_READ   ;READ ANALOG A1 AND RETURN AS ANVAL
  230.         MOVFW   ANVAL  
  231.         MOVLW   b'01111111' ;SET VALUE TO 15cm OBJECT REFLECTING EQUIVALENT RESISTANCE
  232.         SUBWF   ANVAL,0
  233.         BTFSS   STATUS,C
  234.         BSF PRESENCE,0  ;C=0 OBJECT CLOSER TO 15cm
  235.         RETURN
  236.  
  237. L_ROOM:
  238.         CALL ADC_LROOM  ;SET A1
  239.         CALL ADC_READ   ;READ ANALOG A1 AND RETURN AS ANVAL
  240.         MOVFW   ANVAL  
  241.         MOVWF   LROOM   ;MOVE ANVAL TO LROOM
  242.         RETURN
  243.        
  244.         ; ****************** Temperatura******************
  245.  
  246. FAN:
  247.         BCF PORTC,0
  248.         BCF PORTC,1
  249.         MOVLW   b'00000111' ;SET VALUE TO 25c EQUIVALENT
  250.         SUBWF   TEMP,0
  251.         BTFSC   STATUS,C    
  252.         CALL FAN_1  ;C=1 TEMPERATURE>25c
  253.         ;C=0 TEMPERATURE<25c
  254.         RETURN
  255.        
  256.        
  257.  
  258. FAN_1:
  259.         BSF PORTC,0
  260.         BCF PORTC,1
  261.         MOVLW   b'00111111' ;SET VALUE TO 30c EQUIVALENT
  262.         SUBWF   TEMP,0
  263.         BTFSC   STATUS,C
  264.         CALL FAN_2  ;C=1 TEMPERATURE>30c
  265.         ;C=0 TEMPERATURE<25
  266.         RETURN
  267. FAN_2:
  268.         BSF PORTC,0
  269.         BSF PORTC,1
  270.         RETURN
  271.        
  272. TEMP_READ:
  273.         CALL ADC_TEMP   ;SET A0
  274.         CALL ADC_READ   ;READ ANALOG A0 AND RETURN AS ANVAL
  275.         MOVFW   ANVAL
  276.         MOVWF   TEMP
  277.         RETURN
  278.        
  279.  
  280.        
  281.        
  282.         ;********************** ADC *******************
  283. ADC_TEMP:
  284.         BSF STATUS, 5 ;SELECT BANK 01
  285.         ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  286.         MOVLW B'10000000'
  287.         MOVWF ADCON1
  288.         BCF STATUS, 5 ;SELECT BANK 00
  289.         ;FOSC/64, ADON=1
  290.         MOVLW B'10000001'
  291.         MOVWF ADCON0
  292.         RETURN
  293.        
  294. ADC_LROOM:
  295.         BSF STATUS, 5 ;SELECT BANK 01
  296.         ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  297.         MOVLW B'10000000'
  298.         MOVWF ADCON1
  299.         BCF STATUS, 5 ;SELECT BANK 00
  300.         ;FOSC/64, ADON=1
  301.         MOVLW B'10001001'
  302.         MOVWF ADCON0
  303.         RETURN
  304.        
  305. ADC_PBED:
  306.         BSF STATUS, 5 ;SELECT BANK 01
  307.         ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  308.         MOVLW B'10000000'
  309.         MOVWF ADCON1
  310.         BCF STATUS, 5 ;SELECT BANK 00
  311.         ;FOSC/64, ADON=1
  312.         MOVLW B'10100001'
  313.         MOVWF ADCON0
  314.         RETURN
  315.        
  316. ADC_PDESK:
  317.         BSF STATUS, 5 ;SELECT BANK 01
  318.         ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  319.         MOVLW B'10000000'
  320.         MOVWF ADCON1
  321.         BCF STATUS, 5 ;SELECT BANK 00
  322.         ;FOSC/64, ADON=1
  323.         MOVLW B'10101001'
  324.         MOVWF ADCON0
  325.         RETURN
  326.        
  327. ADC_LDESK:
  328.         BSF STATUS, 5 ;SELECT BANK 01
  329.         ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  330.         MOVLW B'10000000'
  331.         MOVWF ADCON1
  332.         BCF STATUS, 5 ;SELECT BANK 00
  333.         ;FOSC/64, ADON=1
  334.         MOVLW B'10110001'
  335.         MOVWF ADCON0
  336.         RETURN
  337.        
  338. ADC_LBED:
  339.         BSF STATUS, 5 ;SELECT BANK 01
  340.         ;RIGHT JUSTIFIED RESULT, +VREF=VDD, -VREF=VSS, AN0-AN7=ANALOG
  341.         MOVLW B'10000000'
  342.         MOVWF ADCON1
  343.         BCF STATUS, 5 ;SELECT BANK 00
  344.         ;FOSC/64, ADON=1
  345.         MOVLW B'10111001'
  346.         MOVWF ADCON0
  347.         RETURN 
  348.        
  349. ADC_READ:
  350.         BCF STATUS, 5 ;SELECT BANK 00
  351.         CALL DELAY_ADC
  352.         BSF ADCON0, 2 ;START CONVERTION PROCESS (WE SET THE GO BIT)
  353. WAIT:
  354.         BTFSC ADCON0, 2
  355.         GOTO WAIT ;WAIT FOR CONVERTION TO FINISH (WAIT FOR GO BIT TO CLEAR)
  356.         ;;;WE SAVE RESULT INTO AN 8BIT REGISTER TO USE FOR OUTPUT (WE DROP THE TWO LESS SIGNIFICANT BITS);;;
  357.         ;FIRST WE PROCESS THE HIGH BYTE OF RESULT
  358.         MOVLW 0x06
  359.         MOVWF CNT0
  360. AGAIN_0:
  361.         BCF STATUS, C ;WE WANT SHIFT (NOT ROTATE), SO WE CLEAR CARRY
  362.         RLF ADRESH, 1 ;SHIFT LEFT 6 BITS A/D RESULT HIGH BYTE
  363.         DECFSZ CNT0
  364.         GOTO AGAIN_0
  365.         MOVF ADRESH, W ;MOVE ADRESH TO W
  366.         MOVWF ANVAL ;MOVE W TO ANVAL
  367.         ;NOW WE PROCESS THE LOW BYTE OF RESULT
  368.         BSF STATUS, 5 ;SELECT BANK 01
  369.         MOVLW 0x02
  370.         MOVWF CNT1
  371. AGAIN_1:
  372.         BCF STATUS, C ;WE WANT SHIFT (NOT ROTATE), SO WE CLEAR CARRY
  373.         RRF ADRESL, 1 ;SHIFT RIGHT 2 BITS A/D RESULT LOW BYTE
  374.         DECFSZ CNT1
  375.         GOTO AGAIN_1
  376.         MOVF ADRESL, W ;MOVE ADRESL TO W
  377.         BCF STATUS, 5 ;SELECT BANK 00
  378.         ADDWF ANVAL, 1 ;ADD W TO ANVAL
  379.         RETURN
  380.    
  381. DELAY_ADC:
  382.         movlw   0XFF          ; Cargamos valor XX que controla duración (1)
  383.         movwf   d1        ; Iniciamos Contador (1)
  384. Repeticion
  385.         Decfsz  d1       ; Decrementa contador y si es cero sale  (1 si no sale, 2 si sale)
  386.         goto    Repeticion      ; No es 0, repetimos (2)
  387.         return
  388.  
  389.  
  390.        
  391.    
  392.    
  393.     END

Desconectado luigi1946

  • PIC10
  • *
  • Mensajes: 1
Re:Algunas dudas.
« Respuesta #4 en: 18 de Marzo de 2016, 21:42:52 »
hola¡¡¡
estoy iniciandome en el tema de programación para PICs y me encuentro  enredado con respecto a los tiempos de ejecución de las rutinas, he implementado un código el cual enciende y apaga un led pero la frecuencia en que se corre esta rutina es de menos de 5KHz, me gustaria saber como puedo aumentar esta frecuencia ya que de lo que he investigado esto depende de las instrucciones del programa pero al ser estas tan sencillas ¿no es mucho el tiempo que se esta tomando para realizar cada rutina dentro de un while?. Necesito llegar a tiempos de 40Khz que puedo hacer.

gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Algunas dudas.
« Respuesta #5 en: 18 de Marzo de 2016, 23:07:51 »
Si podes poner el codigo + la frecuencia del oscilador que estas usando podemos ser de mas ayuda