Buscar

Aula 05 - Sistemas Embarcados - O1 - T1


Continue navegando


Prévia do material em texto

Thiago Mayrink
Automação Industrial 
Sistemas Embarcados – Aula 05
thiago.mayrink@aiscer com.br
(31) 98474-9537
Belo Horizonte, Minas Gerais
05 de outubro de 2021
Sistemas Embarcados - SE
Continuação de Exercícios de escrita de display
Exercício com entradas analógicas
Exercício de acionamento de bombas de água em um tanque 
(entrada analógica)
Aula 04
Sistemas Embarcados - SE
Exercícios de interrupção
Exercícios de timer
Exercícios de comunicação serial
Aula 05
Sistemas Embarcados - SE
Exemplo 1 
• Ligar/desligar o led da 
saída RD4 usando a 
interrupção EXT do 
pino B0
#include "interrup.h"
#include "visor.h"
#int_EXT
void EXT_isr() 
{
output_toggle(PIN_D4);
clear_interrupt(INT_EXT);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
lcd_ini();
desliga_cursor();
while(true){
delay_ms(5000);
if(input_state(PIN_B0)){
pos_linha(1);
printf(lcd_escreve,"LIGADO "); 
} else {
pos_linha(1);
printf(lcd_escreve,"DESLIGADO"); 
}
}
}
Sistemas Embarcados - SE
Exemplo 2 
• Ligar/desligar o led da 
saída RD4 usando a 
interrupção EXT do 
pino B0 porém, 
configurando a 
verificação com borda 
de descida
#include "interrup.h"
#include "visor.h"
#int_EXT
void EXT_isr() 
{
output_toggle(PIN_D4);
clear_interrupt(INT_EXT);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
lcd_ini();
desliga_cursor();
while(true){
delay_ms(5000);
if(input_state(PIN_B0)){
pos_linha(1);
printf(lcd_escreve,"LIGADO "); 
} else {
pos_linha(1);
printf(lcd_escreve,"DESLIGADO"); 
}
}
}
Sistemas Embarcados - SE
Exemplo 3 
• Ligar/desligar o led da 
saída RD4 usando a 
interrupção de 
mudança de estado 
do pino B4
#include "interrupcao.h"
#include "visor.h"
#int_RB
RB_isr() 
{
output_toggle(PIN_D4);
clear_interrupt(INT_RB);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
lcd_ini();
desliga_cursor();
while(true){
delay_ms(5000);
if(input_state(PIN_B4)){
pos_linha(1);
printf(lcd_escreve,“B4 LIGADO "); 
} else {
pos_linha(1);
printf(lcd_escreve,“B4 DESLIGADO"); 
}
}
}
Sistemas Embarcados - SE
Exemplo 4 
• Interrupção por 
alteração de estado 
do pino
Sistemas Embarcados - SE
Exemplo 4 
• Interrupção por 
alteração de estado 
do pino
Sistemas Embarcados - SE
Exemplo 5 
• Usando o firmware do 
teclado anterior, fazer 
um firmware que 
simula o controle de 
um micro-ondas
Tecla Alimento Tempo (s)
1 Pipoca 20
2 Brigadeiro 10
3 Hot Dog 15
4 Arroz 40
5 Macarrão 30
6 Omelete 5
7 Bolo 50
8 Refeição 25
9 Descongelar 30
* Iniciar -
# Parar -
0 Pausar -
Sistemas Embarcados - SE
Exemplo 5 
• Operação:
• Na primeira linha, ficará o nome do alimento escolhido
• Na segunda Linha ficará o tempo de preparo do alimento
• Se nenhuma opção tiver sido escolhida, na primeira linha ficará escrito 
“Escolha a opção” e na segunda linha o tempo “00”
• A tecla “*” iniciará o preparo, sendo que durante o preparo, o nome do 
alimento continuará sendo apresentado na primeira linha e deverá ser 
mostrado a contagem regressiva na segunda linha
• A tecla “*” não terá efeito quando não houver alimento escolhido
• A tecla “#” interrompe o processo a qualquer momento, e volta ao modo 
inicial (“escolha a opção”)
• A tecla “0“ pausa e retorna, e só tem efeito durante o preparo
Sistemas Embarcados - SE
Trabalho 04
• Complementar o exercício do exemplo anterior
Sistemas Embarcados - SE
Exemplo 6 
• Interrupção por timers
• Timer0: É de 8 bits, conta de 0 a 255(00 a FF), a fonte de clock pode 
ser externa ou interna
• Timer1: É de 16 bits conta de 0 a 65.535 (0000 a FFFF), a fonte de 
clock pode ser externa ou interna
• Timer 2: É de 8 bits, conta de 0 a 255(00 a FF), também é usado pelo 
módulo de PWM
• WDT: É de 8bit, reseta o microcontrolador quando estoura
Sistemas Embarcados - SE
Exemplo 6 
• Piscar o LED D4 
com a 
frequência de 
1Hz usando o 
timer 0
#include "timer.h"
#include "visor.h"
int estouro=0;
#int_TIMER0
void TIMER0_isr()
{
estouro++;
if (estouro>=38){ //aproximadamente 0.5s
output_toggle(PIN_D4);
estouro = 0;
}
clear_interrupt(INT_TIMER0);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
lcd_ini();
desliga_cursor();
// TODO: USER CODE!!
while (true){
pos_linha(1);
printf(lcd_escreve,"Pisca LED");
}
}
Sistemas Embarcados - SE
Exemplo 7 
• Fazer um 
relógio com 
timer 1
#include "relogio.h"
#include "visor.h"
int estouro=0,hora=11,minuto=32,segundo=0;
#int_TIMER1
TIMER1_isr() 
{
estouro++;
if (estouro>=10){
estouro=0;
segundo++;
if(segundo>=60){
segundo=0;
minuto++;
if(minuto>=60){
minuto++;
hora++;
if (hora>=24){
hora=0;
}
}
}
}
clear_interrupt(INT_TIMER1);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
lcd_ini();
desliga_cursor();
while(true){
pos_linha(1);
printf(lcd_escreve,"%02u:%02u:%02u", hora,minuto,segundo);
}
}
Sistemas Embarcados - SE
Exemplo 8 
• Fazer um 
contador 
utilizando o 
Timer 1
#include "contador.h"
#include "visor.h"
void main()
{
int16 contagem;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_ini();
desliga_cursor();
// TODO: USER CODE!!
while(true){
contagem=get_timer1();
pos_linha(1);
printf(lcd_escreve,"cont:%05Lu",contagem);
if(input(PIN_B0)){
set_timer1(0);
}
}
}
Sistemas Embarcados - SE
Exemplo 9 
• Escrever a palavra 
“teste” na serial do 
microcontrolador
#include "escreveteste.h"
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
while(true){
printf("Teste\r\n");
delay_ms(2000);
}
}
Sistemas Embarcados - SE
Exemplo 10 
• Receber caractere 
na porta serial 
palavra “teste” no 
micro na serial
#include "recebecaracter.h"
#include "visor.h"
void main()
{
int caractere;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_ini();
desliga_cursor();
// TODO: USER CODE!!
while(true){
caractere=getc();
printf(lcd_escreve,"%c",caractere);
delay_ms(2000);
caractere=0;
}
}Sistemas Embarcados - SE
Exemplo 11 
• Acionar os LEDs 
de acordo com o 
caractere 
recebido na serial
Caractere Ação
0 Desliga todos os LEDs
1 Liga LED D4
2 Desliga LED D4
3 Liga LED D5
4 Desliga LED D5
5 Liga LED D6
6 Desliga LED D6
7 Liga LED D7
8 Desliga LED D7
9 Liga todos os LEDs
Sistemas Embarcados - SE
Exemplo 12 
• Escrever na porta 
serial o valor de 
um conversor 
analógico
#include "serialescreve.h"
#include "visor.h"
void main()
{
int16 valorad;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_ini();
desliga_cursor();
set_adc_channel(0);
// TODO: USER CODE!!
while(true){
valorad=read_adc();
printf("AD:%04Lu\r\n",valorad);
delay_ms(2000);
}
}
Sistemas Embarcados - SE
Obrigado!!!
Thiago Mayrink
thiago.mayrink@aiscer.com.br
(31) 98474-9537