Ir ao conteúdo
  • Cadastre-se

PIC16F628A - Disparos utilizando botões e pulso externo


Posts recomendados

          Olá!

 

          Estou com problemas no meu programa, não consigo fazê-lo funcionar. Já tentei várias alternativas. Acredito que seja algum erro bobo. Gostaria realmente de uma ajuda. O programa foi desenvolvido em linguagem Assembly e compilado no MPLAB. Muito obrigado desde já!

 

         A ideia é a seguinte: possuo uma fonte que gera um sinal DC com período 16,67 ms (advinda da rede elétrica convencional 60 Hz). Utilizando três botões, cada botão que eu apertar gera um sinal na porta do PIC16F628A com períodos diferentes, sincronizados com o sinal da fonte. Exemplo: botão 1 gera sinal de 16,67 ms, botão 2 gera de 4,167 ms (1/4 da fonte) e botão 3 gera sinal com 8,33 ms (1/2 da fonte). 

 

#INCLUDE <P16f628A.INC>
#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BANK1 BSF STATUS,RP0
 
CBLOCK 0X20
D1 ;variáveis
D2
CONTA
ENDC
 
#DEFINE BOTAO0 PORTA,0 ;entradas
#DEFINE BOTAO1 PORTA,1
#DEFINE BOTAO2 PORTA,2
#DEFINE SAIDA PORTB,0 ;saída
 
ORG 0X00
     GOTO DEFINICOES
ORG 0X04
     BCF INTCON,0
RETFIE 
 
TEMPO1
     ;4163 cycles
     MOVLW 0x40
     MOVWF D1
     MOVLW 0x04
     MOVWF D2
     DELAY
         DECFSZ D1, F
         GOTO $+2
         DECFSZ D2, F
     GOTO DELAY
     ;4 cycles
     GOTO $+1
     GOTO $+1
RETURN
 
TEMPO2
     ;8328 cycles
     MOVLW 0x81
     MOVWF D1
     MOVLW 0x07
     MOVWF D2
     DELAY1
          DECFSZ D1, F
          GOTO $+2
          DECFSZ D2, F
         GOTO DELAY
 
          2 cycles
          GOTO $+1
RETURN
 
TEMPO3
     ;12498 cycles
     MOVLW 0xC3
     MOVWF D1 
     MOVLW 0x0A
     MOVWF D2
     DELAY2
          DECFSZ D1, F
          GOTO $+2
          DECFSZ D2, F
          GOTO DELAY
 
          ;2 cycles
          GOTO $+1
RETURN
 
TEMPO4
     ;16663 cycles
     MOVLW 0x04
     MOVWF D1
     MOVLW 0x0E
     MOVWF D2
     DELAY3
          DECFSZ D1, F
          GOTO $+2
          DECFSZ D2, F
          GOTO DELAY3
 
          ;4 cycles
          GOTO $+1
          GOTO $+1
RETURN
 
DEFINICOES
     BANK0
          MOVLW 0x07
          MOVWF CMCON ;desativando comparadores para utilização do PORTA
     BANK1
          CLRF PORTA
          CLRF PORTB
          CLRF INTCON ;Todas as interrupções impedidas
          MOVLW B'00001000' ;Só a interrupção por mudança de estado habilitada
          MOVWF INTCON
          BSF INTCON,GIE ;Permitida a ocorrência de interrupções
          MOVLW B'11111111' 
          MOVWF TRISA
          MOVLW B'11111110' ;RB0 como saída
          MOVWF TRISB
          MOVLW B'00000000' 
          MOVWF OPTION_REG
     BANK0
 
INICIO
     BTFSS INTCON,0
     GOTO $-1
     MAIN0
          BTFSC  BOTAO0
          GOTO   BOTAO0_ON
          GOTO   BOTAO0_OFF
       
          BOTAO0_ON 
               BSF PORTB,0
               CALL TEMPO4 ;16,667 s
               BCF PORTB,0
               BCF INTCON,0
          GOTO   MAIN1
                              
          BOTAO0_OFF
               BCF PORTB,0
               BCF INTCON,0
          GOTO   MAIN1
 
     MAIN1
         BTFSC  BOTAO1
         GOTO   BOTAO1_ON
         GOTO   BOTAO1_OFF
 
          BOTAO1_ON
              CALL TEMPO1 ;4,167 ms
               BSF PORTB,0
               CALL TEMPO3 ;12,5 ms
               BCF PORTB,0
               BCF INTCON,0
         GOTO   MAIN2
 
          BOTAO1_OFF
               BCF PORTB,0
               BCF INTCON,0
          GOTO   MAIN2
 
     MAIN2 
          BTFSC  BOTAO2
          GOTO   BOTAO2_ON
          GOTO   BOTAO2_OFF
   
          BOTAO2_ON
               CALL TEMPO2 ;8,33 ms
               BSF PORTB,0
               CALL TEMPO2 ;8,33 ms
               BCF PORTB,0
               BCF INTCON,0
         GOTO   INICIO
 
         BOTAO2_OFF
               BCF PORTB,0
               BCF INTCON,0
        GOTO   INICIO
END
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

olá pedro. 1ª mente tenha isso na mesma: não fique bravo! nem você nem nenhum leitor! isso pode não te ajudar
Acalmou? então vamo lá...
-uma alternativa em c
-o objetivo é mostar a simplicidade da linguagem c
-a princípio atende seus dados de entrada. Ajustes e mais dados podem melhorar
-pode parecer complexo mas é muito simples

-há de se fazer pequenos ajustes na função delay() pra dar o tempo que precisa

-se algum dia achar necessário, algum outro podemos gerar o asm dele
 

#DEFINE BOTAO0 RA0;//PORTA,0 ;entradas#DEFINE BOTAO1 RA1;//PORTA,1#DEFINE BOTAO2 RA2;//PORTA,2#DEFINE SAIDA RB0;//PORTB,0 ;saída#define sinal RA3;void delay(unsigned char dl){while (dl--) {asm("nop");asm("nop");} //ajuste.. pode ser retirado//asm("nop");asm("nop"); //micro ajustes}void main(void){//..inicializa hwfor(;{while (!sinal); //sincronismoif (!BOTAO0) {sinal=1;delay(16);sinal=0;}if (!BOTAO1) {sinal=1;delay(8);sinal=0;}if (!BOTAO2) {sinal=1;delay(4);sinal=0;}}}

de fato já fiz um dimmer (algo semelhante à sua proposta) com pic10f e este rodou com sucesso na simulação.
No mais, peço que ignore e aguarde algum incauto programador analisar seu asm pra te orientar ok?

Link para o comentário
Compartilhar em outros sites

BANK1          CLRF PORTA          CLRF PORTB

os ports não estão no banco 1. estão no banco 0.

#DEFINE BOTAO0 PORTA,0 ;entradas#DEFINE BOTAO1 PORTA,1#DEFINE BOTAO2 PORTA,2

Aqui você definiu os botões no portA, este port não tem interrupção externa, somente o PORTB,0 que é o INTE ou os PORTB de 4 a 7 que é a interrução RBIE

 

com isso, faz você ficar em um loop infinito no:

INICIO     BTFSS INTCON,0     GOTO $-1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!