Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Crazy Gamer

Int0 8051

Recommended Posts

Olá galera. Estou aprendendo a programa assembly e gostaria de saber se só é possível utilizar a int0 (ou a outra interrupção externa) tendo como final o comando reti. Gostaria de saber se é possível quando a int0 for acionada, desviar o programa para outra rotina, para começar a fazer (executar) alguma coisa diferente da anterior e não ter de retornar para a então rotina, como o comando reti faz. É possível configurar isso? Como posso fazer? Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, o que você descreveu, se entendi bem, é exatamente o que uma interrupção qualquer deve fazer,

- Ela desvia seu programa para um outro endereço, e a partir dele você pode executar alguma outra rotina, e ao final dela basta usar o comando reti, para retornar seu programa a ultima instrução que ele parou + 1.

Veja em codigo:



.org INT0adr ;supondo que esse seja o vetor de interrupção
rjmp executaint ;aqui você desvia para a sua rotina de interrupção.

.
.
.
executaint:
.
{aqui você poe o codigo da sua rotina de interrupção}
.
CLRB bit,registrador ; limpa o flag da interrupção (veja o datasheet para saber mais)
RETI ;aqui é o fim da sua interrupção daqui ela retorna para onde seu porgrama estava no momento que a interrupção foi solicitada.


viu como é simples, infelizmente sou programador de PIC e Motorola (e engatinhando com os AVR), mas tem um pessoal fera aqui em 8051 que vai te dar mais detalhes, mas no geral a estrutura de uma interrupção é essa ok.

abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, realmente é o que a interrupção realiza. Por isso acho que não é possivel realizar o que eu quero. O que eu gostaria de fazer era desviar o programa para outro lugar, após acionar uma interrupção, e não ter que utilizar o comando reti, para não ter de voltar ao programa que estava sendo executado. Grato pela ajuda. Caso alguem saiba se isso é possível, peço que por favor me ajudem. Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não fizer RETI, duas coisas vão ocorrer.

1) O Apontador de pilha não será decrementado

2) Não será possível o microcontrolador atender novas interrupções, uma vez que pra ele, vai estar tratando a primeira. O RETI habilita novas interrupções por flag que só pode ser restaurado via hardware, portanto não dá pra resetar tal flag via software e ''enganar'' o processador.

Só não entendo porque não quer voltar ao ponto original, já que é uma interrupção.

Então é melhor monitorar o pino e saltar através de um LJMP caso o pino esteja em '0' ou '1'.

Editado por soschip

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado soschip. Essa era minha duvida, se eu podia "enganar" o processador. Na verdade o que eu queria fazer era isso mesmo, não ter que monitorar o pino, então pensei se seria possível, utilizar uma interrupção. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas por quê você não pode voltar ao ponto em que estava antes da interrupção???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bobera xD, eu provavelmente iria começar uma sequencia de leds diferentes rs. Como eu estou aprendendo agora apenas imaginei que talvez um dia seria necessario (seria importante, ou interessante) usar a interrupção para dar um jump automatico, quando precionada, ao invés de ter que ficar verificando um pino.

Muito obrigado soschip pela ajuda. Aprender micontrolado sem ajuda é muito difícil, especialmente essas funções mais complexas que não se ensinam direito nas escolas como interrupções, timers, dptr e por aí vai. Valeu.

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






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

×