CLEAR
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISC = %10000001
TRISB = %00000000
'Initialize USART
'TRISC = %10111111 ' Set TX (PortC.6) to out, rest in
'SPBRG = 25 ' Set baud rate to 2400
'RCSTA = %10010000 ' Enable serial port and continuous receive
'TXSTA = %00100000
'DEFINE HSER_RCSTA 90h
'DEFINE HSER_TXSTA 24h
'DEFINE HSER_BAUD 2400
INTCON = %11000000 ' activamos las interrupciones y las de periféricos
ON INTERRUPT GoTo serie ' Declare interrupt handler routine
PIE1.5 = 1 ' activamos la interrupción de recepción de la USART
SPBRG = 25 ' Set baud rate to 2400
RCSTA = %10010000 ' Enable serial port and continuous receive
TXSTA = %00100000 ' Enable transmit and asynchronous mode
OPTION_REG =%11100000 'TMR0 EN MODO CONTADOR
ADCON1=7 'PUERTO A DIGITAL
TRISA = %111111 'PUERTO A COMO ENTRADAS
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
DEFINE HPWM2_TIMER 2 '
VTMR1 VAR WORD 'variable para acumular captura del timer1
CAPTURA VAR WORD
SENTIDO VAR BIT 'sentido de giro
FRENADO VAR BIT
MOV VAR BIT
FPWM VAR WORD 'frecuencia del pwm
VEL VAR BYTE 'velocidad de gigo del motor 0-255
POS VAR WORD 'set point
ACUM VAR WORD
DESCONTAR VAR WORD
SENT2 VAR BIT
DATOE VAR WORD 'VARIABLE PARA CAPTURAR ENTRADA DEL RS232
DATOS VAR WORD 'VARIABLE PARA ENVIAR DATAOS POR RS232
DATOE=0
INTCON.2=0 'bandera que se activa cuando se desborda el TMR0
symbol B1=PORTA.0
ACUM=0
VTMR1=0
SENTIDO=1
POS=650 '650 pulsos del encoder
FRENADO=0
FPWM=15000 'FRECUENCIA PARA HPWM
SENT2=1
T2CON = %00000001 'sincroniza reloj externo, apaga oscilador, 1:1 preescaler
VEL=125
TMR0=0 'CONTADOR A CERO
portc.5=1 'SENTIDO DE GIRO
HPWM 2, VEL,FPWM 'MOTOR GIRA SENTIDO=1 CON HPWM DE CCP2
HPWM 1, 0, FPWM 'SENTIDO=0 NO GIRA VEL=0 EN EL CCP1
MOV=1
Inicio:
IF B1=1 THEN GOTO CAM_POS 'si presiono B1 cambio la posicion a la que
IF SENT2 <> PORTC.5 THEN 'si cambia el sentido de giro contador a cero
SENT2=PORTC.5 'ultimo sentido de giro se actualiza
TMR0=0 'contador a cero
ENDIF
IF INTCON.2=1 THEN 'se desbordo el TMR0?
IF PORTC.5 = 1 THEN 'sentido=1 acumula, si no descuenta
ACUM=ACUM+256
ELSE
ACUM=ACUM-256
ENDIF
INTCON.2=0 'apago bandera de desbordamiento
ENDIF
if PORTC.5 = 1 then ' aqui esta el valor real del contador
VTMR1=ACUM + TMR0 ' contador = acumulado mas valor actual del TMR0
else
VTMR1=ACUM - TMR0 ' contador = acumulado menos valor actual del TMR0
endif
IF vTMR1 = POS THEN 'si llegaste al set point PWM=0 y frena el motor
VEL=0
goto Frenar
ENDIF
GOTO Inicio
Frenar:
hpwm 2,0,FPWM 'VEL=0
HPWM 1, 0, FPWM 'VEL=0
IF PORTC.5=1 THEN 'lo qu esta en el TMR0 se pasa al acumulado
ACUM=ACUM+TMR0
ELSE
ACUM=ACUM-TMR0
ENDIF
FRENADO=1
TMR0=0
VEL = 0
GOTO Inicio
CAM_POS:
if B1=1 THEN GOTO CAM_POS
PAUSE 10
IF POS=650 AND MOV=1 THEN 'gira en sentido =1
POS=2600
MOV=0
portc.5=1
VEL=160
TMR0=0
HPWM 2,VEL,FPWM
HPWM 1, 0, FPWM
ENDIF
IF POS=2600 AND MOV=1 THEN 'gira en sentido=0
POS=650
portc.5=0
VEL=160
TMR0=0
MOV=0
HPWM 2,0,FPWM
HPWM 1, VEL, FPWM
ENDIF
MOV=1
GOTO INICIO
serie:
DISABLE
'PIE1.5=0
'if RCSTA.1=1 then
''gosub resetusart
'PORTB.4=1
'PAUSE 500
'PORTB.4=0
'RCSTA.4=0
'PAUSE 1
'RCSTA.4=1
'endif
'HSEROUT [12]
'PORTB.7=1
'PAUSE 100
'PORTB.7=0
'HSerin [char] ' Read USART and store character to next empty location
'HSEROUT [CHAR]
If PIR1.4 = 1 Then ' ' Wait for transmit register empty
portb.7=1
PAUSE 100
PORTB.7=0
ENDIF
If PIR1.5 = 1 Then ' If receive flag then...
DATOE = RCREG ' recibo datos del rs232 de la PC
'hserin [datoe]
PORTB.4=1
PAUSE 100
PORTB.4=0
IF DATOE=="2" THEN PORTB.7 = 1 'esto nunca se cumple por que DATOE=r
IF DATOE=="1" THEN PORTB.4 = 1 'esto nunca se cumple por que DATOE=q
TXREG = DATOE 'envio lo que recibi hacia la PC
Endif
INTCON = %11000000
enable
RESUME
END