Apéndice D

Anuncio
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
Descargar