Página 1 de 2

COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 25 Dez 2013 18:59
por charlesfrances
Ola a todos creio que esta minha iniciativa ira interessar a muitos , pois sou Hobbysta da linguagem CCS C e a pratico todos os dias,
e veio na mente criar um programa para alterar a frequencia de piscadas de um só LED apenas do pino RA0 ,com chamadas de funções , utilizando interrupções RB0
e não obtive sucesso ,pra começar ,tentei com 2 prototipos ou seja 2 chamadas de funções e não obtive exito em nenhuma das tentativas...

alguem aqui no forum já conseguiu fazer um programa parecido como este ??

naverdade é como um tacometro eu pego a quantidade de interrupções do pino RB0 e pra cada quantidade eu determino no pino RA0 uma frequencia diferente

pessoal isso é dificil ,interrupção...

#include <16f84a.h>

#use delay(clock=4000000)

#fuses XT,NOWDT,PUT


void frequencia1(void);
void frequencia2(void);
.
.
.
.

void main(void)
{


}
#INT_EXT
void frequencia1(void)
{





}

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 25 Dez 2013 19:14
por andre_luis
O PIC possui apenas 1 vetor de interrupção, o que significa que terá de desabilitar umas das entradas para habilitar a outra.
cpp code
#include <16f84a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,PUT

void frequencia1(void);
void frequencia2(void);

void main(void)
{
}
#INT_EXT
void frequencia1(void)
{
}

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 25 Dez 2013 19:26
por charlesfrances
vc poderia postar um exemplo ,já tento faz quse 1 ano e nunca termino...

O PIC possui apenas 1 vetor de interrupção, o que significa que terá de desabilitar umas das entradas para habilitar a outra

desculpe a minha leiguisse mas como faço para desabilitar umas das entradas para habilitar a outra :?:

seria algo do tipo parecido como uma varredura ,ou esta longe ?
estava pensando em usar um sensor hall ou acoplador optico?

eu queria apenas um exemplo com duas chamadas #INT_EXT de frequencias diferente em um só pinocomo saida RA0 !!! :wink:
pessoal pesso encarecidamente alguem um engenheiro ,ou programador que me ajude por compaixão ,em nome de jesus que Deus todo poderoso te abençoe meu irmão
pois preciso deste conhecimento, bom seria que as pessoas ajudassem umas as outras ,aprendendo e aprendendo um dia ou passo de cada vez com humildade,sem precisa ter falar palavrão se vc olhar direitinho isso não leva ninguem a nada só afasta as pessoas que poderiam te ajudar , eu preciso lançar um livro para principiante é claro pois não tenho muito conhecimento mas na medida que vou aprendendo ajudo ,e se a pessoa não quiser que eu posto eu posto via e-mail. cada um é cada um
agradeço a atenção ,e agora imagina só eu estou com duvida desesperado pro conhecimento , mais que dias melhores poderão vir realmente o estrese e cançasso do estudo diario deixa agente assim ...!! :o :|
se alguem tem a resposta ou algo parecido e não se sente avontade em postar aqui no forum pode enviar o codigo pelo meu e-mail carlosfrances7@gmail.com
ou eusou1983@r7.com

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 25 Dez 2013 21:30
por xultz
Eu não entendi como você quer que o programa funcione: se tiver interrupção em uma int, pisca o led em uma frequência, se tiver em outra int, pisca em outra, é isso?
Como você quer que o led pisque, por PWM ou por pooling?
Vou dar uma sugestão em pseudo-código, me diga se é isso que você quer:
Código: Selecionar todos
#inicializacoes, fuses, bla bla bla

// A variavel global abaixo determina a frequencia, se for 0 pisca rapido, se for 1 pisca
// com a metade da frequencia
unsigned char frequencia;

void main(void)
{
    inicializa_a _porra_toda();
    habilita_as_interrupcoes();

    frequencia = 0;

    // O loop abaixo nao termina nunca
    for(;;)
    {
         output_high(PIN_A0);
         delay_ms(200);
         // O if abaixo verifica se a variavel global estah em 1, se estiver, adiciona mais um
         // pouco de atraso
         if(frequencia != 0)
             delay_ms(200);
       
        output_low(PIN_A0);
        delay_ms(200);
        if(frequencia != 0)
             delay_ms(200);
    }
}

// Se houver interrupcao na EXT1, seta a variavel frequencia para
// piscada mais lenta
#int_ext1
void ext1_isr(void)
{
      frequencia = 1;
}

// Se houver interrupcao na EXT2, seta a variavel frequencia para
// piscar mais rapido
#int_ext2
void ext2_isr(void)
{
    frequencia = 0;
}



Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 25 Dez 2013 21:47
por charlesfrances
Grande Xultz e gol rsrsr ... ajudou bastante me alegrei São exatamentepessoas igual a vc que faz a diferençã Valeu brasil... :)

tentei e não deu certo ,não sei porque ? talves não tentei o suficiente ,então quer esta me dizenido ,que pode usar duas int_ext declarando elas como 1 e 2 ...
igual achamada da função ,então se for assim é bem bacana ,eu achava que a interrupção era pra ser declarada uma vez ,quer dizer que posso declara-la mais de duas vezes
? agradecido desde já!! :|

por poling

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 25 Dez 2013 22:08
por charlesfrances
agora aproveitando o tópico e sem querer abusar da boa vontade ,
já que entendi muita coisa com uo exemplo que o amigo Xultz postou ,pra mim

do mesmo jeito que esta neste codigo que deu pra ter um bom entendimento,

caso não fosse nivel 1 e nevel 0 ,fosse ... 2 pulsos pisca lento 4 pulsos pisca rapido tipo assim... :!: :arrow:

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 08:21
por xultz
Bom, vamos por partos

Primeiro, o código que coloquei é um pseudo-código. Esta é uma desculpa esfarrapada para dizer por que o código não fuciona, é que ele foi feito só prá dar uma ideia.
No causo, eu concluí que você está usando o PIC16F84A. Não sei por que raios você está usando esta porcaria, mas nem vou tentar entender.
Para usar duas interrupções externas, com esse miserável aí, você pode usar a interrupção por mudança do PORTB, disponível nos pinos RB4 a RB7. Se for usar dois pinos, vai ter que aterrar os outros dois prá não gerarem interrupções aleatórias. O código que coloquei não funcionou porque essa porcaria só tem uma interrupção externa no RB0.

Assim, o código da interrupção seria:

Código: Selecionar todos

#int_RB
void  RB_isr(void)
{
    if(!input(PIN_B4)
        frequencia = 0;
    else
        frequencia = 1;
}


Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 08:37
por xultz
Quanto à tua segunda pergunta, deixa eu ver se entendi: se tiver interrupção em um pino, pisca lento duas vezes. Se tiver no outro pino, pisca rápido 4 vezes.
Tem milhões de maneiras de fazer isso. A mais comum é um pequena máquina de estados.
Teu código vai ter três estados: não fazendo nada (esperando uma interrupção), vou chamar de estado zero.
Piscando duas vezes lento, vou chamar de estado 1.
E piscando rápido 4 vezes, vou chamar de estado 2.
O diagrama de estados, feito porcamente em ascii é o seguinte:
Código: Selecionar todos
[estado 1]<----|int no pino RB4|<---[estado 0]---->|int no pino RB5|---->[estado 2]
   |                                 ^   ^                                 |
   \---------------------------------/   \---------------------------------/

Essa salada aí quer dizer: o código fica em estado 0 o tempo todo. Se ocorrer um evento de interrupção no pino RB4, muda pro estado 1. Quando terminar de fazer o que tem que fazer, volta pro estado 0. Se estiver no estado 0 e ocorrer um evento de interrupção no pino RB5, muda pro estado 2. QUando terminar, volta pro estado 0.

O código seria mais ou menos assim:
Código: Selecionar todos
// Esta variavel diz que estado a maquina estah
unsigned char estado;

void main(void)
{
   inicicializa_a_porra_toda();
   
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
   
   // Inicia a maquina de estados no estado zero
   estado = 0;
   
   for(;;)
   {
      // Se o estado for 1, pisca duas vezes lento
      if(estado == 1)
      {
         // Vou desabilitar as interrupcoes pra nao correr o risco
         // de ser interrompido durante esta execucao
         disable_interrupts(GLOBAL);
         
         // Vou piscar duas vezes lento. O codigo abaixo dah prá
         // fazer de modo mais otimizado, mas assim fica mais didatico
         output_high(PIN_A0);
         delay_ms(400);
         output_low(PIN_A0);
         delay_ms(400);
         output_high(PIN_A0);
         delay_ms(400);
         output_low(PIN_A0);
         delay_ms(400);
         
         // Se por acaso tiver alguma interrupcao na fila,
         // eu apago ela pra ser ignorada
         clear_interrupts(INT_RB);
              enable_interrupts(GLOBAL);
         
         // Terminei a execucao, volto pro estado 0
         estado = 0;
      }
      
      // Se o estado for 2, pisca 4 vezes rapido
      if(estado == 2)
      {
         // Vou desabilitar as interrupcoes pra nao correr o risco
         // de ser interrompido durante esta execucao
         disable_interrupts(GLOBAL);
         
         // Vou piscar quatro vezes lento. O codigo abaixo dah prá
         // fazer de modo mais otimizado, mas assim fica mais didatico
         output_high(PIN_A0);
         delay_ms(200);
         output_low(PIN_A0);
         delay_ms(200);
         output_high(PIN_A0);
         delay_ms(200);
         output_low(PIN_A0);
         delay_ms(200);
         output_high(PIN_A0);
         delay_ms(200);
         output_low(PIN_A0);
         delay_ms(200);
         output_high(PIN_A0);
         delay_ms(200);
         output_low(PIN_A0);
         delay_ms(200);
         
         // Se por acaso tiver alguma interrupcao na fila,
         // eu apago ela pra ser ignorada
         clear_interrupts(INT_RB);
         enable_interrupts(GLOBAL);
         
         // Terminei a execucao, volto pro estado 0
         estado = 0;
      }
   }
}

#int_RB
void  RB_isr(void)
{
   if(!input(PIN_B4)
      estado = 1;
   else
      estado = 2;
}

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 17:57
por charlesfrances
Não sei por que raios você está usando esta porcaria,
com esse miserável aí,
O código que coloquei não funcionou porque essa porcaria só tem uma interrupção externa no RB0.

kkkkkkkkkkkkkkkkkkk
kkkkkk!
tudo bém vou explicar...! :D



cara vc ..... RSRSRRS!! olha é que ....RSRSRS!!! :mrgreen:
desse jeito...é peso
estou utilizando a versão do proteus demo ,
tentei com o 16f628 mais não funcionou ...

mais valeu ,vc já ajudou

mais vc entendeu errado,
mais não precisa ajudar mais colocando palavrões RSRSRSRS

tente entender eu RSRSRSRS... caso não fosse nivel 1 e nevel 0 ,fosse ... 2pulsos na entra RB0 pisca lento RA0 4 pulsos na entrada RB0 pisca rapido RA0 tipo assim...


:x

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 18:22
por charlesfrances
Quanto à tua segunda pergunta, deixa eu ver se entendi: se tiver interrupção em um pino, pisca lento duas vezes. Se tiver no outro pino, pisca rápido 4 vezes.
Tem milhões de maneiras de fazer isso. A mais comum é um pequena máquina de estados.
Teu código vai ter três estados: não fazendo nada (esperando uma interrupção), vou chamar de estado zero.
Piscando duas vezes lento, vou chamar de estado 1.
E piscando rápido 4 vezes, vou chamar de estado 2.
O diagrama de estados, feito porcamente em ascii é o seguinte:
CÓDIGO: SELECIONAR TODOS
[estado 1]<----|int no pino RB4|<---[estado 0]---->|int no pino RB5|---->[estado 2]






foi bem , instrutivo esse exemplo legal só faltou ....que o pino seria tipo RB0 apenas digamos ele recebe dois pulsos ou como vc queira chamar rsrs 2 aperto de um botaõ
a saida RA0 pisca lento .... se 4 apertos de botão no pino RB0 a saida RA0 pisca rapido kkkkkkkkkkkk era ISSO , :mrgreen: :roll: :roll: :roll:
sem extresse sem estresse pra o meu tópico ficar Bem legal :roll: :roll: :roll: :wink: :mrgreen:

optei por testar o 16f84 só pra ter ideia e também porque não tinha opção :mrgreen: ou exixte outro microcontrolador na versão demo ,
talves terei que usar o timer0 pra ficar monitorando o tempo todo no caso o CCP1 ,mais como ele não tem o CCP1 ,daria serto vazendo com int_ext ? fica ai essa duvida!!! :|

| ^ ^ |
\----------------------

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 19:07
por fender
Xultz, te mandei uma PM.

Aguardo seu contato.

Att,
Fender

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 19:20
por charlesfrances
o que é PM :twisted: :?: não seria que agora que estou PEGANDO MACETE ou ESPIRITO DA COISA que alguem esta querendo atrapalhar
me corrija se eu estiver errado não va colocar terra ´so porque estou aprendendo entrei no forum ontem sou novato :twisted: :mrgreen: rsrsrsrsrkkkkkkkkkkkkk!!
perdão se estiver errado ,não me confundam com alguem só porque coloquei algunhas palavras parecidas com a que estão neste forum,
é que este forum tem liberdade de expressão alguns tem restrições ENTENTEU ??

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 26 Dez 2013 19:56
por charlesfrances
Cara já tenho algo Valeu pessoal qualquer coisa ...

estou preste a me transformar em super saiajim kkkkkkkkkkk

veja http://www.youtube.com/watch?v=mS9jDYpqPrc

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 27 Dez 2013 07:07
por xultz
Fender, já respondi a PM.
Charles, PM quer dizer "mensagem privada" (Private Message).

Quanto à tua dúvida, você quer então um botão, que se pressionar duas vezes pisca rápido, e se pressionar 4 vezes pisca lento.
Essa implementação é um pouco mais chatinha. E isso quer dizer que eu não vou mastigar a solução prá você, vou só te dar uma direção.
Primeiro, precisa pesquisar a respeito de um efeito chamado "bounce", ou melhor, sobre algoritmos de "debounce". Só te adiantando, os botões reais (não aqueles de mentira do Proteus) apresentam muitas instabilidades durante o evento de pressionar ou soltar o botão, fazendo com que o teu código interprete que uma única pressionada na verdade como se fossem várias, muito rápidas.
Além disso, 'importante você estabelecer alguns critérios. Por exemplo, se eu pressionar o botão três vezes, e não apertar mais, o que teu código faz? Interpreta como se fosse 2 ou 4 pressionadas? Ou nenhuma? Quanto tempo ele espera prá desistir? Qual o tempo mínimo e máximo entre cada pressionada? Note que isso são decisões que independem do código, teu código é que vai ter que respeitar estas regras. Depois, é só desenhar a máquina de estados disso tudo.

Se esforça aí que você consegue.

Feliz ano novo, e boa sorte.

Re: COMO EU FAÇO PRA CHAMAR DUAS INT_EXT DIFERENTE ???

MensagemEnviado: 27 Dez 2013 17:49
por charlesfrances
agradecido a todos ,desculpe qualquer coisa ...irei praticar e falando serio neste forum aprendi coisas ate mais rapido que em outros forum por
exemplo algumhas duvidas que eu tinha de abilitações de interrupções eu pergumtava e o pessoal não respondia , aqui não vcs
naõ tem resenha nenhuma não ,FELIZ NATAL AO TODOS VLW!!!