PDA

View Full Version : Problem with 16f88 steep motor control



ken_23
- 4th July 2008, 12:25
Eiii people....
I have a problem with my 16f88!
I put the PIC to control a steep motor unipolar. After a while the motor crash and stop....i dont know why....I tested early in a 16f84 and it works fine!
I have changed to the 16f88 because I need A/D to my work....


Please help me....I need to fix this to complete my University final project!




The code is the following:

LIST P=16F88
#INCLUDE <P16F88.INC>
RADIX DEC
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

I_CNT EQU 254
COUNT EQU H'11'
COUNT1 EQU 03FH
MEM_H EQU 020H
TEMPO EQU 030H
DECISAO EQU 040H

ORG H'0000'

GOTO MAIN ;Vai para o programa principal

ORG H'0004'

BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
BCF INTCON, TMR0IF ; Limpa timer 0 interrupcao
INCFSZ COUNT,F ; Verifica se ha ouverflow
GOTO Saida ; Nao? entao segue
MOVLW I_CNT ; Restaura contador
MOVWF COUNT
CALL TOGGLE

Saida
RETFIE ;Sai da interrupçao


MAIN:
BCF STATUS, 6 ;Banco 1
BSF STATUS, 5
MOVLW B'00000001' ;PortA 0 analogica, as restantes sao digitais
MOVWF ANSEL
BCF ADCON1, VCFG1 ;Referencia do AD V++ e V--
BCF ADCON1, VCFG0
BCF ADCON1, ADFM ;Resultado do AD com ADRESL=1
BCF ADCON1, ADCS2
BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
BCF ADCON0, CHS2
BCF ADCON0, CHS1 ;Seleciona o canal RA0 como analogico
BCF ADCON0, CHS0
BCF ADCON0, ADCS1 ;Tad = 6.45 us para f=5 MHz
BSF ADCON0, ADCS0
BSF ADCON0, ADON ;activa o conversor
BCF STATUS, 6 ;Banco 1
BSF STATUS, 5
MOVLW B'11101111' ;PORT A como entrada menos a 5 que é saida
MOVWF TRISA
MOVLW B'00000000' ;PORT B como saida
MOVWF TRISB
MOVLW 50 ;Ajuste dos tempos para 1 s
MOVWF COUNT1

BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
MOVLW B'00000000' ;Limpa PORTB
MOVWF PORTB
BCF STATUS, 6 ;Banco 1
BSF STATUS, 5
MOVLW B'00000010'
MOVWF OPTION_REG
BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
BSF INTCON, TMR0IE ; Activa TMR0 interrupcao
BCF INTCON, TMR0IF ; Limpa flag de interrupcao
BSF INTCON, GIE ; Activa todas as interrupcoes
BCF T2CON, 2 ; Desactiva o Timer 2
MOVLW 20 ;Inicializa o FSR na posiçao 20
MOVWF FSR
MOVLW B'00000011'
MOVWF INDF ;FSR(0)=00000011
INCF FSR
MOVLW B'00001001'
MOVWF INDF ;FSR(1)=00001001
INCF FSR
MOVLW B'00001100'
MOVWF INDF ;FSR(2)=00001100
INCF FSR
MOVLW B'00000110'
MOVWF INDF ;FSR(3)=00000110
MOVLW 20 ;Inicializa o FSR na posiçao 20
MOVWF FSR

JJ
MOVLW B'00000001' ;Definiçao da variavel DECISAO
MOVWF DECISAO
GOTO WAIT

NN
MOVLW B'11111111' ;Definiçao da variavel DECISAO
MOVWF DECISAO
GOTO WAIT

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

WAIT
MOVLW 10
MOVWF TEMPO
Q DECFSZ TEMPO,F ;perde tempo 10 x 1 us devido á nova conversao
GOTO Q
BSF ADCON0, 2 ;inicia conversao
WE BTFSC ADCON0, 2
GOTO WE
MOVFW ADRESH
MOVWF MEM_H
SUBLW 102 ;Teste aos 2 V de entrada analogica
BTFSC STATUS, C
GOTO JJ
GOTO NN
GOTO WAIT


;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\
TOGGLE
BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
INCFSZ COUNT1 ;Ajuste dos tempos
GOTO SALTO1
MOVLW 1
MOVWF COUNT1
BTFSC PORTA, 4 ;Teste ao LED
GOTO LED_OFF
GOTO LED_ON
MOT
MOVFW DECISAO
SUBLW B'11111111'
BTFSC STATUS, Z ;W=0????
GOTO DIR
GOTO ESQ
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\
DIR
BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
INCF FSR ;Avança uma posiçao e escreve no PORTB
MOVF FSR,W
SUBLW 24
BTFSS STATUS,Z
GOTO SALTO3
MOVLW 20
MOVWF FSR
GOTO SALTO3

ESQ
BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
DECF FSR ;Retorna uma posicao atras e escreve no PORTB
MOVF FSR,W
SUBLW 19
BTFSS STATUS,Z
GOTO SALTO3
MOVLW 23
MOVWF FSR
GOTO SALTO3

SALTO3
BCF STATUS, 6 ;Banco 0
BCF STATUS, 5
MOVF INDF,W
MOVWF PORTB
RETURN

SALTO1
RETURN

LED_OFF
BCF PORTA,4
GOTO MOT ;Apaga o LED

LED_ON
BSF PORTA,4 ;Acende o LED
GOTO MOT

END