#include <avr/pgmspace.h> //biblioteca para poder gravar dados na memória flash
#include <avr/io.h>
#include <util/delay.h>
unsigned long clique = 0;
unsigned long clique2 = 0;
char last_state = (1<<PB0);
char last_state2 = (1<<PB2);
unsigned long lastupdate = 0;
unsigned long angulo = 1050;
char d0 = 0;
char d1 = 0;
char d2 = 0;
char d3 = 0;
char d = 0;
char saida;
void exibe_valor(unsigned int valor){
d0 = valor%10;
d1 = (valor/10)%6;
d2 = (valor/60)%10;
d3 = (valor/1200)%6;
}
unsigned int valor = 1000; //declara variável local
//Digito 0 = PC3
//Digito 1 = PC4
//Digito 2 = PC5
//Digito 3 - PC2
//variável gravada na memória flash
const unsigned char Tabela[] PROGMEM = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x18, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0E};
//---------------------------------------------------------------------------------------------------
//ISR(TIMER1_COMPA_vect) {
// PORTB ^= 1;
//}
int main() {
init();
DDRB &= ~(1<<PB0);
DDRB |= (1<<PB1);
DDRB &= ~(1<<PB2);
DDRC = 0xff;
DDRD = 0xff; //PORTD como saída (display)
ICR1 = 39999; // 20ms
OCR1A = 1050;
TCCR1A = (1<<WGM11);
TCCR1B |= (1<<CS11)|(1<<WGM12)|(1<<WGM13);
//TIMSK1 = (1<<OCIE0A);
// ativar a saída no pino somente depois
// de configurar o modo de operação do timer
TCCR1A |= (1<<COM1A1);
sei();
PORTD = 0XFF; //desliga o display
UCSR0B = 0x00; //PD0 e PD1 como I/O genérico, para uso no Arduino
PORTB |= (1<<PB0); //PB0 pull up
PORTB |= (1<<PB2); //PB2 pull up
while(1){
char leitura = PINB & (1<<PB0);
char leitura2 = PINB & (1<<PB2);
if(leitura!=last_state && (millis()-clique)>1) {
clique = millis();
if (leitura == 0 && angulo != 1050){
angulo -= angulo;
OCR1A = angulo;
}
last_state = leitura;
}
if(leitura2!=last_state2 && (millis()-clique2)>1) {
clique2 = millis();
if (leitura2 == 0 && angulo < 4950) {
angulo += angulo;
OCR1A = angulo;
}
last_state2 = leitura2;
}
if (/*millis()%20==0*/(millis()-lastupdate)>=5) {
lastupdate = millis();
d++;
d%=4;
if (d==3) {
PORTC = 0;
saida = d3;
PORTD = pgm_read_byte(&Tabela[saida]);
PORTC |= (1<<PC3);
}
else if (d==2) {
PORTC = 0;
saida = d2;
PORTD = pgm_read_byte(&Tabela[saida]);
PORTC |= (1<<PC4);
}
else if (d==1) {
PORTC = 0;
saida = d1;
PORTD = pgm_read_byte(&Tabela[saida]);
PORTC |= (1<<PC5);
}
else if (d==0) {
PORTC = 0;
saida = d0;
PORTD = pgm_read_byte(&Tabela[saida]);
PORTC |= (1<<PC2);
}
}
//OCR1A = 4000; //regra de três para determinar este valor: ICR1(TOP) = 20 ms, OCR1A (4000) = 2 ms)
//OCR1A = 1050; //valor ajustado, OCR1A (1050) = 0,525 ms - valor mínimo 0 grau para servo motor Tower Pro não vibrar
//OCR1A = 2000; //valor ajustado, OCR1A (2048) = 1,000 ms -
//OCR1A = 3000; //valor ajustado, OCR1A (3072) = 1,500 ms -
//_delay_ms(1000);
//OCR1A = 4000; //valor ajustado, OCR1A (4114) = 2,000 ms -
//_delay_ms(1000);
//OCR1A = 4950; //valor ajustado, OCR1A (5138) = 2,475 ms - valor mínimo 180 graus para servo motor Tower Pro não vibrar
//_delay_ms(3000);
_delay_ms(1);
}
}