#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include <hardware/irq.h>
#include "hardware/timer.h"
//Definições de constantes para o controle do PWM
//Pino do LED conectado
const uint LED = 12;
//Periodo do PWM (valor máximo do contador)
const uint16_t PERIOD = 7812;
const float DIVIDER_PWM = 16.0;
//Divisor fracional do clock para o PWM
const uint16_t LED_STEP = 390;
//Passo de incremento/decremento para o duty cycle do LED
const uint32_t PWM_REFRESH_LEVEL = 400000;
//Nível inicial do PWM (duty cycle do LED)
uint16_t led_level = 390;
const bool flag = false;
int64_t turn_off_callback(alarm_id_t, void *user_data) {
// gpio_put(LED_PIN, false); // Desliga o LED
// blinking = false; // Para o ciclo de piscar
// printf("\nLED DESLIGADO\n");
return 0;
}
void pwm_irq_handler(){
//Variável que controla se o LED está aumentando ou diminuindo
static bool up_down = true;
//Contador para controlar a frequência de atualização
static uint32_t count = 0;
//Obtém o status da interrupção do PWM
uint32_t slice = pwm_get_irq_status_mask();
printf("Mascara de status do pwm %d\n",slice);
//limpa a interrupção do slice correspondente
pwm_clear_irq(slice);
// //Reseta o contador para iniciar a próxima verificação
count = 0;
//Ajusta o duty cycle do LED, alternando entre aumentar e diminuir
//if(up_down){
//Incrementa o nível do LED
led_level += LED_STEP;
pwm_set_gpio_level(LED, led_level);
if(led_level >= 7800){
//Muda a direção para diminuir o brilh do LED
//quando atingir o valor máximo
led_level = 390;
pwm_set_gpio_level(LED, led_level);
up_down = true;
}
//}else if(!up_down){
//Decrementa o nível do LED
//led_level -= LED_STEP;
//if(led_level <= 380 && up_down==0){
//Muda direção para aumentar o brilho quando atingir
//o valor mínimo
//up_down = true;
//}
//Atualiza o duty cycle do PWM para o pino do LED
//printf("Valor do incremento: %d\n", led_level);
//}
}
//Função para configurar o PWM para o LED
void setup_pwm()
{
//Configura o pino do LED para a função PWM
gpio_set_function(LED, GPIO_FUNC_PWM);
//Obtém o slice do PWM associado ao pino do GPIO
uint slice = pwm_gpio_to_slice_num(LED);
//Define o divisor de clock do PWM
pwm_set_clkdiv(slice, DIVIDER_PWM);
//Configura o valor máximo do contador período)
pwm_set_wrap(slice, PERIOD);
//Habilita o PWM no slice correspondente
pwm_set_enabled(slice, true);
//Configuração e habilitação a interrupção do PWM
//Habilita interrupções para o slice do PWM
pwm_set_irq_enabled(slice, true);
//Define o handler da interrupção
irq_set_exclusive_handler(PWM_IRQ_WRAP, pwm_irq_handler);
//printf("flag: %d \n", PWM_IRQ_WRAP);
//Limpa interrupções pendentes do slice
pwm_clear_irq(slice);
//Habilita interrupções globais para o PWM
irq_set_enabled(PWM_IRQ_WRAP, true);
}
int main(){
stdio_init_all();
setup_pwm();
while(true){
//printf("flag %d",flag);
// O loop principal pode ser usado para outras tarefas
}
}