This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| pt:avr:external_interrupts [2015/11/30 19:34] – artica | pt:avr:external_interrupts [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Interrupções Externas ====== | ||
| + | As interrupções externas são das funções periféricas mais simples. AVRs típicos têm 1 a 8 pinos especiais, que são utilizados para causar interrupções no programa quando o valor lógico destes muda ou quando se encontram num determinado estado. Uma vez que esta função é normalmente usada para monitorar sinais lógicos externos, estes pinos são designados como pinos de interrupção externos. | ||
| + | |||
| + | Para utilizar uma interrupção externa, o pino tem de ser configurado como uma entrada standard de IO (que também pode ser utilizada como uma saída, mas, neste caso, a interrupção só pode ser criada pelo próprio controlador). É necessário permitir a recepção de interrupções e especificar a condição que causa a interrupção para disparar o registo de configuração de interrupção externa. Há quatro condições possíveis: | ||
| + | |||
| + | * De zero lógico (tensão de 0V). | ||
| + | * Alteração do valor lógico. | ||
| + | * Frente Decrescente - mudança lógica de um para zero. | ||
| + | * Frente Crescente - mudança lógica de zero para um. | ||
| + | |||
| + | Quando o modo for definido para o zero lógico, a interrupção irá disparar continuamente enquanto o pino tem um valor de zero. Durante este período, a execução do programa principal é interrompida. | ||
| + | |||
| + | Agrupados por princípio, existem dois tipos de interrupção: | ||
| + | |||
| + | < | ||
| + | |||
| + | <box 100% round # | ||
| + | |||
| + | Task: Make ATmega128 pin number 9 (pin 7 on bus E) fire an interrupt if its value is changed. This pin corresponds to the INT7 external interrupt, which is synchronous. | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | // The code of the external interrupt | ||
| + | ISR(INT7_vect) | ||
| + | { | ||
| + | // Do something | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | // Change pin 7 on bus E to an input by changing bit 7 to zero | ||
| + | DDRE &= ~(1 << PIN7); | ||
| + | |||
| + | // Defining a pull-up resistor to to pin 7 on bus E | ||
| + | // to prevent input floating | ||
| + | PORTE |= (1 << PIN7); | ||
| + | |||
| + | // Set the interrupt mode to logical change for interrupt 7 | ||
| + | // in the external interrupt configuration register | ||
| + | EICRB = (1 << ISC70); | ||
| + | |||
| + | // Allow external interrupt 7 | ||
| + | EIMSK |= (1 << INT7); | ||
| + | |||
| + | // Allow global interrupts | ||
| + | sei(); | ||
| + | |||
| + | // Endless loop | ||
| + | while (1) continue; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | Além de interrupções disparadas por pinos individuais, | ||