Translate, Traductor

sábado, 7 de julio de 2012

Monitor de posición con PIC16F886

Monitor de posición o indicador de nivel!

Con este circuito podemos saber la posición de un potenciometro que esta conectado al modulo conversor análogo a digital de un microcontrolador PIC16F886.

El potenciometro puede ser reemplazado con cualquier tipo de sensor para así poder monitorear el estado o nivel de cualquier variable.

otros ejemplos de uso del conversor análogo a digital:

conversor-analogo-a-digital-con-pic-12f675
conversor-analogo-a-digital-con-pic-16f886
secuenciador-variable-usando-el-tmr0-y-converor-analogo-a-digital


Circuito



Video:



Codigo fuente:


LIST P=16F886
INCLUDE P16F886.INC
ERRORLEVEL -302

__CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
  __CONFIG _CONFIG2, _BOR40V & _WRT_OFF


CBLOCK 0X20
VAL1, PDel0, DISP
ENDC

ORG 00H
GOTO CONFIGURA


TABLA ADDWF PCL,F
RETLW B'00111111'
RETLW B'00000110'
RETLW B'01011011'
RETLW B'01001111'
RETLW B'01100110'
RETLW B'01101101'
RETLW B'01111101'
RETLW B'00000111'
RETLW B'01111111'
RETLW B'01101111' ;9


MOSTRAR MOVF DISP,W
CALL TABLA
MOVWF PORTB
RETURN

PDelayAD   movlw     .123       ; 1 set number of repetitions
        movwf     PDel0     ; 1 |
PLoop0AD   clrwdt               ; 1 clear watchdog
        decfsz     PDel0, 1   ; 1 + (1) is the time over?
        goto       PLoop0AD     ; 2 no, loop
PDelL1AD   goto PDelL2AD ; 2 cycles delay
PDelL2AD   clrwdt               ; 1 cycle delay
        return               ; 2+2 Done


CONFIGURA CLRF     PORTB
BANKSEL   OSCCON
      MOVLW B'01101100'
      MOVWF OSCCON
      BANKSEL ADCON1
  MOVLW B'00000000'
  MOVWF ADCON1
BANKSEL ANSEL
MOVLW B'00000001'
      MOVWF ANSEL
CLRF     ANSELH
BANKSEL TRISB
MOVLW .1
MOVWF TRISA
CLRF     TRISB
CLRF     TRISC
BANKSEL ADCON0
      MOVLW B'11000001'
      MOVWF ADCON0
      BANKSEL PORTB
CLRF PORTA
CLRF PORTB
CLRF PORTC


CICLO NOP
AD_LOOP BSF ADCON0,GO
CALL PDelayAD
END_AD BTFSC ADCON0,GO
GOTO END_AD
MOVF ADRESH,W
MOVWF VAL1

CERO CLRW
XORWF VAL1,W
BTFSS STATUS,Z
GOTO UNO
MOVLW .1
MOVWF PORTB
GOTO CICLO

UNO MOVLW .32
SUBWF VAL1,W
BTFSC STATUS,C
GOTO DOS
MOVLW .2
MOVWF PORTB
GOTO CICLO

DOS MOVLW .64
SUBWF VAL1,W
BTFSC STATUS,C
GOTO TRES
MOVLW .4
MOVWF PORTB
GOTO CICLO

TRES MOVLW .96
SUBWF VAL1,W
BTFSC STATUS,C
GOTO CUATRO
MOVLW .8
MOVWF PORTB
GOTO CICLO

CUATRO MOVLW .128
SUBWF VAL1,W
BTFSC STATUS,C
GOTO CINCO
MOVLW .16
MOVWF PORTB
GOTO CICLO

CINCO MOVLW .160
SUBWF VAL1,W
BTFSC STATUS,C
GOTO SEIS
MOVLW .32
MOVWF PORTB
GOTO CICLO

SEIS MOVLW .192
SUBWF VAL1,W
BTFSC STATUS,C
GOTO SIETE
MOVLW .64
MOVWF PORTB
GOTO CICLO

SIETE MOVLW .224
SUBWF VAL1,W
BTFSC STATUS,C
GOTO CICLO
MOVLW .128
MOVWF PORTB
GOTO CICLO

END


Copyright 2012  edwtron
       
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.
     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".    

viernes, 6 de julio de 2012

PWM con microcontrolador

Vamos a implementar el PWM (para que recuerden que es PWM en la Wikipedia) con un microcontrolador 16F886. la idea es usar el modulo de PWM que traen algunos Microcontroladores PIC.


Usaremos el pin RB2/CCP1 com salida donde tendremos el pulso de ancho variable.
Se usa un comparador que activa un bit cuando el valor del registro PR2 coincide con la parte alta del TMR2, en ese momento el TMR2 toma el valor 00, luego el bit se pone en cero cuando otro comparador detecta que la parte del TMR2 y el CCPR1H son iguales.

En PR2 se asigna el periodo   T = (PR2 + 1)*4*Tosc * Valor predivisor TMR2
En CCPR1L se carga el ancho del pulso, que luego pasa a CCPR1H

Analicemos:


MOVLW   B'00001101'
MOVWF        CCP1CON ; Modo PWM <3,2,1,0>, bit <5,4> en ceros
MOVLW    B'00000100' ; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz
                        ; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz
                        ; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz
MOVWF    T2CON ; Prescaler 16 <1,0> y activa el TMR2 <2>


Veamos el circuito:

Sencillo!!!

Ahora un video del circuito funcionando:



El codigo fuente:


LIST P=16F886
INCLUDE P16F886.INC

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF


CBLOCK 0X20
d1, d2
ENDC


ORG 00
GOTO INICIO

RET_100MS ;99998 cycles
movlw 0x1F
movwf d1
movlw 0x4F
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0

;2 cycles
goto $+1
RETURN

INICIO NOP
BANKSEL   OSCCON
      MOVLW B'01101100'
      MOVWF OSCCON
BANKSEL TRISA
CLRF TRISB
MOVLW B'00000000' ; Configuro RC2 como sailida
MOVWF PORTC
MOVLW .255
MOVWF PR2 ; Asigno el periodo
BANKSEL PORTB
MOVLW 0XFF
MOVWF PORTB
MOVLW B'00001101'
MOVWF CCP1CON ; Modo PWM <3,2,1,0>, bit <5,4> en ceros
MOVLW B'00000100' ; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz
; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz
; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz
MOVWF T2CON ; Prescaler 16 <1,0> y activa el TMR2 <2>
CLRF CCPR1L ; Duty en cero (0)


NUEVO MOVLW .0
MOVWF CCPR1L
CALL RET_100MS


CICLO NOP
MOVLW .10
ADDWF CCPR1L,F
CALL RET_100MS
MOVLW .250
XORWF CCPR1L,W
BTFSS STATUS,Z
GOTO CICLO
GOTO NUEVO

END



Copyright 2012  edwtron
       
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.
     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".  




Secuenciador con 6 modos

Este secuenciador tiene seis modos de secuencia diferentes, que se seleccionan con un pulsador. Para cambiar de secuencia se deja presionado el pulsador hasta que esta cambie.
El programa se hizo de dos formas diferentes, en la primera forma se usa en cada secuencia una rutina para mostrarla, lo que da como resultado un programa mas o menos largo y la segunda forma nos ahorra unas cuantas lineas de código (como 40 lineas) usamos una sola rutina para todas las secuencias.

Video del circuito:



Voy a publicar las dos formas para que se analicen las diferencias y se vea la ventaja de usar subrrutinas.


Primera forma:

  LIST P=16F886

    INCLUDE P16F886.INC
ERRORLEVEL -302

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF


CBLOCK 0X20
CUENTA, VALORAD, d1, d2, MODO
ENDC


      ORG 0X00
      GOTO CONFIGURA
     
     
RET_300MS ;199998 cycles
movlw 0x3F
movwf d1
movlw 0x9D
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0

;2 cycles
goto $+1
RETURN

SEC0 ADDWF PCL,F
RETLW B'10000000'
RETLW B'01000000'
RETLW B'00100000'
RETLW B'00010000'
RETLW B'00001000'
RETLW B'00000100'
RETLW B'00000010'
RETLW B'00000001'
RETLW B'00000010'
RETLW B'00000100'
RETLW B'00001000'
RETLW B'00010000'
RETLW B'00100000'
RETLW B'01000000'
RETLW B'10000000';14
     
SEC1 RETLW B'10000001'
RETLW B'01000010'
RETLW B'00100100'
RETLW B'00011000'
RETLW B'00100100'
RETLW B'01000010';20


SEC2 RETLW B'11000011'
RETLW B'11100111'
RETLW B'11111111'
RETLW B'01111110'
RETLW B'00111100'
RETLW B'00011000'
RETLW B'00100100'
RETLW B'01000010'
RETLW B'10000001';29


SEC3 RETLW B'10000000'
RETLW B'11000000'
RETLW B'11100000'
RETLW B'11110000'
RETLW B'11111000'
RETLW B'11111100'
RETLW B'11111110'
RETLW B'11111111'
RETLW B'01111111'
RETLW B'00111111'
RETLW B'00011111'
RETLW B'00001111'
RETLW B'00000111'
RETLW B'00000011'
RETLW B'00000001';44

SEC4 RETLW B'10000000'
RETLW B'10000001'
RETLW B'10000010'
RETLW B'10000100'
RETLW B'10001000'
RETLW B'10010000'
RETLW B'10100000'
RETLW B'11000001'
RETLW B'11000010'
RETLW B'11000100'
RETLW B'11001000'
RETLW B'11010000'
RETLW B'11100001'
RETLW B'11100010'
RETLW B'11100100'
RETLW B'11101000'
RETLW B'11110001'
RETLW B'11110010'
RETLW B'11110100'
RETLW B'11111001'
RETLW B'11111010'
RETLW B'11111101'
RETLW B'11111110'
RETLW B'11111111';68

SEC5 RETLW B'11111111'
RETLW B'11111101'
RETLW B'11111011'
RETLW B'11110111'
RETLW B'11101111'
RETLW B'11011111'
RETLW B'10111111'
RETLW B'01111110'
RETLW B'01111101'
RETLW B'01111011'
RETLW B'01110111'
RETLW B'01101111'
RETLW B'01011111'
RETLW B'00111110'
RETLW B'00111101'
RETLW B'00111011'
RETLW B'00110111'
RETLW B'00101111'
RETLW B'00011110'
RETLW B'00011101'
RETLW B'00011011'
RETLW B'00010111'
RETLW B'00001110'
RETLW B'00001101'
RETLW B'00001011'
RETLW B'00000110'
RETLW B'00000101'
RETLW B'00000010'
RETLW B'00000001'
RETLW B'00000000';98




CONFIGURA CLRF     PORTB
BANKSEL   OSCCON
      MOVLW B'01101100'
      MOVWF OSCCON
BANKSEL ANSEL
      CLRF ANSEL
CLRF     ANSELH
BANKSEL TRISB
MOVLW .1
MOVWF TRISA
CLRF     TRISB
CLRF     TRISC
      BANKSEL PORTB
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF MODO
NUEVO CLRF CUENTA

INICIO BTFSS PORTA,0
GOTO SECUENCIAS

CALL RET_300MS
INCF MODO,F
MOVLW .6
XORWF MODO,W
BTFSS STATUS,Z
GOTO SECUENCIAS
CLRF MODO
;=================================================
SECUENCIAS CLRW
XORWF MODO,W
BTFSS STATUS,Z
GOTO UNO

CLRF CUENTA
OTRO MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVLW .14
XORWF CUENTA,W
BTFSC STATUS,Z
GOTO INICIO
GOTO OTRO

;=================================================
UNO MOVLW .1
XORWF MODO,W
BTFSS STATUS,Z
GOTO DOS

MOVLW .15
MOVWF CUENTA
OTRO1 MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVLW .21
XORWF CUENTA,W
BTFSC STATUS,Z
GOTO INICIO
GOTO OTRO1
;=================================================
DOS MOVLW .2
XORWF MODO,W
BTFSS STATUS,Z
GOTO TRES

MOVLW .21
MOVWF CUENTA
OTRO2 MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVLW .30
XORWF CUENTA,W
BTFSC STATUS,Z
GOTO INICIO
GOTO OTRO2
;=================================================
TRES MOVLW .3
XORWF MODO,W
BTFSS STATUS,Z
GOTO CUATRO

MOVLW .30
MOVWF CUENTA
OTRO3 MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVLW .45
XORWF CUENTA,W
BTFSC STATUS,Z
GOTO INICIO
GOTO OTRO3
;=================================================
CUATRO MOVLW .4
XORWF MODO,W
BTFSS STATUS,Z
GOTO CINCO

MOVLW .45
MOVWF CUENTA
OTRO4 MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVLW .69
XORWF CUENTA,W
BTFSC STATUS,Z
GOTO INICIO
GOTO OTRO4
;=================================================
CINCO MOVLW .5
XORWF MODO,W
BTFSS STATUS,Z
GOTO INICIO

MOVLW .69
MOVWF CUENTA
OTRO5 MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVLW .99
XORWF CUENTA,W
BTFSC STATUS,Z
GOTO INICIO
GOTO OTRO5
;=================================================
        END



Segunda forma:



  LIST P=16F886

    INCLUDE P16F886.INC
ERRORLEVEL -302

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF


CBLOCK 0X20
CUENTA, VALORAD, d1, d2, MODO, OFFSET
ENDC


      ORG 0X00
      GOTO CONFIGURA
     
     
RET_300MS ;199998 cycles
movlw 0x02;0x3F
movwf d1
movlw 0x5D;0x9D
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0

;2 cycles
goto $+1
RETURN

SEC0 ADDWF PCL,F
RETLW B'10000000'
RETLW B'01000000'
RETLW B'00100000'
RETLW B'00010000'
RETLW B'00001000'
RETLW B'00000100'
RETLW B'00000010'
RETLW B'00000001'
RETLW B'00000010'
RETLW B'00000100'
RETLW B'00001000'
RETLW B'00010000'
RETLW B'00100000'
RETLW B'01000000'
RETLW B'10000000';14
     
SEC1 RETLW B'10000001'
RETLW B'01000010'
RETLW B'00100100'
RETLW B'00011000'
RETLW B'00100100'
RETLW B'01000010';20


SEC2 RETLW B'11000011'
RETLW B'11100111'
RETLW B'11111111'
RETLW B'01111110'
RETLW B'00111100'
RETLW B'00011000'
RETLW B'00100100'
RETLW B'01000010'
RETLW B'10000001';29


SEC3 RETLW B'10000000'
RETLW B'11000000'
RETLW B'11100000'
RETLW B'11110000'
RETLW B'11111000'
RETLW B'11111100'
RETLW B'11111110'
RETLW B'11111111'
RETLW B'01111111'
RETLW B'00111111'
RETLW B'00011111'
RETLW B'00001111'
RETLW B'00000111'
RETLW B'00000011'
RETLW B'00000001';44

SEC4 RETLW B'10000000'
RETLW B'10000001'
RETLW B'10000010'
RETLW B'10000100'
RETLW B'10001000'
RETLW B'10010000'
RETLW B'10100000'
RETLW B'11000001'
RETLW B'11000010'
RETLW B'11000100'
RETLW B'11001000'
RETLW B'11010000'
RETLW B'11100001'
RETLW B'11100010'
RETLW B'11100100'
RETLW B'11101000'
RETLW B'11110001'
RETLW B'11110010'
RETLW B'11110100'
RETLW B'11111001'
RETLW B'11111010'
RETLW B'11111101'
RETLW B'11111110'
RETLW B'11111111';68

SEC5 RETLW B'11111111'
RETLW B'11111101'
RETLW B'11111011'
RETLW B'11110111'
RETLW B'11101111'
RETLW B'11011111'
RETLW B'10111111'
RETLW B'01111110'
RETLW B'01111101'
RETLW B'01111011'
RETLW B'01110111'
RETLW B'01101111'
RETLW B'01011111'
RETLW B'00111110'
RETLW B'00111101'
RETLW B'00111011'
RETLW B'00110111'
RETLW B'00101111'
RETLW B'00011110'
RETLW B'00011101'
RETLW B'00011011'
RETLW B'00010111'
RETLW B'00001110'
RETLW B'00001101'
RETLW B'00001011'
RETLW B'00000110'
RETLW B'00000101'
RETLW B'00000010'
RETLW B'00000001'
RETLW B'00000000';98

MOSTRAR MOVF CUENTA,W
CALL SEC0
MOVWF PORTB
CALL RET_300MS
INCF CUENTA,F
MOVF OFFSET,W
XORWF CUENTA,W
BTFSC STATUS,Z
RETURN
GOTO MOSTRAR


CONFIGURA CLRF     PORTB
BANKSEL   OSCCON
      MOVLW B'01101100'
      MOVWF OSCCON
BANKSEL ANSEL
      CLRF ANSEL
CLRF     ANSELH
BANKSEL TRISB
MOVLW .1
MOVWF TRISA
CLRF     TRISB
CLRF     TRISC
      BANKSEL PORTB
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF MODO
NUEVO CLRF CUENTA

INICIO BTFSS PORTA,0
GOTO SECUENCIAS

CALL RET_300MS
INCF MODO,F
MOVLW .6
XORWF MODO,W
BTFSS STATUS,Z
GOTO SECUENCIAS
CLRF MODO
;=================================================
SECUENCIAS CLRW
XORWF MODO,W
BTFSS STATUS,Z
GOTO UNO

CLRF CUENTA
MOVLW .14
MOVWF OFFSET
CALL MOSTRAR
GOTO INICIO
;=================================================
UNO MOVLW .1
XORWF MODO,W
BTFSS STATUS,Z
GOTO DOS

MOVLW .15
MOVWF CUENTA
MOVLW .21
MOVWF OFFSET
CALL MOSTRAR
GOTO INICIO
;=================================================
DOS MOVLW .2
XORWF MODO,W
BTFSS STATUS,Z
GOTO TRES

MOVLW .21
MOVWF CUENTA
MOVLW .30
MOVWF OFFSET
CALL MOSTRAR
GOTO INICIO
;=================================================
TRES MOVLW .3
XORWF MODO,W
BTFSS STATUS,Z
GOTO CUATRO

MOVLW .30
MOVWF CUENTA
MOVLW .45
MOVWF OFFSET
CALL MOSTRAR
GOTO INICIO
;=================================================
CUATRO MOVLW .4
XORWF MODO,W
BTFSS STATUS,Z
GOTO CINCO

MOVLW .45
MOVWF CUENTA
MOVLW .69
MOVWF OFFSET
CALL MOSTRAR
GOTO INICIO
;=================================================
CINCO MOVLW .5
XORWF MODO,W
BTFSS STATUS,Z
GOTO INICIO

MOVLW .69
MOVWF CUENTA
MOVLW .99
MOVWF OFFSET
CALL MOSTRAR
GOTO INICIO
;=================================================

        END



Circuito:





Copyright 2012  edwtron
       
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.
     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".