Escolar Documentos
Profissional Documentos
Cultura Documentos
Vetores de Interrupo
Todos os vetores de interrupo do ATmega8 so equivalentes no
(o Microcontrolador do Arduino)
possuem
outros
perifricos,
registradores
diferentes
.
3
Tab. 5 - Bits nos registradores de I/O que tiveram seus nomes alterados, mas
preservaram a mesma funcionalidade.
int main()
{
DDRB = 0x00; //pinos do PORTB como entrada
PORTB = 0xFF; //habilita pull-ups do PORTC
DDRD = 0xFF; //PORTC como sada
Tenso de Operao
Tab. 8 Tenses e velocidades de operao.
//habilita as interrupes
for(;;);
EXEMPLOS
Arquivo trata_bits.h utilizado nos programas abaixo.
//------------------------------------------------------------------------//
//Definies de macros para trabalho com bits
#define set_bit(adress,bit)(adress|=(1<<bit))
#define clr_bit(adress,bit)(adress&=~(1<<bit))
#define tst_bit(adress,bit)(adress&(1<<bit))
#define cpl_bit(adress,bit)(adress^=(1<<bit))
//------------------------------------------------------------------------//
}
//--------------------------------------------------------------------------ISR(PCINT0_vect)//quando houver mais de um pino que possa gerar a interrupo,
{
// necessrio testar qual foi.
if(!tst_bit(PINB,PB0))
cpl_bit(PORTD,PD0);
else if(!tst_bit(PINB,PB1))
cpl_bit(PORTD,PD1);
else if(!tst_bit(PINB,PB2))
cpl_bit(PORTD,PD2);
else if(!tst_bit(PINB,PB3))
cpl_bit(PORTD,PD3);
else if(!tst_bit(PINB,PB4))
cpl_bit(PORTD,PD4);
else if(!tst_bit(PINB,PB5))
cpl_bit(PORTD,PD5);
else if(!tst_bit(PINB,PB6))
cpl_bit(PORTD,PD6);
else if(!tst_bit(PINB,PB7))
cpl_bit(PORTD,PD7);
_delay_ms(50);
}
//---------------------------------------------------------------------------
//==========================================================================//
//Cada vez que um boto pressionado o LED correspondente troca de estado //
//
//
//Todos os pinos do ATmegaX8 permitem interrupes externas
//
//Entretanto, eles possuem apenas um vetor de interrupo (endereo)
//
//Caso exista mais de um pino habilitado, o programador deve verificar qual //
//pino gerou a interrupo.
//
//=========================================================================//
//Autor: Charles Borges de Lima - 02/02/2011
//
//=========================================================================//
#define F_CPU 8000000UL
//frequncia de trabalho
#include <avr/io.h>
//definies do componente especificado
#include <avr/interrupt.h> //define algumas macros para as interrupes
#include <util/delay.h>
//biblioteca para o uso das rotinas de delay
#include "trata_bits.h"
//inclui macros para trabalho com bits
Fig. 2 Exemplo 1.
ISR(PCINT0_vect);
10
//==========================================================================//
//MODO CTC PWM RPIDO PWM COM FASE CORRIGIDA
//
//==========================================================================//
//Autor: Charles Borges de Lima - 03/02/2011
//
//==========================================================================//
#include "definicoes.h"
//--------------------------------------------------------------------------int main()
{
DDRB = 0xFF;
DDRD = 0xFF;
//T/C0 - MODO CTC
TCCR0A = (1<<COM0A0)|(1<<WGM01); //modo CTC (no PWM)
OCR0A = 100;
//determinao do perodo do sinal gerado
TCCR0B = 1<<CS00;
//liga T/C0 sem prescaler
//==========================================================================//
//Habilitando todos os T/Cs para gerar interrupo por estouro para
//
//gerar formas de onde quadrada nos pinos PC0, PC1 e PC2
//
//==========================================================================//
//Autor: Charles Borges de Lima - 03/02/2011
//
//==========================================================================//
#include "definicoes.h"
ISR(TIMER0_OVF_vect);
ISR(TIMER1_OVF_vect);
ISR(TIMER2_OVF_vect);
//-----------------------------------------------------------------------int main()
{
DDRC = 0xFF;
//T/C0
TCCR0B = (1<<CS02)|(1<<CS00);
TIMSK0 = 1<<TOIE0;
//prescaler = 1024
//habilita interrupo por estouro
//T/C1
TCCR1B = 1<<CS11; //prescaler = 8
TIMSK1 = 1<<TOIE1; //habilita interrupo por estouro
//T/C2
TCCR2B = (1<<CS22)|(1<<CS21);
TIMSK2 = 1<<TOIE2;
sei();
//prescaler = 256
//habilita interrupo por estouro
//habilita as interrupes
for(;;);
}
//-----------------------------------------------------------------------ISR(TIMER0_OVF_vect){cpl_bit(PORTC,PC0);}
//-----------------------------------------------------------------------ISR(TIMER1_OVF_vect){cpl_bit(PORTC,PC1);}
//-----------------------------------------------------------------------ISR(TIMER2_OVF_vect){cpl_bit(PORTC,PC2);}
//------------------------------------------------------------------------
11
//
//
//
//
//
12
_delay_ms(2);
DADOS_LCD = (DADOS_LCD & 0x0F) | (c<<4);//segundo nibble, 4 LSB
i--;
}while(i>0);
}
//--------------------------------------------------------------------------//Sub-rotina para inicializao do LCD com via de dados de 4 bits
//--------------------------------------------------------------------------void inic_LCD_4bits()
//sequncia ditada pelo fabricando do circuito
{
// integrado HD44780
//o LCD ser s escrito ento R/W sempre zero
clr_bit(CONTR_LCD,RS); //RS em zero indicando que o dado para o LCD ser
//uma instruo
clr_bit(CONTR_LCD,E);
//pino de habilitao em zero
_delay_ms(20);
//interface 8 bits
ADCSRB = 0x00;
DIDR0 = 1<<ADC0D;
sei();
//habilita a interrupo
for(;;)
{
ident_num(temp);//converte o valor lido para seus dgitos individuais
cmd_LCD(0x89,0);
cmd_LCD(digitos[3],1);
cmd_LCD(digitos[2],1);
cmd_LCD(digitos[1],1);
cmd_LCD(',',1);
cmd_LCD(digitos[0],1);
cmd_LCD(0xDF,1);
cmd_LCD('C',1);
}
}
//---------------------------------------------------------------------------
13
//
//
//
//
//
14
ISR(ADC_vect)
{
temp = ADC + (ADC*19)/256;
OBSERVAES
do
{
}while (valor!=0);
}
//--------------------------------------------------------------------------
ATmega328).
BIBLIOGRAFIA
Application Note
ATmega8, ATmega8L.
Fig. 3 Exemplo 4.
15
16