/******************************************************************************
* HEADER-FILES (Somente os arquivos necessarios nesse arquivo)
******************************************************************************/
#include "main.h"
#include "ssd1306.h"
#include "ssd1306_graphic.h"
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <hardware/sync.h>
#include <stdint.h>
/*****************************************************************************/
/******************************************************************************
* Variaveis Globais
******************************************************************************/
// Buffer de tela global
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8] = {0};
uint8_t estado_ignicao = 0;
uint16_t timer_execucao[NUM_TASKS];
//aqui a task de leitura anota os resultados e as tasks dos leds vem ler
/*****************************************************************************/
/******************************************************************************
* Prototipos das funcoes
******************************************************************************/
void system_init(void);
void alarm_irq(void);
void init_timer_irq(void);
/*****************************************************************************/
/******************************************************************************
Funcao: void main(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Função principal
*****************************************************************************/
int numeros [4] = {10,20,30,40};
int result_soma (int *num_vetor, int tamanho);
void main(void)
{
int total_soma = 0;
stdio_init_all();
system_init(); /* Inicializa hardware do RP2040 */
SSD1306_init(); /* Inicializa display e pinos de comunicação */
// Limpa o buffer do display
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, 32, 0, "FATEC ");
ssd1306_write_text(display_buffer, 10, 8, "SANTO ANDRE");
ssd1306_write_text(display_buffer, 28, 24, "T.A.P.M.");
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(2000);
total_soma = result_soma (numeros, 4);
printf("Valor total da soma %d\n", total_soma);
}
/************************************************************************************/
/******************************************************************************
Funcao: void system_init(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Inicializa sistema (microcontrolador e periféricos)
*****************************************************************************/
void system_init(void)
{
printf("Init Hardware ....\n");
sleep_ms(10);
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN); // Enable pull-up resistor
for(int i = 0; i < 8; i++){
gpio_init(chaves[i]);
gpio_set_dir(chaves[i], GPIO_IN);
gpio_pull_up(chaves[i]);
}
gpio_init(LD_1);
gpio_set_dir(LD_1, GPIO_OUT);
gpio_put(LD_1,0);
gpio_init(LD_2);
gpio_set_dir(LD_2, GPIO_OUT);
gpio_put(LD_2,0);
gpio_init(LD_3);
gpio_set_dir(LD_3, GPIO_OUT);
gpio_put(LD_3,0);
gpio_init(LD_4);
gpio_set_dir(LD_4, GPIO_OUT);
gpio_put(LD_4,0);
init_timer_irq();
}
/******************************************************************************
Funcao: void alarm_irq(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Função tratamento interrupcao do TIMER_IRQ_0
*****************************************************************************/
void alarm_irq(void)
{
// Clear the alarm irq
hw_clear_bits(&timer_hw->intr, 1u << ALARM_NUM);
for(uint8_t cnt = 0; cnt < NUM_TASKS; cnt++)
{
if(timer_execucao[cnt]) timer_execucao[cnt]--;
}
uint64_t target = timer_hw->timerawl + DELAY;
// Write the lower 32 bits of the target time to the alarm register, arming it.
timer_hw->alarm[ALARM_NUM] = (uint32_t) target;
}
/******************************************************************************
Funcao: void init_timer_irq(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Função para inicialização do TIMER_IRQ_0 (100ms)
*****************************************************************************/
void init_timer_irq(void)
{
// Enable the interrupt for the alarm (we're using Alarm 0)
hw_set_bits(&timer_hw->inte, 1u << ALARM_NUM) ;
// Associate an interrupt handler with the ALARM_IRQ
irq_set_exclusive_handler(ALARM_IRQ, alarm_irq) ;
// Enable the alarm interrupt
irq_set_enabled(ALARM_IRQ, true) ;
uint64_t target = timer_hw->timerawl + DELAY;
// Write the lower 32 bits of the target time to the alarm register, arming it.
timer_hw->alarm[ALARM_NUM] = (uint32_t) target;
}
/******************************************************************************
Funcao: void button_callback(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Função tratamento interrupcao do botao
*****************************************************************************/
int result_soma (int *num_vetor, int tamanho){
int total_soma = 0;
for(int i = 0; i < tamanho; i++){
total_soma = total_soma + *num_vetor;
num_vetor++;
}
return total_soma;
}Ignição
LD_1
LD_4
LD_2
LD_3