Apéndice D Código del microcontrolador Apéndice D Código del microcontrolador 101 Apéndice D Código del microcontrolador list p=16f877a #include <p16f877a.inc> ;----- Declaración de variables del banco 0----datot equ 0x20 ;Dato a transmitir por puerto serial dator equ 0x21 ;Dato recibido por puerto serial timl equ 0x22 ;Valor menos significativo de TMR1 timh equ 0x23 ;Valor mas significativo de TMR1 cont equ 0x24 ;Contadores para generar retardo cont2 equ 0x25 cont3 equ 0x26 ;-----bytes de comando que se esperan del puerto serial----byte1 equ 0x27 ;Byte de accion byte2 equ 0x28 ;Byte de seleccion de robot byte3 equ 0x29 ;Velocidad de motor izquierdo byte4 equ 0x2a ;Velocidad de motor derecho ;-----Valores que determinan la posicion del servo motor---byte5 equ 0x2b ;Inicial menos significaiva byte6 equ 0x2c ;Inicial mas significaiva byte7 equ 0x2d ;Final menos significaiva byte8 equ 0x2e ;Final mas significaiva org 0x00 nop goto inicio ;-----Vector de interrupciones------org 0x04 bcf STATUS,5 bcf RCSTA,CREN btfsc PIR1,RCIF ;si es interrupcion de recepcion goto RC_ISR btfsc PIR1,TXIF ;si es interrupcion de transmicion goto TX_ISR btfsc INTCON,TMR0IF ;si es interrupcion de TMR0 goto TMR0_ISR btfsc PIR1,TMR1IF ;si es interrupcion de TMR1 goto TMR1_ISR retfie inicio ;----- banco 0----bcf STATUS,6 bcf STATUS,5 ;------Configuración del puerto D y bit0 de puerto C como salidas--;---- banco 1------bsf STATUS,5 clrf TRISD bcf TRISC,0 ;*************Configuracion de comunicacion serial**************** ;---- banco 0------bcf STATUS,5 bsf RCSTA,7 ;habilitacion de los pines como puerto serial bcf RCSTA,6 ;deshabilitación del palabras de 9 bits ;---- banco 1------bsf STATUS,5 bsf TRISC,7 ;puerto c<7> entrada bcf TRISC,6 ;puerto c<6> salida movlw 0x1f movwf SPBRG ;configuración del Baud Rate Generator Register bcf TXSTA,2 bcf TXSTA,4 ;seleccion del modo asincrono. bsf PIE1,4 ;habilitacion de interrupcion de transmicion bcf TXSTA,6 ;transmicion de 8 bits bsf PIE1,5 ;habilitacion de interrupcion de recepcion ;************** Configuracion de TMR0****************************** ;---- banco 0----bcf STATUS,5 clrf TMR0 ;limpia contador ;---- banco 1----bsf STATUS,5 movlw 0xc7 ;preescala a TMR0,incremento en cambio de bajo a alto en CLK y CLK interno andwf OPTION_REG,1 movlw 0x07 ;preescala 1:256 iorwf OPTION_REG,1 bcf INTCON,TMR0IE ;deshabilita interrupcion de TMR0 ;**************** Configuracion de TMR1**************************** ;---- banco 0----bcf STATUS,5 102 Apéndice D clrf TMR1L clrf TMR1H movlw 0x30 movwf T1CON ;---- banco 1----bsf STATUS,5 bsf PIE1,TMR1IE Código del microcontrolador ;limpia contadores ;preescala 1:8 ;habilita interrupcion de TMR1 ;************** configuracion de modulos pwm *************** ;---- banco 1----bsf STATUS,5 movlw 0xff movwf PR2 ;PR2-->periodo pwm de 1/1.22KHz bcf TRISC,2 ;PWM1 OUTPUT bcf TRISC,1 ;PWM2 OUTPUT ;---- banco 0----bcf STATUS,5 movlw 0x00 movwf CCP1CON movwf CCP2CON movlw 0x00 movwf CCPR1L movwf CCPR2L movlw 0x07 movwf T2CON movlw 0x1f movwf CCP1CON movwf CCP2CON ; duty cycle = 0% ;preescala tmr2 = 16 ;establece modo pwm ;-----limpia PORTD-----clrf PORTD ;---- habilitación de interrupciones -----bsf INTCON,PEIE bsf INTCON,GIE ;*********Programa principal************* ; Algoritmo ; 1.- espera recibir un dato ; 1.a- si dato = 0, va a 1 ; 1.b- de lo contrario va a 2 ; 2.- espera recibir un dato ; 2.a- si dato = 0, va a reset ; 2.b- de lo contrario guarda dato en byte1 y va a 3 ; 3.- espera dato y lo guarda en byte2 ; 4.- espera dato y lo guarda en byte3 ; 5.- espera dato y lo guarda en byte4 ; 6.- espera dato y lo guarda en byte5 ; 7.- espera dato y lo guarda en byte6 ; 8.- espera dato y lo guarda en byte7 ; 9.- espera dato y lo guarda en byte8 ; 10.- va a filtro ; 10.a- si byte2<0> = 0 regresa a 1 ; 10.b- de lo contrario ; 10.b.1-si byte1<4> = 1 va a patada ; 10.c- va a dcmotors ; 10.d- regresa a 1 main call recepcion movf dator,0 btfsc STATUS,Z goto main ;1 ;1.a call recepcion movf dator,0 btfsc STATUS,Z goto reset movwf byte1 ;2 ;2.a call recepcion movf dator,0 movwf byte2 ;3 call recepcion movf dator,0 movwf byte3 ;4 call recepcion movf dator,0 movwf byte4 ;5 call recepcion movf dator,0 ;6 ;1.b ;2.b 103 Apéndice D Código del microcontrolador movwf byte5 call recepcion movf dator,0 movwf byte6 ;7 call recepcion movf dator,0 movwf byte7 ;8 call recepcion movf dator,0 movwf byte8 ;9 goto filtro ;10 ;******* transmite datot por puerto serial********* transmicion movf datot,0 bsf STATUS,5 bsf PIE1,TXIE bcf STATUS,5 movwf TXREG bsf STATUS,5 bsf TXSTA,5 return ;habilita interupcion de transmicion ;se carga dato a transmitir ;habilita transmicion ;******* espera recibir dato por puerto serial y guarda en dator********* recepcion bsf bsf bcf bsf STATUS,5 PIE1,RCIE STATUS,5 RCSTA,4 loop ;habilita interrupcion de recepcion ;espera a que se reciba un dato bsf STATUS,5 btfsc PIE1,RCIE goto loop bcf STATUS,5 return ;**********TMR0 determina periodo de PWM-LF = 11ms******** TMR0_ISR bcf INTCON,TMR0IF ; deshabilita intterrupcion de TMR0 movlw 0x29 ;valor que da un periodo de 11ms movwf TMR0 movf timl,0 ;valores TMR1 que determinan ciclo de trabajo movwf TMR1L movf timh,0 movwf TMR1H movlw 0x31 ;se prende TMR1 movwf T1CON bsf PORTC,0 ;se establece PORTC<0> bsf INTCON,PEIE ;activa interrupciones bsf INTCON,GIE bsf INTCON,TMR0IE retfie ;*********TMR1 determina ciclo de trabajo PWM-LF TMR1_ISR bcf PIR1,TMR1IF ;deshabilita interrupciones de TMR1 bcf PORTC,0 ;limpia PORTC<0> bcf T1CON,0 ;apaga TMR1 bsf INTCON,PEIE ;habilita interrupciones bsf INTCON,GIE bsf STATUS,5 bsf PIE1,TMR1IE bcf STATUS,5 retfie RC_ISR bsf STATUS,5 bcf PIE1,RCIE bcf STATUS,5 bsf INTCON,PEIE bsf INTCON,GIE movf RCREG,0 movwf dator retfie ;deshabilita interupcion de recepcion ;habilita interrupciones ;guarda el dato recibido TX_ISR bcf PIR1,TXIF bsf STATUS,5 bcf PIE1,TXIE ;limpia bandera de interupcion de transmicion ;deshabilita interupcion de transmicion 104 Apéndice D Código del microcontrolador bcf STATUS,5 bsf INTCON,PEIE bsf INTCON,GIE bcf RCSTA,CREN retfie ;habilita interrupciones filtro btfss byte2,0 goto main btfsc byte1,4 call patada call dcmotors goto main dcmotors movf byte3,0 movwf CCPR1L movf byte4,0 movwf CCPR2L movf byte1,0 movwf PORTD return patada ;10.a ;10.b ;10.c ;10.b.1 ;10.d ;carga valor de byte3 a ciclo de trabajo de PWM1 ;para determinar velocidad de motor izquierdo ;carga valor de byte4 a ciclo de trabajo de PWM2 ;para determinar velocidad de motor derecho ;pone byte1 en PORTD para determinar direccion de ambos motores bsf INTCON,TMR0IE movf byte5,0 movwf timl movf byte6,0 movwf timh call retardo movf byte7,0 movwf timl movf byte8,0 movwf timh call retardo bcf INTCON,TMR0IE return ;enciende TMR0 ;ciclo de trabajo de PWM_lf para posicion inicial clrf clrf clrf clrf clrf clrf clrf goto ;detiene ambos motores de DC ;ciclo de trabajo = 0 en PWM1 ;ciclo de trabajo = 0 en PWM2 ;ciclo de trabajo de PWM-LF = 0 ;ciclo de trabajo de PWM_lf para posicion final ;apaga TMR0 reset PORTD CCPR1L CCPR2L byte5 byte6 byte7 byte8 main ;regresa a 1 ;**** retardo de 705.96 ms ********************************** ;**** para dar tiempo a servo motor cambiar de posicion **** retardo movlw 0x12 movwf cont ret movlw 0xff movwf cont2 ret2 movlw 0xff movwf cont3 ret3 decfsz cont3 goto ret3 decfsz cont2 goto ret2 decfsz cont goto ret return goto main end 105