Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- List p=16f628a
- #include <P16F628A.INC>
- __CONFIG _WDT_OFF
- ;constante
- tempo EQU 0x20; 1,6 seg
- ;Variáveis
- cont0 EQU 0x20
- cont1 EQU 0x21
- cont2 EQU 0x22
- cont3 EQU 0x23
- curva EQU 0x24
- ;Posições Iniciais
- #define P1 PORTB,7
- #define P0 PORTB,6
- ORG 0x0000
- GOTO SETUP
- ORG 0x0004
- RETFIE
- SETUP:
- BANKSEL TRISA
- CLRF TRISA
- BANKSEL PORTA
- CLRF PORTA
- BANKSEL TRISB
- MOVLW B'11100000'
- MOVWF TRISB
- BANKSEL PORTB
- MOVFW PORTB
- CLRF PORTB
- GOTO setup2
- MAIN:
- BTFSC PORTB, 5 ; bit 5 informa se está em curva
- GOTO trat_curva1 ;se estiver, chama a rotina
- GOTO reto; chama a rotina que o caminho fica com os dois motores no sentido horário
- GOTO MAIN
- reto:
- BANKSEL PORTB
- ;Configurando o MOTOR1
- BSF PORTB,RB0
- BCF PORTB,RB1
- ;Configurando o MOTOR2
- BSF PORTB,RB2
- BCF PORTB,RB3
- GOTO MAIN
- trat_curva1: ; aqui será a curva correspondente ao bit 7
- BANKSEL curva
- BTFSS curva, 2
- GOTO trat_curva2
- ;o carrinho deve virar à direita se o bit mais significativo da curva for igual a 1, e à esquerda se zero
- BANKSEL PORTB
- BTFSC PORTB, 7
- CALL curva_direita
- BTFSS PORTB, 7
- CALL curva_esquerda
- BCF curva, 2
- CALL atraso
- GOTO MAIN
- trat_curva2:
- ; semelhante ao trat_curva1, com a diferença que o bit a ser testado é o 6
- BTFSS curva, 1
- GOTO trat_curva3;vai para a parte que gira 180° ou vai pro fim, conforme a posição atual, indicada pela variável curva
- BANKSEL PORTB
- BTFSC PORTB, 6
- CALL curva_direita
- BTFSS PORTB, 6
- CALL curva_esquerda
- BCF curva, 1
- CALL atraso
- GOTO MAIN
- trat_curva3:
- ;manda pro setup2, que seria a volta para a posição intermediária até o início
- BTFSC curva, 0
- GOTO setup2
- GOTO fim
- setup2:
- ;observando que as posições iniciais quando invertidas correspondem às novas curvas
- ;que devem ser realizadas, optamos por fazer um novo setup e voltar pro início,
- ;indicando com o 0 na posição 0 de curva que na próxima vez o carrinho deve parar
- BANKSEL PORTB
- COMF PORTB,0
- BANKSEL curva
- MOVLW 0x06
- MOVWF curva
- CALL cento_e_oitenta
- CALL atraso
- GOTO MAIN
- ;<curvas>
- curva_esquerda:
- ;para a roda esquerda
- BANKSEL PORTB
- BCF PORTB, 0
- BCF PORTB, 1
- RETURN
- curva_direita:
- ;para a roda direita
- BANKSEL PORTB
- BCF PORTB, 2
- BCF PORTB, 3
- RETURN
- cento_e_oitenta:
- ;motor 1 no sentido horário e motor 2 no sentido antihorário
- BANKSEL PORTB
- BSF PORTB, 0
- BCF PORTB, 1
- BCF PORTB, 2
- BSF PORTB, 3
- RETURN
- ;</curvas>
- ;<atraso>
- atraso:
- BANKSEL cont0
- MOVLW tempo
- MOVWF cont0
- GOTO atraso_00
- atraso_00
- MOVLW 0xfa
- MOVWF cont1
- DECFSZ cont0
- GOTO atraso_01
- RETURN
- atraso_01
- MOVLW 0x14
- MOVWF cont2
- DECFSZ cont1
- GOTO atraso_02
- GOTO atraso_00
- atraso_02
- MOVLW 0x08
- MOVWF cont3
- DECFSZ cont2
- GOTO atraso_03
- GOTO atraso_01
- atraso_03
- DECFSZ cont3
- NOP
- GOTO atraso_02
- ;</atraso>
- fim: ;É chamada quando chega no destino, para os dois motores
- BANKSEL PORTA
- MOVLW 0xff
- MOVWF PORTA
- BANKSEL PORTB
- BCF PORTB,0
- BCF PORTB,1
- BCF PORTB,2
- BCF PORTB,3
- GOTO fim
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement