This shows you the differences between two versions of the page.
| pt:avr:interrupts [2015/11/26 14:03] – Criação deste novo documento. artica | pt:avr:interrupts [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Interrupções ====== | ||
| + | As interrupções no AVR podem ser causadas por contadores, interfaces de comunicação, | ||
| + | |||
| + | Cada interrupção do microcontrolador AVR encontra-se ligada a um evento específico. Cada evento tem uma //flag// no registo de estados, que marca a ocorrência do evento. Os eventos encontram-se ligados aos registos de mascara das interrupções e aos bits que a estas correspondem. Se a interrupção do evento não tiver uma mascara definida, quando tal evento se verifica, o processador para por alguns ciclos de executar o programa em curso e inicia a execução do programa relacionado com tal interrupção. Depois de executado programa correspondente à interrupção, | ||
| + | |||
| + | |||
| + | <box 100% round # | ||
| + | |||
| + | Para usar as interrupções do AVR na biblioteca LibC, é necessário incluir “interrupt.h”. O código executado aquando da interrupção é escrito depois da palavra-chave “ISR”. Os eventos são também ligados a mascara de registo e aos bits correspondentes. O texto entre as aspas depois de “ISR” é o nome da interrupção. Segue-se o exemplo em C: | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | ISR(XXX_vect) | ||
| + | { | ||
| + | // nada faz | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | O registo de estado e controlo SREG permite o controlo global de todas as interrupções. A opção de permitir ou não todas as interrupções de uma vez existe para permitir a proteção de dados. Uma vez que as interrupções quebram a execução do programa principal, alguns dos dados em uso por este programa principal podem ser descartados ou corrompidos neste processo. Estas situações podem ser evitadas facilmente através da desativação de todas as interrupções antes de iniciar o processamento dos preciosos dados. A desativação global de interrupções é fácil, se poder ser executada através de um único registo (SREG). Depois e executada a parte critica do programa, as interrupções podem facilmente ser novamente ativadas, passando a ser executadas todas as interrupções que venham a ocorrer. | ||
| + | |||
| + | < | ||
| + | |||
| + | <box 100% round # | ||
| + | |||
| + | Vamos supor que existe uma variável de 16 bits no programa, que é tanto é alterada por uma interrupção do programa principal como pelo programa de uma interrupção, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | // variáveis globais de 16 bits x e y | ||
| + | unsigned short x, y; | ||
| + | |||
| + | // variáveis globais de 16 bits x e y | ||
| + | ISR(XXX_vect) | ||
| + | { | ||
| + | x = 0x3333; | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | // da um valor a x | ||
| + | x = 0x1111; | ||
| + | |||
| + | // ativa globalmente as interrupções | ||
| + | sei(); | ||
| + | |||
| + | // atribui o valor de x a y | ||
| + | y = x; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | O programa em si é muito simples – primeiro, é atribuído o valor de 0x1111 a variável x e mais tarde, este valor é atribuído a variável y. Se ocorrer uma interrupção entre estas duas operações, | ||
| + | |||
| + | Consequentemente, | ||
| + | |||
| + | <code c> | ||
| + | // desativa globalmente as interrupções | ||
| + | cli(); | ||
| + | |||
| + | // da o valor de x a f | ||
| + | y = x; | ||
| + | |||
| + | // ativa globalmente as interrupções | ||
| + | sei(); | ||
| + | </ | ||
| + | |||
| + | </ | ||