Escolar Documentos
Profissional Documentos
Cultura Documentos
3º Quadrimestre
Santo André, Novembro – 2019
1. INTRODUÇÃO
int16_t
val7seg = 0x00FF, // inicia 7-seg com 0xF (tudo apagado)
serial_data = 0x01FF, // dado a serializar (dig | val7seg)
val_adc = 0; // valor lido no ADC
tIN_ADC_varre = milis();
} // fim da tarefa #1 (conversão ADC se modo=1)
tIN_ADC_varre = milis();
} // fim da tarefa #1
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
//#2 converte o valor ADC para milivolts (decimal, para lermos no 7-seg)
if (get_modo_oper()==2) // entra qdo valor val_adc atualizado
{
// converter o valor lido em decimais p/ display
miliVolt = val_adc*3300/4095;
uniADC = miliVolt/1000;
decADC = (miliVolt-(uniADC*1000))/100;
cenADC = (miliVolt-(uniADC*1000)-(decADC*100))/10;
milADC = miliVolt-(uniADC*1000)-(decADC*100)-(cenADC*10);
set_modo_oper(0); // zera var modo_oper
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);// apaga o LED PC13
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);// liga o LED PC14
}
// tarefa #3 FAZ SEMPRE: qdo milis() > DELAY_VARRE ms, desde a última
mudança
if ((HAL_GetTick()-tIN_varre) > DT_VARRE) // se ++0,1s atualiza o display
{
tIN_varre = HAL_GetTick(); // salva tIN p/ prox tempo varredura
switch(sttVARRE) // teste e escolha de qual DIG vai varrer
{
case DIG_MILS:
{
sttVARRE = DIG_CENS; // ajusta p/ prox digito
serial_data = 0x0001; // display #1
val7seg = conv_7_seg(milADC);
break;
}
case DIG_CENS:
{
sttVARRE = DIG_DEC; // ajusta p/ prox digito
serial_data = 0x00002; // display #2
if(cenADC>0 || decADC>0 || uniADC>0)
{
val7seg = conv_7_seg(cenADC);
} else {
val7seg = conv_7_seg(DIGITO_APAGADO);
}
break;
}
case DIG_DEC:
{
sttVARRE = DIG_UNI; // ajusta p/ prox digito
serial_data = 0x0004; // display #3
if(decADC>0 || uniADC>0)
{
val7seg = conv_7_seg(decADC);
} else {
val7seg = conv_7_seg(DIGITO_APAGADO);
}
break;
}
case DIG_UNI:
{
sttVARRE = DIG_MILS; // ajusta p/ prox digito
serial_data = 0x0008; // display #3
if(uniADC>0)
{
val7seg = conv_7_seg(uniADC);
val7seg &=0x7FFF; // liga o ponto decimal
} else {
val7seg = conv_7_seg(DIGITO_APAGADO);
}
break;
}
} // fim case
tIN_varre = HAL_GetTick(); // tmp atual em que fez essa varredura
serial_data |= val7seg; // OR com val7seg = dado a serializar
serializar(serial_data); // serializa dado p/74HC595 (shift reg)
} // -- fim da tarefa #2 - varredura do display
}
/* USER CODE END 3 */
}
Note na rotina principal, para além das novas funções utilizadas devido as novas
bibliotecas consumidas, as linhas em destaque amarelo, pois estas linhas são onde
o canal ADC é inicializado (configuração de modo de scan, por exemplo) e
configurado para que funcione no modo de interrupção. Em seguida, ainda no
arquivo principal, são configurados o ADC e a função de serialização dos dados e
de conversão dos dados para hexadecimal com uma estrutura switch-case.
void ADC1_2_IRQHandler(void)
{
HAL_ADC_IRQHandler(&hadc1);
}
void EXTI9_5_IRQHandler(void)
{
if((HAL_GetTick()-tIN_IRQ6)>DT_DEBOUNCING)
{
tIN_IRQ6 = HAL_GetTick(); // tIN (ms) da última IRQ6
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)==0)
{
++ modo_oper; // incrementa modo operação
if (modo_oper>MAX_MODO_OPER) modo_oper=0;// se >MAX voltar modo_oper=0
}
}
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
}
Finalmente, são estruturadas as funções de configuração e retorno da variável
modo_oper, impedindo que a variável supere o valor de MAX_MODO_OPER (2,
definido no cabeçalho), por ser o número de tarefas condicionais onde a variável é
testada).
void set_modo_oper(int x)
{
if(x>MAX_MODO_OPER) // se x maior MAX permitido
{
modo_oper=MAX_MODO_OPER; // set apenas com max
}else if(x<0) // se x menor que 0
{
modo_oper=0; // set com 0
}else // valor no intervalo 0-MAX
{
modo_oper=x; // modifica modo_oper
}
}
// fn que qpenas retorna o valor da var modo_oper
int get_modo_oper(void){
static int x; // var local recebe modo_oper
// OBS: seção crítica, desabilitamos todas as IRQs p/ atualizar var
__disable_irq(); // desabilita IRQs
x = modo_oper; // faz x = modo_oper
__enable_irq(); // volta habilitar IRQs
return x; // retorna x (=modo_oper)
}
5. CONCLUSÕES
6. REFERÊNCIAS
[1] RANHEL, João. Sistemas Microprocessados: Apostila com práticas e foco nos
processadores ARM CORTEX, ver. 3, out. 2019.