Você está na página 1de 5

; Include onde existem as definicoes do microcontrolador INCLUDE 'MC9S08QG8.

inc'

; Inicio da area de variaveis ORG $0060 CARACTER: DS.B 1 ; 3seg. ou 10 seg. PESO_MAX: DS.B 2 ; peso mximo definido pelo usuario PESO: DS.B 2 ; peso medido VELOCIDADE: DS.B 2 ; velocidade medida TEMPO_FIXO: DS.B 1 ; tempo definido pela comunicao serial SCI TEMPO: DS.B 1 ; tempo incrementado pelo RTI ALERTA: DS.B 1 ; flag indicando alerta acionada (IRQ) ; ; Inicio do codigo ; ORG $E000 INICIO: LDA SOPT1 AND #127 STA SOPT1 ; CONFIGURAO E/S DIGITAIS MOV #%00000000,PTAD ;DESLIGA ALERTA SONORO (PTA3) E APAGA O LED DE ALERTA (PTA4) MOV #%00011000,PTADD ;PTA3 E PTA4 SAIDAS MOV #%00000000,PTBD ;MOTOR PARA FRENTE (PTB6 = 0), PARA TRAS (PTB6 =1) MOV #%01000000,PTBDD ;SAIDA:PTB6 DIREO DO MOTOR,ENTRADAS:PTB7 DIMINUI E PTB4 AUMENTA ; PULL UP DAS ENTRADAS LDA PTBPE ORA #%10011100 ; PTB2,PTB3,PTB4 E PTB7 STA PTBPE ; CONFIGURAO DE AD MOV #%00000111,APCTL1 ;PTA0(ACELERADOR),PTA1(PESO) E PTA2(VELOC) MOV #$0,ADCSC2 ;COMPARAO DESATIVADA NOVA CONVERSO PELA ESCRITA EM ADCSC1 MOV #%10001000,ADCCFG ; INICIALIZADO COM 10BITS E BUSCLK MOV #%00011111,ADCSC1 ; INT DESABILITDA, CONV. DESATIVADO,UMA CONVERSO ; CONFIGURAO INTERRUPO EXTERNA MOV #%00010010,IRQSC ;PULL UP HABIL,BORDA DESCIDA,PINO IRQ ATIV, INT HABILIT,DISPARO TRANSIO ; CONFIGURAO INTERRUPO DE TEMPO REAL LDA #%00110111

STA SRTISC

; CLOCK EXTERNO, INT HABILITADA A CADA 1s

; CONFIGURAO DO PWM MOV #%01001000,TPMSC ; MODO NORMAL, BUSCLK,PRESCALER = 1 LDHX #1022 STHX TPMMODH ;BUSCLK = 4MHz, fPWM = 3,91kHz e PRE =1 MOV #%00101000,TPMC1SC ; INT DESAB,PWM ATIVO EM NIVEL ALTO LDHX #0 STHX TPMC1VH ;MOTOR DESLIGADO PARA INICIAR ; CONFIGURAO DO SCI MOV #$0, SCIC1 ; MODO NORMAL, 8 BITS, PARIDADE DESLIGADA MOV #%00101100,SCIC2 ;INTERRUP. RECEPO ATIVADA, TRANS E RECEP HABILIT MOV #$0,SCIC3 MOV #26,SCIBD ;9600 bps =BUSCLK/BR*16 ; INICIALIZACAO DAS VARIVEIS MOV #$41,CARACTER ; SETA CARACTER PARA 3 SEGUNDOS LDHX #1023 ; PESO MAXIMO IGUAL A MAX DE 10 BITS (0 - 1023) STHX PESO_MAX ; SETA PESO MAX INICIAL LDHX #0 ; PESO IGUAL A 0 STHX PESO ; SETA PESO INICIAL IGUAL A 0 LDHX #0 ; VELOCIDADE IGUAL A 0 STHX VELOCIDADE ; SETA VELOCIDADE INICIAL IGUAL A 0 MOV #3,TEMPO_FIXO ; SETA TEMPO_FIXO PARA 3 SEGUNDOS DE ALERTA SONORO MOV #0,TEMPO ; SETA INICIALMENTE PARA 0 MOV #0,ALERTA ; ALERTA DESABILITADA CLI ; HABILITA TODAS AS INTERRUPES ; INICIO DA LGICA LOOP: LDA CARACTER ; VERIFICA SE TEM DADOS DA SERIAL RS232 CMP #$41 ; SE FOR #$41 => 3 SEGUNDOS BEQ SETA_3SEG CMP #$42 ; SE FOR #$42 => 10 SEGUNDOS BEQ SETA_10SEG BRA VERIF_PESO SETA_3SEG: MOV #3,TEMPO_FIXO BRA VERIF_PESO SETA_10SEG: MOV #10,TEMPO_FIXO

; SETA PARA 3 SEG. DE ALERTA SONORO

; SETA PARA 10 SEG. DE ALERTA SONORO

VERIF_PESO: ; LEITURA DO PESO EM PTA1 LDA ADCSC1 ; LE O REGISTRADOR DOS CANAIS AND #%11100001 STA ADCSC1 ; ATIVA O CANAL AD1 COCO: BRCLR 7,ADCSC1, COCO ;AGUARDA O COCO LDHX ADCRH ;LEITURA DO ADC STHX PESO ; SALVA O VALOR DO PESO NA VARIAVEL PESO LDA ADCSC1 ORA #%00011111

STA ADCSC1 ; DESATIVA O CONVERSOR AD CPHX #0 ; VERIFICA SE O PESO IGUAL A ZERO BNE VERIFICA_LIMITE_PESO ; SE DIFERENTE DE 0, NO PODE ALTERAR O PESO MAXIMO BRCLR 4,PTBD,AUMENTA ; PODE ALTERAR O PESO MAXIMO PARA CIMA BRCLR 7,PTBD,DIMINUI ; PODE ALTERAR O PESO MAXIMO PARA BAIXO VERIFICA_LIMITE_PESO: CPHX #1023 BLS VERIFICA_POTENCIOM BSET 4,PTAD ; ACIONA ALERTA DE PESO BRA VERIFICA_POTENCIOM ; VERIFICA ACELERADOR PARA DAR PARTIDA AUMENTA: LDHX PESO_MAX CPHX #1023 ;VERIF SE PESO MAX J 1023 BEQ VERIFICA_POTENCIOM ;SE SIM, VAI EM FRENTE... AIX #1 ;SENO INCREMENTA E... STHX PESO_MAX ;SALVA NOVO VALOR BRA VERIFICA_POTENCIOM DIMINUI: LDHX PESO_MAX CPHX #0 ;VERIFICA SE PESO MAX 0 BEQ VERIFICA_POTENCIOM ;SE SIM VAI EM FRENTE... AIX #-1 ;SENO, INCREMENTA E... STHX PESO_MAX ;SALVA NOVO VALOR VERIFICA_POTENCIOM: ; LEITURA DO ACELERADOR EM PTA0 LDA ADCSC1 ; LE O REGISTRADOR DOS CANAIS AND #%11100000 STA ADCSC1 ; ATIVA O CANAL AD0 COCO1: BRCLR 7,ADCSC1, COCO1 ;AGUARDA O COCO LDHX ADCRH ;LEITURA DO ADC STHX VELOCIDADE ; SALVA O VALOR DA VELOCIDADE LDA ADCSC1 ORA #%00011111 STA ADCSC1 ; DESATIVA O CONVERSOR AD CPHX #0 ; VERIFICA SE VEL. IGUAL A ZERO BEQ PARTIDA ; SE SIM, D PARTIDA BRCLR 3, PTBD, MOTOR_PWM ; SENO, VERIFICA SE J EST LIGADO,SE SIM, ACIONAR PWM BRA VERIFICA_POTENCIOM ; SE NO ESTIVER LIGADO AGUARDAR VELOC. IGUAL A 0 ; AGUARDAR PARTIDA NO PTB3 PARTIDA: BRSET 3,PTBD, PARTIDA ; AGUARDA PARTIDA DO MOTOR MOTOR_PWM: LDHX VELOCIDADE ; O VALOR DA VELOC. O VALOR DO CICLO ATIVO DO MOTOR STHX TPMC1VH ; MOTOR FUNCIONANDO BRCLR 3,PTBD,VERIFICA_VELOCIDADE ; SE A CHAVE LIGADA,VERIFICA VELOCIDADE PARA_MOTOR: LDHX #0 ; SENAO, DESLIGA MOTOR E VOLTA NO INICIO

STHX TPMC1VH JMP LOOP

;MOTOR DESLIGADO

VERIFICA_VELOCIDADE: ; LEITURA DA VELOCIDADE EM PTA2 LDA ADCSC1 ; LE O REGISTRADOR DOS CANAIS AND #%11100010 STA ADCSC1 ; ATIVA O CANAL AD2 COCO2: BRCLR 7,ADCSC1, COCO2 ;AGUARDA O COCO LDHX ADCRH ;LEITURA DO ADC STHX VELOCIDADE ; SALVA O VALOR DA VELOCIDADE LDA ADCSC1 ORA #%00011111 STA ADCSC1 ; DESATIVA O CONVERSOR AD CPHX #1023 ; VERIFICA SE VEL. IGUAL AO MAXIMO 33km/h BEQ PARA_MOTOR ; SE SIM, D PARTIDA CPHX #0 BNE TESTA_ALERTA ; VERIFICA DIREO DAS RODAS DA EMPUILHADEIRA NO PTB2 DIRECAO: BRCLR 2,PTBD,FRENTE TRAS: BSET 6,PTBD ; MOTOR PARA TRAS BRA TESTA_ALERTA FRENTE: BCLR 6,PTBD ; MOTOR PARA FRENTE TESTA_ALERTA: BRCLR 0,ALERTA,VOLTA_LOOP ; SE TIVER INT_EXT (PTA5) ACIONADO, LIGA ALERTA LIGA_ALERTA: LDA TEMPO ; LE O TEMPO ATUALIZADO PELO RTI CMP TEMPO_FIXO ; COMPARA COM TEMPO FIXO (3 OU 10s) BNE VOLTA_LOOP BRCLR 3,PTAD,APAGADO ; VERIFICA SE ALERTA SONORO DESLIGADO BCLR 3,PTAD ; SENO QUE EST LIGADO, DESLIGA ALERTA BRA VOLTA_LOOP APAGADO: BSET 3,PTAD ; LIGA ALERTA VOLTA_LOOP: JMP LOOP ;***************************************************************** ;INTERRUPO DE RECEPO DE SERIAL SCI ;***************************************************************** INT_SCI_RECEP: LDA SCIS1 ;LEITURA DO SCISC PARA APAGAR RDRF LDA SCID ;LEITURA DO CARACTER RECEBIDO STA CARACTER ;CARACTER RECEBE O VALOR LIDO RTI ;***************************************************************** ;INTERRUPO EXTERNA - IRQ5 (ALERTA) ;***************************************************************** INT_IRQ:

BSET 2, IRQSC ; ESCREVE 1 NO IRQACK PARA RESETAR O IRQF MOV #$1, ALERTA ; INFORMA QUE HOUVE ACIONAMENTO PARA ALERTA MOV #$0, TEMPO ; QUANDO GERA INTERRUPCAO EXTERNA, ZERA TEMPO RTI ;***************************************************************** ;INTERRUPO DE TIMER ;***************************************************************** INT_RTI: LDA SRTISC ORA #64 STA SRTISC ; ESCREVE 1 NO RTIACK PARA RESETAR RTIF INC TEMPO RTI ;************************************************************** ;* Vetor de interrupcoes * ;************************************************************** ORG $FFFE DC.W INICIO ORG $FFE0 DC.W INT_SCI_RECEP ORG $FFD0 DC.W INT_RTI ORG $FFFA DC.W INT_IRQ

Você também pode gostar