Ir ao conteúdo
  • Cadastre-se
DouglasWDR

Temporizador + interrupção externa pic18f4550

Recommended Posts

olá pessoal

Eu estou com um problema, sou iniciante e estou tentando resolver o seguinte problema:

- O programa inverte o estado de RD0 a cada 500ms.
- A porta RD1 deve ter seu estado invertido de acordo uma variável global "tempo".
- Quando houver uma interrupção externa em INT1, que é de alta prioridade, RD2 recebe 1 e a variável "tempo" recebe um valor que reverte RD1 a cada 200ms.
- Quando houver uma interrupção externa em INT2, que é de baixa prioridade, RD2 recebe 0 e a variável "tempo" recebe um valor que reverte RD1 a cada 1s.

Segue meu código

 

unsigned tempo;
short conta = 1;


void interrupt(){
     if(TMR0IF_bit){
                    TMR0IF_bit = 0;
                    TMR0L = 0x2C;
                    TMR0H = 0Xcf;
                    conta++;
                    
                     if(INT1IF_bit){
                     INT1IF_bit = 0;
                     RD2_bit = 1;
                     tempo = 0;
                     if ((!tempo)&&(conta == 40)){
                         RD1_bit = ~RD1_bit;
                         conta = 0;
                   }
     }


     }
     


}

void interrupt_low(){

     if (INT2IF_bit){
        INT2IF_bit = 0;
        RD2_bit = 0;
        tempo = 1;

        if ((tempo) && (conta == 200)){
                         RD1_bit = ~RD1_bit;
        }

     }
}


void main() {
TRISB = 0xff;
TRISD = 0x00;
PORTB = 0xff;
PORTD = 0xff;
RBPU_bit = 0;
ADCON1 = 0x0f;
IPEN_bit = 1;
GIE_bit = 1;
PEIE_bit = 1;
INT1IE_bit = 1;
INT2IE_bit = 1;
INT1IP_bit = 1;
INT2IP_bit = 0;
TMR0IP_bit = 1;
INTEDG1_bit = 0;
INTEDG2_bit = 0;
T0CON = 0x80;
TMR0IE_bit = 1;
TMR0L = 0x2C;
TMR0H = 0Xcf;

         while(1){
                  RD0_bit = ~RD0_bit;
                  delay_ms(500);
         }
}

 

Alguém poderia me dar uma ajuda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@DouglasWDR  ,

 

Se eu entendí direito... INT1 pode interromper tudo, inclusive durante a execução de INT2, mas INT2 só pode interromper o programa, mas nunca durante a execução de INT1, é isso ?

 

Essa vai ser boa.... ainda bem que estou fora do C .....

 

Paulo

Editado por aphawk

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu prefiro ficar fora quando o meliante não retorna em menos de 24H. Os supostos motivos são:

-não entende naaada do trem.

-não menciona a origem-destino do projeto. Pra que serve, pra que vai ser útil

-quer pronto

-é trabalho escolar

-deu crtl-c ctrl-v na pergunta do professor

-só quer ficar livre da matéria

-já resolveu de outra forma

-desistiu. caminho mais fácil

 

Com isso em mente, caro leitor, se quiser uma ajuda mais efetiva fale algo como projeto filantrópico, pra melhorar a vida duns velhinhos num asilo, pra uma creche de crianças abandonadas, pra pessoas com deficiência qualquer e afins. Sendo verdade ou não, sabe-lo-emos

kk

abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×