Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
CURSO: Laboratorio de Microcontroladores y Microprogramacin DOCENTE: Ing. Wildor Ferrel TEMA: Conversin Analgico-Digital GRUPO: TURNO: 01:00-14:30 PM - Jueves. INTEGRANTES: Cuba Mamani, Jaime Gerson Ramos Yerba, Julio Cesar 20-12-2011 AREQUIPA PERU
El Driver usado es el L293D que nos sirve para controlar el giro del motor.
Los bits 5-3 CHS2:CHS0.- Seleccin de canal analgico a convertir. Se selecciona uno de los ocho canales AN0,...,AN7 colocando en estos tres bits el nmero binario
correspondiente al canal deseado. (Los canales analgicos a usar debern tener sus bits TRIS correspondientes seleccionados como entradas). El bit 2 GO/DONE.- Bit de inicio y fin de conversin.- Con el convertidor encendido, poniendo este bit en 1 se inicia la conversin del canal seleccionado. Este bit permanece en 1 durante la conversin y es limpiado automticamente por el convertidor al terminar la conversin. El bit 0 ADON.-Encendido del convertidor. Al poner este bit en 1 el convertidor se enciende y al ponerlo en 0 se apaga y no consume corriente.
El bit 7 ADFM.- Seleccin de formato del resultado. Al ponerlo en 1 se selecciona resultado de 10 bits justificado a la derecha. Y con un 0 se selecciona justificacin a la izquierda. En la siguiente seccin se explica con mayor detalle. Bits 3-0 PCFG3:PCFG0.- Bits de configuracin de las entradas del convertidor. Configuran las patitas de entrada del convertidor de acuerdo a la siguiente tabla, (en donde A = Entrada Analgica D = Entrada /Salida digital)
Configuracin de los puertos D y B como salidas Configuracin de PR2 para el PWM: FF Configuracin ADCON1 para el resultado a la izquierda y RA0 como entrada: 0E Configuracin T2CON, pre escalador 1/16: 06 Configuracin CCP1 para PWM: 0C Configuracin del timer 0 Configuracin del LCD
Bucle
Bucle, espera una interrupcin del ADC y va mostrando la velocidad de referencia y la del motor
Salimos de la interrupcin
Cdigo Ensamblador (ASM) LIST P=16F877 INCLUDE "P16F877.INC" frech frecl n1 n2 n3 n var tm0 wtemp statemp d1 adcr org 0x00 goto inicio equ 0x27 equ 0x28 equ 0x29 equ 0x30 equ 0x31 equ 0x32 equ 0x33 equ 0x34 equ 0x35 equ 0x36 equ 0x20 equ 0x37
;;;;;;;;;;;;;;interrupcion;;;;;;;;;;;;;;; org 0x04 movwf swapf movwf btfsc goto bcf movlw addwf decfsz goto movf movwf movf movwf call goto isradc bcf call ;call finisr swapf movwf swapf swapf retfie statemp,0 STATUS wtemp,1 wtemp,0 PIR1,6 ctpwm adcini
wtemp STATUS,0 statemp PIR1,6 isradc INTCON,2 0x27 TMR0,1 tm0,1 finisr TMR1L,0 frecl TMR1H,0 frech timer0inc finisr
;;;;;;;;;;;;;inicio;;;;;;;;;;;;;;;;;;
inicio bsf clrf clrf movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf bcf movlw movwf movlw movwf clrf clrf clrf clrf movlw movwf movlw movwf movlw movwf call call ;call bucle call call movf call call call call call call goto corpwm MOVF MOVWF MOVF bcd mostrar adcr,0 mnnn segf mostrar3 PID corpwm adcini bucle CCPR1L,0 BYTE_L1 0x00 ;rutina que hace la correccion del ; ancho de pulso STATUS,RP0 TRISD TRISB b'00000001' TRISC b'10010111' OPTION_REG 0xff PR2 0x0E ADCON1 0x01 TRISA 0x40 PIE1 STATUS,RP0 b'00000110' T1CON b'11100000' INTCON PORTD PORTC PORTB CCPR1L 0x06 T2CON b'00001100' CCP1CON b'01000000' ADCON0 timer0inc LCD_INI adcini ;Banco1 ;puertos D,B como salidas
;Banco 0
;inicializa Ciclo de trabajo en cero ;configura Timer 2 ;preescalador 1/16, enciende Timer 2 ;Configura el modulo CCP1 para PWM ;canal A0 ;Inicia LCD
MOVWF MOVF MOVWF MOVF MOVWF BTFSC CALL MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF return timer0inc movlw movwf clrf clrf movlw clrf movwf bsf return adcini bsf call bsf return ctpwm movf btfss goto movf movwf movwf asd movf movwf return
BYTE_H1 MN_L,0 PR_L MN_H,0 PR_H MN_H,7 COMPPR PR_L,W BYTE_L2 PR_H,W BYTE_H2 SUMA RES_L,0 CCPR1L
;;;;;;;;;;;;;;;;;;;;bin a bcd ;;;;;;;;;;;;;;;;; ;esta rutina se encarga de convertir el resultado guardado en el ;registro var a su equivalente en BCD para mostrarlo en la pantalla lcd, ;en paralelo con la conversion AD. ;el resultado lo almacena en los registros: n1(unidades),n2(decenas) ;n3(centenas). ;n3 se obtiene restando 100 de var e incrementar n3 por cada resta ;hasta que el resultado sea menor que 100
;n2 se obtiene de restar lo que queda de var con 10 e incrementar n2 por cada resta ;hasta que el resultado sea menor que 10 ;n1 es lo que queda en var puesto que es menor que 10. ;luego de obtener n1,n2,n3 salta a la rutina mostrar que los muestra en ;la pantalla. cuando regresa verifica si termino la conversion AD ;si termino regresa. bcd movf btfss goto movf mnnn movwf clrf clrf clrf obn3 movlw subwf btfss goto incf goto ob addwf obn2 movlw subwf btfss goto incf goto obn1 addwf addwf bcf vn1 movlw subwf btfss goto movwf incf vn2 movlw subwf btfss return movwf incf .10 n2,0 STATUS,DC n2 n3 .10 n1,0 STATUS,DC vn2 n1 n2 var,0 n1,1 STATUS,C .10 var,1 STATUS,C obn1 n2,1 obn2 var,1 ;suma 100 a var, la ultima resta no conto ;obtiene n2 ;resta 10 a var y lo guarda en var ;verifica si resultado es menor que 10 ;si, si sale de esta rutina ;si, no. incrementa n2 y vuelve a restar ;obtiene n1 ;suma 10 a var, la ultima resta no conto ;el resultado es n1 .100 var,1 STATUS,C ob n3,1 obn3 var n1 n2 n3 ;limpia registros n1,n2,n3 ;para una nueva conversion ;obtiene n3 ;resta 100 a var y lo guarda en var ;verifica si resultado es menor que 100 ;si, si sale de esta rutina ;si, no. incrementa n3 y vuelve a restar frech,1 STATUS,Z mayor frecl,0
return mayor movlw movwf movlw movwf movwf incf movwf goto .2 n3 .5 n2 n1 frecl,0 var obn3
;;;;;;;;;;;;tabla 7 seg;;;;;;;;; HEX_7SEG MOVF n,0 ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
PCL,F B'00111111' ;0 B'00000110' ;1 B'01011011' ;2 B'01001111' ;3 B'01100110' ;4 B'01101101' ;5 B'01111101' ;6 B'00000111' ;7 B'01111111' ;8 B'01101111' ;9
;;;;;;;;;;;,;mostrar en lcd;;;;;;;;;;;;;;;;,;;;; mostrar movlw iorwf iorwf iorwf cursor movlw call mostrar3 movlw iorwf iorwf iorwf fecuencia movlw call movlw call call return carga_n movf
b'00110000' n1,1 n2,1 n3,1 0x80 LCD_REG b'00110000' n1,1 n2,1 n3,1 'F' LCD_DATOS ':' LCD_DATOS carga_n
n3,0
call movf call movf call return segf movlw call return
;Visualiza caracter ;Visualiza caracter ;Visualiza caracter ;muestra el mensaje de la segunda fila ;segunda fila lcd
b'11000000' LCD_REG
;;;;;;;;;;CONTROL LCD;;;;;;;;;;;;;;;;; LCD_E bsf nop bcf return LCD_REG bcf movwf call goto LCD_DATOS bsf movwf call goto LCD_INI movlw call movlw call movlw call return
PORTB,2 PORTB,2
PORTB,0 PORTD retardo_255us LCD_E PORTB,0 PORTD retardo_255us LCD_E b'00111000' LCD_REG b'00000110' LCD_REG b'00001100' LCD_REG
;Modo instruccion ;Saca el codigo de instruccion ;pierde 255uS. ;habilita el lcd ;Modo dato ;saca valor ASCII por RD ;pierde 255uS. ;habilita el lcd ;configura lcd ;Codigo de instruccion ;incrementa la posicin del cursor ;pantalla On,cursor Off,Parpadeo de cursor Off
;;;;;;;;;;;;;;;;;control PID;;;;;;;;;;;;;;;;; ;Declaracin de variables ;**************** Variables de PID******************* KP KD KI EN ENN SUM_L SUM_H MN_L MN_H EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X20 0X21 0X22 0X23 0X24 0X25 0X26 0X38 0X39
;Resultado
;************** Variables de Multiplicacin ********* MD MR MD_H PR_H PR_L CNT DIR EQU EQU EQU EQU EQU EQU EQU 0X40 0X41 0X42 0X43 0X44 0X45 0X46
;*************** Variables de Suma*************** ; Primer nmero BYTE_L1 BYTE_H1 ; Segundo nmero BYTE_L2 BYTE_H2 ; Resultado: RES_L RES_H
;************** Variables Auxiliares ************** PR_L0 PR_H0 BYTE_L11 BYTE_H11 RES_L0 RES_H0 SIGNO EQU 0X53 EQU 0X54 EQU 0X55 EQU 0X56 EQU 0X57 EQU 0X58 EQU 0X59
;***** Velocidades del Motor VELOR EQU 0X60 VELOM EQU 0X61 SUMAA EQU 0X62 ; Limpiamos registros CLRF KP CLRF KD CLRF KI CLRF EN CLRF ENN CLRF SUM_L CLRF SUM_H CLRF MN_L CLRF MN_H CLRF MD CLRF MR CLRF MD_H
CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF
PR_L PR_H CNT DIR BYTE_L1 BYTE_H1 BYTE_L2 BYTE_H2 RES_L RES_H PR_L0 PR_H0 BYTE_L11 BYTE_H11 VELOM VELOR SUMAA
; Ingreso de datos:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVf MOVWF MOVf MOVWF CALL GOTO 0X0A KP 0X05 KD 0X0D KI CCPR1L,0 VELOR frecl,0 VELOM PIDcon FINAL
PIDcon ; Deteccin de Error EN. Si EN=0. Regresa inmediatamente CLRF STATUS ;ENN MOVF EN,W MOVWF ENN ;EN MOVF VELOM,W SUBWF VELOR,W BTFSC STATUS,Z GOTO FINAL MOVWF EN MOVF ENN,W ADDWF SUMAA,F
;***************** Primer Parntesis ************** ;****************** Primer trmino *************** ; Producto KD*EN MOVF KD,W MOVWF MD MOVF EN,W MOVWF MR CALL MULTIPLICACION MOVF PR_L,W MOVWF BYTE_L1 MOVF PR_H,W MOVWF BYTE_H1 ; Producto KD*ENN MOVF KD,W MOVWF MD MOVF ENN,W MOVWF MR CALL MULTIPLICACION CALL COMPPR MOVF PR_L,W MOVWF BYTE_L2 MOVF PR_H,W MOVWF BYTE_H2 ; Suma SUMA 01 CALL SUMA ; Redefiniendo nuevos nmeros MOVF RES_L,W MOVWF BYTE_L11 MOVF RES_H,W MOVWF BYTE_H11 ;********************************************** ;************* Segundo Parntesis ************* ; Producto KI*EN MOVF KI,W MOVWF MD MOVF EN,W MOVWF MR CALL MULTIPLICACION MOVF PR_L,W MOVWF BYTE_L1 MOVF PR_H,W MOVWF BYTE_H1 ; Producto KI*(Sumatoria de errores) MOVF KI,W MOVWF MD MOVF SUMAA,W MOVWF MR CALL MULTIPLICACION MOVF PR_L,W MOVWF BYTE_L2 MOVF PR_H,W
MOVWF ; Suma SUMA 02 CALL MOVF MOVWF MOVF MOVWF ; Suma SUMA 03 MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF MOVF MOVWF
BYTE_H2 SUMA RES_L,W BYTE_L2 RES_H,W BYTE_H2 BYTE_L11,W BYTE_L1 BYTE_H11,W BYTE_H1 SUMA RES_L,W BYTE_L2 RES_H,W BYTE_H2
;*********************************************** ;************ Trmino sin parntesis *********** MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF MOVF MOVWF ; Suma SUMA 04 CALL KP,W MD EN,W MR MULTIPLICACION PR_L,W BYTE_L1 PR_H,W BYTE_H1 SUMA
;********************* Resultado ******************* MOVF MOVWF MOVF MOVWF RETURN RES_L,W MN_L RES_H,W MN_H
;************* Rutina de Multiplicacin ******** MULTIPLICACION ; Testeo del signo de los nmeros BTFSC MD,7 CALL COMPMD BTFSC MR,7 CALL COMPMR CLRF PR_L
CLRF PR_H CLRF MD_H CLRF DIR MOVLW 0X08 MOVWF CNT TEST_BIT RRF MR,F BTFSC STATUS,C CALL SUMAR CALL DESPLAZAR DECFSZ CNT,F GOTO TEST_BIT ; Testeamos el signo del producto BTFSC DIR,0 CALL COMPPR RETURN ; Rutinas de Multiplicacion SUMAR MOVF MD,W ADDWF PR_L,F BTFSC STATUS,C INCF PR_H,F MOVF MD_H,W ADDWF PR_H RETURN DESPLAZAR BCF STATUS,C RLF MD,F RLF MD_H,F RETURN ; Complemento a dos de los nmeros negativos ; Complemento a dos del Multiplicando COMPMD COMF MD,F INCF MD,F INCF DIR,F RETURN ; Complemento a dos del Multiplicador COMPMR COMF MR,F INCF MR,F INCF DIR,F RETURN ; Complemento a dos del Producto COMPPR MOVF PR_L,W MOVWF PR_L0 COMF PR_L0,F MOVF PR_H,W MOVWF PR_H0
COMF INCF BTFSC INCF MOVF MOVWF BCF INCF MOVF ADDWF RETURN
PR_H0,F PR_L0,F STATUS,C PR_H PR_L0,W PR_L STATUS,C PR_H0,F PR_H0,W PR_H,F
;******************* Rutina de Suma ************************ SUMA ;***************** SUMAL ************** MOVF trabajo ADDWF BYTE_L2,W ;Suma W con byte-bajo del segundo nmero. Se guarda en W BTFSC STATUS,C ; Testea si existe acarreo C CALL Inc_Res_H ; S. C=1. Incrementa el byte-alto del resultado MOVWF RES_L ; No. C=0. Copia el resultado byte-bajo ;****************** SUMAH ************* MOVF BYTE_H1,W ; Copia byte-alto del primer nmero al registro de trabajo ADDWF BYTE_H2,W ; Suma W con byte-alto del segundo nmero. Se guarda en W ADDWF RES_H,W ; No. C=0. Suma W con byte-alto del resultado MOVWF RES_H BCF STATUS,C RETURN ;******************************************************************** ; Cuando hay acarreo en la parte baja del byte Inc_Res_H INCF RES_H,F ; Incrementa el byte-alto del resultado BCF STATUS,C ; Limpia el bit C (acarreo) RETURN FINAL CLRF EN CLRF ENN CLRF SUMA RETURN ;;;;;;;;;;;;;;retardos:;;;;;;;;; retardo_255us clrf b1 decfsz goto BYTE_L1,W ;Copia byte-bajo del primer nmero al registro de
d1 d1, f b1
Diagrama de Bloques