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