;************************************************************** ;* Controle para motores de passo ;* ;* Marcio Jose Soares - 10/02/2003 ;************************************************************** ; ;************************************************************** ;definições do programa ;************************************************************** radix dec ;padrao->valores decimal include ;inclue arquivo __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits PICRES equ 0x00 ;endereço de reset PICINT equ 0x04 ;endereço de interrupções PICRAM equ 0x0C ;endereço da RAM CHV1 equ 0 ;i/o da chave para mover a direira CHV2 equ 1 ;i/o da chave para mover a esquerda CHV3 equ 2 ;i/o da chave para parar o motor ; ;************************************************************** ;variaveis do programa ;************************************************************** org PICRAM T1 res 1 ;variável para temporizador T2 res 1 ;variável para temporizador T3 res 1 ;variável para temporizador T4 res 1 ;variável para temporizador SENT res 1 ;variável sentido CONT res 1 ;variável contador ; ;************************************************************** ;area do reset ;************************************************************** org PICRES ;reset goto inicio ;desvia do endereco 0x04 - interrupção ; ;************************************************************** ;area das interrupções ;************************************************************** org PICINT ;toda interrupção aponta para este endereço retfie ;retorno de interrupção ; ;************************************************************** ;inicio do programa ;************************************************************** inicio: movlw 0x00 ;ajuste para os bits INTCON movwf INTCON ;desabilita ints clrf PORTA ;limpa portas clrf PORTB bsf STATUS,RP0 ;seleciona banco 1 para options e tris movlw 0x07 ;ajusta os bits em A como entradas movwf TRISA ;exceto RA2, RA3 e RA4 movlw 0x00 ;ajusta os bits em B como saída movwf TRISB ; bcf STATUS,RP0 ;volta ao banco 0... (padrão do reset) movlw 0x03 ;carrega variável sentido movwf SENT ;para motor parado ; ;************************************************************** ;loop principal do programa ;************************************************************** principal: btfsc PORTA, CHV1 ;testa chave 1 call tec1 ;pressionada, gira horário btfsc PORTA, CHV2 ;testa chave 2 call tec2 ;pressionada, gira anti-horário btfsc PORTA, CHV3 ;testa chave 3 call tec3 ;pressionada, para motor movf SENT,W ;prepara para comparar sentido xorlw 0x01 ;é igual a 1 btfsc STATUS,Z call gira_ho movf SENT,W ;prepara para comparar sentido xorlw 0x02 ;é igual a 2 btfsc STATUS,Z call gira_anti movf SENT,W ;prepara para comparar sentido xorlw 0x03 ;é igual a 3 btfsc STATUS,Z call parar goto principal ;faz infinitamente ; ;************************************************************** ;subrotinas de operação das teclas ;************************************************************** tec1: call _5ms ;aguarda para verificar se tecla ainda ;precionada btfsc PORTA, CHV1 ;testa chave 1 novamente goto tec1_1 ;pressionada, gira horário goto fimtec tec1_1: movlw 0x01 ;carrega com 01 movwf SENT ;variável do sentido goto fimtec tec2: call _5ms ;aguarda para verificar se tecla ainda ;precionada btfsc PORTA, CHV2 ;testa chave 2 novamente goto tec2_1 ;pressionada, gira anti-horário goto fimtec tec2_1: movlw 0x02 ;carrega com 02 movwf SENT ;variável do sentido goto fimtec tec3: call _5ms ;aguarda para verificar se tecla ainda ;precionada btfsc PORTA, CHV3 ;testa chave 3 novamente goto tec3_1 ;pressionada, gira horário goto fimtec tec3_1: movlw 0x03 ;carrega com 03 movwf SENT ;variável do sentido fimtec: return ; ;************************************************************** ;subrotinas de operação do motor ;************************************************************** gira_ho: movlw 0x01 ;gira no sentido horário movwf CONT ;carrega valor no contador g_ho: movf CONT,W call tabela ;busca valor na tabela movwf PORTB ;movimenta motor call tempmotor ;temporiza incf CONT,F ;incrementa até 5 movf CONT,W xorlw 0x05 ;compara com 5 btfss STATUS,Z ;se igual, retorna goto g_ho ;se não continua return gira_anti: movlw 0x04 ;gira no sentido anti-horário movwf CONT ;carrega contador g_anti: movf CONT,W call tabela ;busca valor na tabela movwf PORTB ;movimenta motor call tempmotor ;temporiza decfsz CONT,F ;decrementa até 0 goto g_anti ;ainda não é zero, continua return ;igual a zero, retorna parar: movlw 0x00 ;prepara para parar movwf PORTB ;zera porta B return tabela: addwf PCL ;tabela com valores para bobinas retlw 0x00 ;valor 0, sem uso (mas não retire!!!) retlw 0x06 ;binário 0110 retlw 0x05 ;binário 0101 retlw 0x09 ;binário 1001 retlw 0x0A ;binário 1010 tempmotor: ;experimente trocar os valores de temporização ;call _5ms ;call _20ms ;call _200ms ;call _1000ms call _20ms ;temporiza return ;********************************************************* ; rotinas de temporização ;********************************************************* _1ms: movlw 0x02 ;carrega W com 01 movwf T1 ;carrega T1 com W movlw 0x00 ;carrega T4 com 0 movwf T4 goto car_1 _5ms: movlw 0x06 ;carrega W com 06 movwf T1 ;carrega T1 com W movlw 0x00 ;carrega T4 com 0 movwf T4 goto car_1 _20ms: movlw 0x18 ;carrega W com 24 movwf T1 ;carrega T1 com W movlw 0x00 ;carrega T4 com 0 movwf T4 goto car_1 _200ms: movlw 0x01 ;carrega W com 86 movwf T1 ;carrega T1 com W movlw 0x01 ;carrega T4 com 1 movwf T4 goto car_1 ;aguarda 1 segundo com clock de 4MHz _1000ms: movlw 0x06 ;carrega W com 4 movwf T3 ;carrega T3 com 4 movlw 0x01 ;carrega T4 com 1 movwf T4 car: movlw 0xff ;carrega W com 255 movwf T1 ;carrega T1 com W btfsc T4,0 ;testa bit 0 de T4 decfsz T3,F ;decrementa T3 goto car_1 return car_1: movlw 0xFF ;carrega W com 255 movwf T2 ;carrega T2 com 255 dec_1: decfsz T2,1 ;decrementa T2 goto dec_1 ;255 x T1 vezes decfsz T1,1 ;decrementa T1 goto car_1 ;volta a carregar T2 btfsc T4,0 ;testa bit 0 de T4 goto car ;retorna 0 em W return ; ;********************** ;* fim do programa ;********************** end