Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Microcontroladores => Tópico iniciado por: gurob em 04 de Janeiro de 2012, 20:59
-
Olá amigoS
Estou fazendo uma programação, usando o PIC 12F675, pois pretendo usar para uma produção em larga escala e esse pic é o mais barato que encontrei com saídas suficientes pra controlar um motor de passo.
Depois de sofrer um bocado eu cheguei num código que creio estar correto, porém quando coloco na protoboard usando leds, ele só dá certo girando pra um lado, o outro lado não gira nada. Além do que os leds ficam piscando aleatoriamente, creio que se trata de alguma interferencia. Quando eu chego com as mãos perto dos leds eles começam a piscar, e se afasto eles param, parece até coisa do além, nunca vi isso.
Não sei o que pode ser, já estou vesgo de tanto olhar pra tela do computador.
Se alguem puder dar uma olhada no código abaixo e me dar alguma dica, ficaria muito grato.
Obrigado
Gustavo
list p=12f675 ; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
;----------------------------------------------------------------------
; Configuração
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF; & _BODEN_ON
;----------------------------------------------------------------------
;
;----------------------------------------------------------------------
#define BOB4 GPIO,0 ; (o) saída bobina 4
#define BOB3 GPIO,1 ; (o) saída bobina 3
#define BOT_DIR GPIO,2 ; (i) entrada bot_DIR
#define BOT_ESQ GPIO,3 ; (i) entrada bot_ESQ
#define BOB2 GPIO,4 ; (o) saída bobina 2
#define BOB1 GPIO,5 ; (o) saída bobina 1
;----------------------------------------------------------------------
; MEMÓRIA DO SISTEMA
;----------------------------------------------------------------------
CBLOCK 0X20 ;ENDERECO INICIAL DA MEMORIA DO USUARIO
TEMPO_3
TEMPO_2
TEMPO_1
ENDC
;**********************************************************************************
; VETOR DE RESET
;**********************************************************************************
ORG 0X00 ;ENDERECO INICIAL DO PROCESSAMENTO
GOTO INICIO
ORG 0x004 ;INTERRUPÇÃO
RETFIE
INICIO
BSF STATUS,RP0
MOVLW b'00001100' ;ENTRADAS (1) E SAIDAS (0)
MOVWF TRISIO
BCF STATUS,RP0
movlw b'00000000' ;ESTIPULA O NIVEL DO SINAL DE CADA PINO (LEDS EM BAIXA E BOTOES DESLIGADOS)
movwf GPIO
;-----------------------------------------------------------------------------
; LOOPING DO PROGRAMA
;-----------------------------------------------------------------------------
MAIN
; CLRF GPIO ; POSSIVEL CAUSADOR DOS PAUS
TEST1
BTFSS BOT_DIR ;se o botao direita estiver apertado entao chama MOVE_DIR
GOTO TEST2 ; se não estiver apertado, entao chama TEST2
GOTO MOVE_DIR
TEST2
BTFSS BOT_ESQ ;Acho que aqui deveria ser BTFSS
GOTO MAIN
GOTO MOVE_ESQ
MOVE_DIR
BSF BOB1
CALL ROT3
BCF BOB1
CALL TESTA_DIR
BSF BOB2
CALL ROT3
BCF BOB2
CALL TESTA_DIR
BSF BOB3
CALL ROT3
BCF BOB3
CALL TESTA_DIR
BSF BOB4
CALL ROT3
BCF BOB4
CALL TESTA_DIR
GOTO MOVE_DIR
MOVE_ESQ
BSF BOB4
CALL ROT3
BCF BOB4
CALL TESTA_ESQ
BSF BOB3
CALL ROT3
BCF BOB3
CALL TESTA_ESQ
BSF BOB2
CALL ROT3
BCF BOB2
CALL TESTA_ESQ
BSF BOB1
CALL ROT3
BCF BOB1
CALL TESTA_ESQ
GOTO MOVE_ESQ
;-----------------------------------------------------------------------------
;PROCEDIMENTOS
;-----------------------------------------------------------------------------
TESTA_DIR
BTFSS BOT_DIR
GOTO MAIN
RETURN
TESTA_ESQ
BTFSC BOT_ESQ
GOTO MAIN
RETURN
;-----------------------------------------------------------------------------
;ROTINA DE TEMPO
;-----------------------------------------------------------------------------
ROT3
MOVLW .2
MOVWF TEMPO_3
REPETE_3
NOP
CALL ROT2
NOP
DECFSZ TEMPO_3
GOTO REPETE_3
RETURN
ROT2
MOVLW .1
MOVWF TEMPO_2
REPETE_2
CALL ROT1
NOP
DECFSZ TEMPO_2
GOTO REPETE_2
RETURN
GOTO MAIN
ROT1
MOVLW .9
MOVWF TEMPO_1
REPETE
NOP
DECFSZ TEMPO_1
GOTO REPETE
NOP
RETURN
GOTO MAIN
;-----------------------------------------------------------------------------
;FIM DA ROTINA DE TEMPO
;-----------------------------------------------------------------------------
GOTO MAIN
END
-
Gurob,
Bom dia, qual o seu nome? Em que você trabalha? Você poderia se apresentar?
-
Gurob
Não gosto de dar o peixe ,mas........ acho que é isto que vc quer , espero que analise o prog e que se APRESENTE.
list p=12f675 ; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
;----------------------------------------------------------------------
; Configuração
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF; & _BODEN_ON
;----------------------------------------------------------------------
;
;----------------------------------------------------------------------
#define BOB1 GPIO,0 ; (o) saída bobina 1
#define BOB2 GPIO,1 ; (o) saída bobina 2
#define BOB3 GPIO,4 ; (o) saída bobina 3
#define BOB4 GPIO,5 ; (o) saída bobina 4
#define BOT_DIR GPIO,2 ; (i) entrada bot_DIR
#define BOT_ESQ GPIO,3 ; (i) entrada bot_ESQ
;----------------------------------------------------------------------
; MEMORIA DO SISTEMA
;----------------------------------------------------------------------
CBLOCK 0X20 ;ENDERECO INICIAL DA MEMORIA DO USUARIO
INDEX
TEMPO_2
TEMPO_1
ENDC
;**********************************************************************************
; VETOR DE RESET
;**********************************************************************************
ORG 0X00 ;ENDERECO INICIAL DO PROCESSAMENTO
GOTO INICIO
ORG 0x004 ;INTERRUP€™ES
RETFIE
BYTE
ADDWF PCL
RETLW B'00010001'
RETLW B'00100001'
RETLW B'00100010'
RETLW B'00010010'
RETURN
INICIO
BSF STATUS,RP0
MOVLW b'00001100' ;ENTRADAS (1) E SAIDAS (0)
MOVWF TRISIO
MOVLW 0X00 ;DESABILITA ENT ANALOGICAS
MOVWF ANSEL
BCF STATUS,RP0
MOVLW 0X07 ;DESLIGA COMPARADOR
MOVWF CMCON
MOVLW B'00010001' ;CARREGA SAIDA DO MOTOR
MOVWF GPIO
CLRF INDEX
;-----------------------------------------------------------------------------
; LOOPING DO PROGRAMA
;-----------------------------------------------------------------------------
MAIN
TEST1
BTFSS BOT_ESQ ;se o botao esquerda estiver apertado entao chama MOVE_esq
GOTO TEST2 ;se não estiver apertado, entao chama TEST2
GOTO MOVE_ESQ
TEST2
BTFSS BOT_DIR
GOTO MAIN
MOVE_DIR
INCF INDEX
MOVLW B'00000011'
ANDWF INDEX,W
CALL BYTE
MOVWF GPIO
CALL DELAY
GOTO MAIN
MOVE_ESQ
DECF INDEX
MOVLW B'00000011'
ANDWF INDEX,W
CALL BYTE
MOVWF GPIO
CALL DELAY
GOTO MAIN
;-----------------------------------------------------------------------------
;ROTINA DE TEMPO (AQUI VC AJUSTA A VELOCIDADE DO MOTOR)
;-----------------------------------------------------------------------------
DELAY ;DELAY DE 0,0025 S
movlw 0xF3
movwf TEMPO_1
movlw 0x02
movwf TEMPO_2
Delay_0
decfsz TEMPO_1, f
goto $+2
decfsz TEMPO_2, f
goto Delay_0
goto $+1
RETURN
;-----------------------------------------------------------------------------
;FIM DA ROTINA DE TEMPO
;-----------------------------------------------------------------------------
END
abraço