// Trabalho 2
// Alunos: Cleidson Favalessa, Kamilla e Tchiarley Alves
// Disciplina: Sistemas Embarcados, prof. Leticia Araujo
// Definições dos Pinos e Tempos
#define LED1_PIN 4 // pino do LED1
#define LED2_PIN 5 // pino do LED2
#define LED3_PIN 6 // pino do LED3
#define TIMER1_INTERVAL 15625 // Valor de comparação para Timer1 (250ms)
// Definição de Variáveis
volatile bool flagLED1 = false; // Flag para LED1
volatile bool flagLED2 = false; // Flag para LED2
volatile bool flagLED3 = false; // Flag para LED3
volatile bool flagExibe = false; // Flag para LED3
volatile int contador_aux1 = 0;
volatile int contador_aux2 = 0;
volatile int contador_aux3 = 0;
volatile int contador_aux4 = 0;
// Pinos do gerador de sinais
#define ANALOG_PIN1 A0 // Pino analógico A0
#define ANALOG_PIN2 A1 // Pino analógico A1
#define THRESHOLD 512 // Limite para detectar a borda de subida (valor médio de uma onda senoidal de 0-5V)
volatile bool risingEdgeDetected1 = false;
volatile bool risingEdgeDetected2 = false;
volatile unsigned long lastTime1 = 0;
volatile unsigned long lastTime2 = 0;
volatile unsigned long period1 = 0;
volatile unsigned long period2 = 0;
unsigned long frequency1;
unsigned long frequency2;
volatile int lastAnalogValue1 = 0;
volatile int lastAnalogValue2 = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); // Inicializa a comunicação serial
// Configuração dos pinos dos LEDs como saída
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
digitalWrite(LED1_PIN, LOW); // Inicializa o LED1 desligado
digitalWrite(LED2_PIN, LOW); // Inicializa o LED2 desligado
digitalWrite(LED3_PIN, LOW); // Inicializa o LED13 desligado
// Configura Timer1 para gerar interrupção a cada 1ms
cli(); // Desabilita interrupções globais
TCCR1A = 0; // Zera o registrador de controle do Timer1 A
TCCR1B = 0; // Zera o registrador de controle do Timer1 B
TCNT1 = 0; // Zera o contador do Timer1
OCR1A = 249; // Define o valor de comparação para 1ms (16000000/(64*1000)-1)
TCCR1B |= (1 << WGM12); // Configura o Timer1 no modo CTC
TCCR1B |= (1 << CS11) | (1 << CS10); // Define o prescaler para 64
TIMSK1 |= (1 << OCIE1A); // Habilita a interrupção de comparação do Timer1
sei(); // Habilita interrupções globais
// Inicializa as variáveis lastAnalogValue com as leituras iniciais dos pinos analógicos
lastAnalogValue1 = analogRead(ANALOG_PIN1);
lastAnalogValue2 = analogRead(ANALOG_PIN2);
}
void loop() {
// put your main code here, to run repeatedly:
if (risingEdgeDetected1) {
risingEdgeDetected1 = false; // Reseta a flag de detecção de borda de subida
frequency1 = 1000000 / period1; // Calcula a frequência em Hz
}
if (risingEdgeDetected2) {
risingEdgeDetected2 = false; // Reseta a flag de detecção de borda de subida
frequency2 = 1000000 / period2; // Calcula a frequência em Hz
}
if (flagExibe) {
flagExibe = false; // Limpa a flag
Serial.print("Frequência de onda A0: ");
Serial.print(frequency1);
Serial.print(" Hz ; ");
Serial.print("A1: ");
Serial.print(frequency2);
Serial.println(" Hz");
}
if (flagLED1) {
flagLED1 = false; // Limpa a flag
digitalWrite(LED1_PIN, !digitalRead(LED1_PIN)); // Alterna o estado do LED1
}
if (flagLED2) {
flagLED2 = false; // Limpa a flag
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN)); // Alterna o estado do LED2
}
if (flagLED3) {
flagLED3 = false; // Limpa a flag
digitalWrite(LED3_PIN, !digitalRead(LED3_PIN)); // Alterna o estado do LED3
}
}
// ISR para o Timer1 comparação
ISR(TIMER1_COMPA_vect) {
unsigned long currentTime = micros(); // Obtém o tempo atual em microssegundos
int currentAnalogValue1 = analogRead(ANALOG_PIN1); // Lê o valor atual do pino analógico A0
if (currentAnalogValue1 > THRESHOLD && lastAnalogValue1 <= THRESHOLD) {
period1 = currentTime - lastTime1; // Calcula o período da onda
lastTime1 = currentTime; // Atualiza o último tempo de borda de subida
risingEdgeDetected1 = true; // Seta a flag de detecção de borda de subida
}
lastAnalogValue1 = currentAnalogValue1; // Atualiza o último valor analógico lido
int currentAnalogValue2 = analogRead(ANALOG_PIN2); // Lê o valor atual do pino analógico A1
if (currentAnalogValue2 > THRESHOLD && lastAnalogValue2 <= THRESHOLD) {
period2 = currentTime - lastTime2; // Calcula o período da onda
lastTime2 = currentTime; // Atualiza o último tempo de borda de subida
risingEdgeDetected2 = true; // Seta a flag de detecção de borda de subida
}
lastAnalogValue2 = currentAnalogValue2; // Atualiza o último valor analógico lido
contador_aux1++;
if (contador_aux1 == 250) {
flagLED1 = true; // Seta a flag do LED2 a cada 500ms
contador_aux1 = 0;
}
contador_aux2++;
if (contador_aux2 == 500) {
flagLED2 = true; // Seta a flag do LED3 a cada 1s
contador_aux2 = 0;
}
contador_aux3++;
if (contador_aux3 == 1000) {
flagLED3 = true; // Seta a flag do LED4 a cada 2s
contador_aux3 = 0;
}
contador_aux4++;
if (contador_aux4 == 200) {
flagExibe = true; // Seta a flag do LED2 a cada 500ms
contador_aux4 = 0;
}
}