/*******************************************************************************
FileName: main.c
Dependencies: Veja a secao de includes
Processor: Raspberry Pico
Compiler: SDK 1.5.1
Company: FATEC Santo Andre
Author: Prof. Edson Kitani
Date: 17/04/2025
Software License Agreement: Somente para fins didativos
*******************************************************************************
File Description: Controla Saídas Digitais e PWM - Já com Multicore
*
Change History:
1.0 12/09/2025 Versao inicial
*******************************************************************************/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include "pico/bootrom.h"
#include "ssd1306.h"
#include "hardware/timer.h"
#include "pico/time.h"
#include "hardware/irq.h"
//#include "pico/multicore.h"
//#include "pcf8574.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#include "hardware/gpio.h"
#include "pwm_fatec.h"
//====================================================================
// Definicoes do Projeto
//====================================================================
#define IN_74LS245 15 //Configura o SN74LS245 como entrada B->A.
#define botao_B1 22 //GPIO22.
#define sensor_H1 4 //Sensor Hall 1.
#define CONSTANTE_VELOCIDADE 2713079416 //2*pi*r
#define NUM_DENTES 50
//==================================================================
// Protótipos das Funções
//static void core1_entry(void);
//===================================================================
// Variáveis Globais
//===================================================================
// Buffer de RAM de tela
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8] = {0};
volatile int32_t time=0;
volatile uint32_t time_i=0;
volatile uint32_t time_f=0;
volatile uint8_t contagem=0;
volatile uint8_t medida_pronta=0;
int64_t velocidade_roda_ant = 0;
int64_t velocidade_roda_atual = 0;
int64_t aceleracao_roda_ant=0;
int64_t aceleracao_roda_atual=0;
void gpio_callback(uint gpio);
//===============================================================================================
void main(void)
{
uint64_t rps=0;
gpio_init(2);
gpio_set_dir(2, GPIO_OUT);
gpio_init(IN_74LS245);
gpio_set_dir(IN_74LS245, GPIO_OUT);
gpio_put(IN_74LS245, 0);
// Configura o pino 22 do botão B1 para função inicial de Boot
gpio_init(botao_B1);
gpio_set_dir(botao_B1, GPIO_IN);
bool boot = gpio_get(botao_B1);
if(boot == 0) {reset_usb_boot(0, 0);}
gpio_init(sensor_H1);
gpio_set_dir(sensor_H1, GPIO_IN);
gpio_set_irq_enabled_with_callback(sensor_H1, GPIO_IRQ_EDGE_FALL, true, (gpio_irq_callback_t)&gpio_callback);
// Inicializa a UART com baud rate de 115200 e Sensor Ultrassom
stdio_init_all();
// Inicializa a interface I2C e o display
//SSD1306_init();
// Limpa o buffer
//ssd1306_clear_buffer(display_buffer);
//ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
//sleep_ms(2000);
// Escreve texto no buffer
//ssd1306_write_text(display_buffer, 0, 24, "PWM= ");
//ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
// Ativa o Core 1 para cuidar do temporizador e das interrupções associadas
//multicore_launch_core1(core1_entry);
sleep_ms(2000);
while (true)
{
gpio_put(2, 1);
sleep_ms(50);
printf("tempo 1 = %d us\n" ,time_i);
printf("tempo 2 = %d us\n",time_f);
printf("Medida Pronta = %d \n",medida_pronta);
rps=10;
if(medida_pronta)
{
printf("intervalo de tempo = %d us \n",time);
printf("intervalo de tempo = %d us \n",time_f-time_i);
printf("intervalo de tempo = %d us \n",time_f+~time_i+1);
if(time)
{
rps=1000000;
velocidade_roda_atual = rps;
}
}
printf("Rotação de roda = %d rps\n",rps);
printf("Velocidade de roda = %d Vroda\n",velocidade_roda_atual);
}
}
void gpio_callback(uint gpio)
{
if(gpio==sensor_H1)
{
if(contagem==0)
{
time_i=time_us_32();
contagem=1;
medida_pronta=0;
}
else
{
time_f=time_us_32();
contagem=0;
time=time_f-time_i;
medida_pronta=1;
}
}
}