[size=2]
;-------------------------------------------------------------
;Software para comando de Joystick e potenciometro
;ROV - Abissal
;Byte 1:
; 7 6 5 4 3 2 1 0
; |----S1---|--------M2-------|--------M1--------|
;
;Byte 2:
; 7 6 5 4 3 2 1 0
; Z- Z+ L3 L2 L1 |-------M3--------|
;
;
; M1 - controle do motor 1 (estados RR,MR,LR,P,LF,MF,RF)
; M2 - controle do motor 2 (estados RR,MR,LR,P,LF,MF,RF)
; M3 - controle do motor 3 (estados RB,MB,LB,P,LC,MC,RC)
; S1 - aciona servo 1
;
; L1 - liga/desliga a iluminação frontal
; L2 - liga/desliga a iluminação traseira
; L3 - liga/desliga a iluminação ou alguma outra carga extra
; Z+ - aproximar Zoom
; Z- - afastar Zoom
;---------------------------------------------------------------
list P=16F877A
#include "P16F877A.INC"
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON
errorlevel -302 ; turn off bank bits warning
;
; Seleção de entradas do MUX (ADDCON0)
;
#DEFINE EAN_0 B'01000001' ; f/8, AN0, DONE, A/D On
#DEFINE EAN_1 B'01001001' ; f/8, AN1, DONE, A/D On
#DEFINE EAN_2 B'01010001' ; f/8, AN2, DONE, A/D On
#DEFINE EAN_3 B'01011001' ; f/8, AN3, DONE, A/D On
#DEFINE BOTAO PORTB,7 ; porta do botão da iluminação - 0 = pressionado 1 = liberado
#DEFINE ZOOM_P PORTB,6 ; porta do zoom+ 0 = pressionado 1 = liberado
;
; Saídas
;
#DEFINE LED1 PORTD,7 ;Porta do LED 0 = apagado 1 = aceso
#DEFINE LED2 PORTD,6 ;Porta do LED_D2 0 = apagado 1 = aceso
#DEFINE LED3 PORTD,5 ;Porta do LED_D3 0 = apagado 1 = aceso
#DEFINE LED4 PORTD,4 ;Porta do LED_D4 0 = apagado 1 = aceso
;
; Variáveis da RAM internas
;
cblock H'20'
ld_loop_ex
ld_loop_in
Valor_AN0
Valor_AN1
Valor_AN2
Valor_AN3
Valor_DIG_0
Valor_ZOOM_P
Estado_botao
endc
;
; Inicio do Programa
;
ORG 0h
; Inicializaçao do PIC, do display e da porta serial
bcf STATUS,RP1
bsf STATUS,RP0 ; Habilita banco 1
clrf TRISD ; porta do display, de saída
movlw B'00000010' ; setup do conversor A/D
movwf ADCON1 ; left justify result
; port A: only analogue inputs
;
; Ajusta parametros da UART (usando cristal externo de 4MHz)
; Baud Rate = 9600 bps, No Parity, 1 Stop Bit
;
movlw 0x19 ; 0x19=9600 bps / 0x0C=19200 bps
movwf SPBRG
movlw b'00100100' ; TX_Enable, assync. mode, brgh = high (2)
movwf TXSTA ; enable Async Transmission, BRGH=1
movlw b'10111111' ; RC6 saida, outros bits da PORTC sao de entrada
movwf TRISC
bcf STATUS,RP0 ; Habilita banco 0
clrf PORTD ; zera saídas do display
movlw b'01000000' ; Setup Port C
movwf PORTC ; RC6(TX)=1 others are 0
movlw b'10000000' ; habilita a UART
movwf RCSTA
movlw b'11111111' ; PORTB todo como entrada
movwf TRISB
;
; Loop principal
;
start:
;-------Ler entradas
movlw EAN_0 ; lendo entrada analógica 0
call read_ad ; chama a rotina de conversão AD
movwf Valor_AN0 ; carrega o valor convertido em Valor_AN0
movlw EAN_1 ; lendo entrada analógica 1
call read_ad ; chama a rotina de conversão AD
movwf Valor_AN1 ; carrega o valor convertido em Valor_AN1
movlw EAN_2 ; lendo entrada analógica 2
call read_ad ; chama a rotina de conversão AD
movwf Valor_AN2 ; carrega o valor convertido em Valor_AN2
movlw EAN_3 ; lendo entrada analógica 3
call read_ad ; chama a rotina de conversão AD
movwf Valor_AN3 ; carrega o valor convertido em Valor_AN3
btfsc BOTAO ; lendo entrada digital 0. O botão está pressionado ?
call pressionado ; Sim, então vá para rotina pressionado.
call liberado ; Não, então vá para rotina liberado.
btfsc ZOOM_P ; lendo entrada digital 0. O botão está pressionado ?
call zoom_menos ; Não, então vá para rotina zoom_mais.
call zoom_mais ; Sim, então vá para rotina zoom_menos.
movwf Valor_ZOOM_P ;carrega o valor de LED aceso em Valor_DIG_0
goto envia ;vai para a rotina envia
liberado:
bsf LED1 ;apaga o LED
movlw b'00001000'
movwf Valor_DIG_0 ;carrega o valor de LED apagado em Valor_DIG_0
goto envia ;vai para a rotina envia
return
pressionado:
bcf LED1
movlw b'00000000' ;acende o LED
movwf Valor_DIG_0 ;carrega o valor de LED aceso em Valor_DIG_0
goto envia ;vai para a rotina envia
return
zoom_mais:
bsf LED2
movlw b'00001000' ;acende o LED
;movwf Valor_ZOOM_P ;carrega o valor de LED aceso em Valor_DIG_0
;goto envia ;vai para a rotina envia
return
zoom_menos:
bcf LED2
movlw b'00000000' ;acende o LED
;movwf Valor_ZOOM_P ;carrega o valor de LED aceso em Valor_DIG_0
;goto envia ;vai para a rotina envia
return
;-------Enviando dadops pela serial
envia:
movfw Valor_AN0 ; recupera o valor convertido para ser enviado
call send ; chama a rotina de envio pela serial
movfw Valor_AN1 ; recupera o valor convertido para ser enviado
call send ; chama a rotina de envio pela serial
movfw Valor_AN2 ; recupera o valor convertido para ser enviado
call send ; chama a rotina de envio pela serial
movfw Valor_AN3 ; recupera o valor convertido para ser enviado
call send ; chama a rotina de envio pela serial
movfw Valor_DIG_0 ; recupera o valor do LED para ser enviado
call send ; chama a rotina de envio pela serial
movfw Valor_ZOOM_P ; recupera o valor do LED para ser enviado
call send ; chama a rotina de envio pela serial
call delay1s ; chama as rotinas de tempo para aguardar o termino da transmissão
goto start
;
; Envia byte (contido em W) pela UART e espera terminar
;
send:
movwf TXREG ; send data in W
TransWt:
bsf STATUS,RP0 ; banco 1
WtHere:
btfss TXSTA,TRMT ; Transmissao terminou se TRUE
goto WtHere ; Senao, espera
bcf STATUS,RP0 ; banco 0
return
;
; Conversor A/D, palavra ADDCON0 em W
;
read_ad:
movwf ADCON0
bsf ADCON0,GO ; Iniciar conversao
wait:
btfsc ADCON0,GO ; Testa se terminou conversao
goto wait
movf ADRESH,W
return
;
; Display de LEDs
;
display:
movwf PORTD
return
;
;-----------------------------------------------------------------------------
;
; Delay for about 1s
;
delay1s:
movlw D'250'
call waitx400
movlw D'250'
call waitx400
movlw D'250'
goto waitx400
;
;-----------------------------------------------------------------------------
;
; Delay for about 250 ms
;
delay250ms:
movlw D'250'
goto waitx400
;
;-----------------------------------------------------------------------------
;
; Delay for about 400x cycles
;
; Se w=1, temporiza 1ms @ fck = 4MHz
;
waitx400:
movwf ld_loop_ex
ld_loopex:
movlw (400-4)/4
movwf ld_loop_in
ld_loopin:
decf ld_loop_in,F
skpz
goto ld_loopin
decf ld_loop_ex,F
skpz
goto ld_loopex
return
END[/size]
No código não estou conseguindo equacionar um problema relativamente simples: Tenho 4 entradas analógicas e duas digitais, as analógicas estão sendo lidas e transmitidas regularmente. A entrada digital "BOTAO" também funciona normalmente, mas a "ZOOM_P" simplesmente não consigo fazer funcionar. Não transmite, não consigo fazer acender os leds , nada.