Dúvida Cruel

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida Cruel

Mensagempor rsdias » 01 Out 2008 22:47

Pessoal olha eu de novo, desculpem mas estou começando e tenho muitas dúvidas e só tenho a ajuda de vcs aqui do forum, estou tentando fazer o seguinte, usando um pino do microcontrolador com uma chave e usando a interrupção preciso que quando ocorra a interrupção por pressionar este botão se acione um rele em outro pino, e quando eu pressionar denovo este mesmo botão este relé deve ser desacionado, como posso fazer esta rotina? É possível? Aguardo a ajuda de vcs e mais uma vez obrigado.
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Re: Dúvida Cruel

Mensagempor phophollety » 01 Out 2008 23:29

PRIMEIRO NAO POSTE DUAS VEZES A MESMA COISA


rsdias escreveu:Pessoal olha eu de novo, desculpem mas estou começando e tenho muitas dúvidas e só tenho a ajuda de vcs aqui do forum, estou tentando fazer o seguinte, usando um pino do microcontrolador com uma chave e usando a interrupção preciso que quando ocorra a interrupção por pressionar este botão se acione um rele em outro pino, e quando eu pressionar denovo este mesmo botão este relé deve ser desacionado, como posso fazer esta rotina? É possível? Aguardo a ajuda de vcs e mais uma vez obrigado.




Bem seria mais simples se soubéssemos qual linguagem problema mas, de qualquer maneira..

Se for em ASM

Código: Selecionar todos

TRATA_INTERRUPCAO_BT

movlw MASK_RELAY ; Define de máscara, suponhamos que é RA1, será b'00000010' então
xorlw  PORTA,f ; Xor, inverte o bit, liga/desliga

goto  FIM_INTERRUPCAO






Se for em C
Código: Selecionar todos

#define RELE1    PORTAbits.RA1 ( verifique isso, varia de compilador para compilador, este exemplo é como o C30 entende )

void trataIntBr ( void )
{
     RELE1 != RELE1;
}


"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Mensagempor joao » 02 Out 2008 05:53

Ola phophollety,


Como eu sempre falo, eu não trabalho com PIC a várias decadas(ok, é apenas 2 anos, mas nada como aumentar um pouco! :D)

Ele falou de interrupção. Não seria aquela outra interrupção que para o programa e entra numa área de memória específica?
Os exemplos que vc deu eu entendi que vc apenas leu o bit do botão, mas não usar uma interrupção do programa.

Posso estar enganado, mas de qualquer maneira, pode explicar um pouco mais?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor phophollety » 02 Out 2008 08:08

joao escreveu:Ola phophollety,


Como eu sempre falo, eu não trabalho com PIC a várias decadas(ok, é apenas 2 anos, mas nada como aumentar um pouco! :D)

Ele falou de interrupção. Não seria aquela outra interrupção que para o programa e entra numa área de memória específica?
Os exemplos que vc deu eu entendi que vc apenas leu o bit do botão, mas não usar uma interrupção do programa.

Posso estar enganado, mas de qualquer maneira, pode explicar um pouco mais?

[]'s


Sim, supus que ele sabe fazer isso, por que existem dois tipos de interrupção externa no PIC:

Por mudança de estado, esta, tem em vários pinos, mas somente um único flag de interrupção, você habilita quais pinos entre os possíveis interrompam e como diz o nome, é na mudança de estado, seja de 0 > 1 ou de 1 > 0 ela sempre ocorre, cabe ao programador saber qual interrompeu e tratar.

Já a interrupção por mudança de borda, esta escolhe-se em qual irá interromper, subida ou descida e, para cada interrupção há um flag, entretanto, como é mais complexa, existem poucas dela.

Peguemos um pic pequeno, alguns nem tem interrupção por borda, apenas mudança de estado, um um pouco melhor, tem uma apenas de borda e várias de mudança de estado, e um ferrado, como os 24hj tem em geral 4 de borda e várias (mais de 20) de estado.

Será mais fácil achar a solução sabendo qual o modelo escolhido, qual tipo de int quer se utilizar e qual linguagem o usuário está.
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Mensagempor joao » 02 Out 2008 08:38

Valeu!

Nem sabia que tinha duas...
:D

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Dúvida Cruel

Mensagempor rsdias » 02 Out 2008 11:06

Desculpe pessoal me expressei muito mal, e não vou mais postar em dois lugares. Tenho um programa em assembler e ele está executando outras funções ( checando rede AC, fazendo led piscar , etc ) porém quero que quando eu pressione o botão este programa pare de fazer as funções normais e ligue um relé, depois se eu apertar novamente este botão ele tem que desligar o relé e voltar as funções normais, estou usando PIC16F628A e iria usar a interrupção externa para isto, como posso fazer?por favor se puderem deixar aqui a forma como configuro esta interrupção e como poderia fazer o código desta rotina, agradeço desde já e desculpem a amolação é que sou novo neste mundo de microcontroladores.
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Mensagempor phophollety » 02 Out 2008 11:24

Diz ai

qual pino você vai ligar o botão? Ou quais os pinos que você pode ligar
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Dúvida Cruel

Mensagempor rsdias » 02 Out 2008 12:06

Pino 6 - RB0 -> Botão
Pino 18 - RA1 -> Relé via transistor
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Re: Dúvida Cruel

Mensagempor phophollety » 02 Out 2008 12:58

rsdias escreveu:Pino 6 - RB0 -> Botão
Pino 18 - RA1 -> Relé via transistor



Código: Selecionar todos


; Quando for inicializar o seu pic, não se esqueça de ajustar a interrupção

    bsf INTCON,INTE ; Habilita Interrupção
    bsf OPTION_REG, INTEDG ; Interrupção ocorrerá na subida


;*----------------------------------------------------------------*
;   Vetor de interrupção
;*----------------------------------------------------------------*   
   ORG    0x04
      
   movwf   wregTemp
   swapf   STATUS,w
   movwf   statusTemp
   
   banksel TMR0
   
   btfsc   INTCON, INTF
   goto    INTF_INT
   

SAI_ISR
 
   swapf   statusTemp,w
   movwf   STATUS
   swapf   wregTemp,f
   swapf   wregTemp,w
   
   retfie // Retorna da interrupção

INTF_INT
       
      bcf            INTCON,INTF ; Limpa a interrupção
      movlw       b'00000010'   ; Máscara para inverte
      xorlw         PORTA,f        ; Inverteu o rele
     
      goto           SAI_ISR       ; RETORNA, feito
   




Só que lhe digo uma coisa, você vai ter que fazer um debounce para essa interrupção, NÃO COLOQUE UM DELAY DENTRO DA INTERRUPÇAO PARA RESOLVER O PROBLEMA! Isto é um crime, apesar de resolver....

Por que o ruído do botão vai gerar várias interrupções

Eu, neste contexto, não vejo a menor necessidade deste botão estar por interrupção, por mim, poderia ser qualquer IO com um rotina de debounce normal

Dúvidas?
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Dúvida Cruel

Mensagempor rsdias » 02 Out 2008 13:25

Desculpe a insistencia, mas como faço debounce na interrupção? Poderia me explicar ou me enviar um código para que eu entenda, Muiiittiisssimo obrigado.
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Mensagempor joao » 02 Out 2008 13:31

Usando o search do forum:

http://asm51.eng.br/phpBB/viewtopic.php ... t=debounce

Eu entendi que vc terá que verificar na entrada da interrupcao uma mudanca do estado do botao, para que ela nao fique entrando sempre se vc ficar pressionando o botao.
Por isso, assim que entra na interrupcao, fica validando até que a pessoa pare de apertar o botao, dai sim vc executa o seu código.
Não sabia o que era debounce também, mas pelo exemplo passando, eu entendi isso.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Re: Dúvida Cruel

Mensagempor phophollety » 02 Out 2008 13:37

rsdias escreveu:Desculpe a insistencia, mas como faço debounce na interrupção? Poderia me explicar ou me enviar um código para que eu entenda, Muiiittiisssimo obrigado.


Mais à noite eu posto, você tem o livro do David, "Desbravando o PIC"?
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Dúvida Cruel

Mensagempor rsdias » 02 Out 2008 16:30

Obrigado vou aguardar então, pois não tenho o livro, to pesquisando na net e usando o forum. Obrigado novamente pela força.
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x