Interrupção INT0 e INT1

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Interrupção INT0 e INT1

Mensagempor rubenprom » 12 Dez 2006 11:39

Embora parece que seja facil, alguem poderia me dar um dica de como usar a interrupção no 8051. No codigo de programação. Eu Utilizo C, mas nao teria problemas com o Assembler.

eu setei o IE=0x95 -> (IE = 10011010) pois minha intensão é utilzar o INT1 e o INT0.
rubenprom
Byte
 
Mensagens: 222
Registrado em: 16 Out 2006 00:23
Localização: Porto Alegre - RS

Mensagempor Iran » 12 Dez 2006 12:18

Se seu compilador for o SDCC poderá ser assim:
Código: Selecionar todos
//-----------------------------------------------------------------------------
//    Rotina de Tratamento de Interupção Externa 0
//-----------------------------------------------------------------------------

void int0_isr(void) interrupt 0

  {
        Aqui vai o código de tratamento de sua interrupção
  }


Antes vc tem de habilitar globalmente e individualmente as interrupções que deseja usar, definir borda ou nível para as externas, etc...

int0_isr é o nome que dei a rotina, pode ser o que vc escolher.

O número que aparece depois da palavra interrupt corresponde a ordem das interrupções na tabela de vetores, assim a primeira é 0 a segunda é 1, ...etc...

Espere outras respostas

Zé Iran.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Maurício » 12 Dez 2006 12:53

o Iran tá certo !
é isso mesmo !!
e o formato de declaração do SDCC serve tb para o Keil:

Código: Selecionar todos
void trata_ISR0 ( void ) interrupt 0     // para INT0
{
    // seu código aqui
}

void trata_ISR1 ( void ) interrupt 2    // para INT1
{
    // seu código aqui
}


sem esquecer que se a detecção for por nível, e se o sinal estiver baixo qdo a interrupção for atendida, vai disparar outra interrupção, dentro da interrupção.
pra resolver este problema, é necessário desabilitar a interrupção externa quando vc entrar no tratamento dessa interrupção, e recuperar o estado quando vc sair do tratamento.
uma coisa desse tipo aqui:

Código: Selecionar todos
void trata_ISR0 ( void ) interrupt 0
{
    IE0 = 0;    // desabilita a interrupção externa 0

    // seu código aqui

    IE0 = 1;    // habilita a interrupção externa 0
}

acho que é isso. experimenta aí.

[]'s

RETI.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor rubenprom » 12 Dez 2006 13:17

Acho que Iran ta certo, sobre a declaração, primeiro devo habilitar as interrupções globalmente e depois fazer o tratamento. Tou testando apenas com um famoso PISCA LED



PD: Funcionou mesmo, consegui implementar a rotina de interrupção!

Muito Obrigado
rubenprom
Byte
 
Mensagens: 222
Registrado em: 16 Out 2006 00:23
Localização: Porto Alegre - RS


Voltar para 8051

Quem está online

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

x