Você está na página 1de 26

IF68E – Sistemas Embarcados

LISTA DE EXERCÍCIOS 1

Bruno Oliveira Rosa 1998390

Cesar Augusto Dias Batista 1477510

João Pedro de Souza 1998455

Sidney Prasniewski 1539744

02 de outubro 2023
Prof. André Sanches Fonseca Sobrinho

Valor: 1,5 pontos


Formato de entrega: código C

1 – Implemente no microcontrolador PIC18F4550, por meio do kit Exsto, o


Exemplo 1 da Apostila 1, com as seguintes modificações:
- o LED1 deve alternar seu funcionamento a cada 5ms;
- a taxa de transmissão serial deve ser de 57600bps.

#include <p18f4550.h>
#pragma config FOSC = HS // Fosc = 20MHz Tcy = 200ns
#pragma config CPUDIV = OSC1_PLL2 // PLL desligado
#pragma config WDT = OFF // Watchdog desativado
#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais
#pragma config LVP = OFF // Desabilita gravação em baixa tensão
#pragma config DEBUG = OFF // habilita debug
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
void TAREFA2(void);
void TAREFA3(void);
void main (void){
TRISD=0x00;
T0CON=0b10000011; //pre=16
INTCONbits.TMR0IE=0;
TXSTAbits.BRGH=1;
BAUDCONbits.BRG16=0;
SPBRG=21; //Configura o bau-date para 9600
TXSTAbits.SYNC=0; //Habilita comunicação assíncrona
RCSTAbits.SPEN=1; //Habilita os pinos de I/O para a serial
TRISCbits.TRISC6=1; //Habilita o pino TX como entrada
TXSTAbits.TXEN=1;

for(;;){
START_TIMER(); //Inicia a contagem de 10ms
//TAREFA 1 - LED1 a cada 10ms obrigatóriamente
TAREFA1();
//TAREFA 2 - Transmitir a mensagem "CORNELIO" (tempo mínimo de execução
8,8ms)
TAREFA2();
//TAREFA 3 - Transmitir a mensagem "PROCOPIO" (tempo mínimo de execução
8,8ms)
//TAREFA3();
VERIFY_END_TIMER();
}}
void START_TIMER(void){
TMR0H=0xF9;
TMR0L=0xE6; //65536-3125(10 ms)
INTCONbits.TMR0IF=0;
}
void VERIFY_END_TIMER(void){
while(INTCONbits.TMR0IF==0) {}
}
void TAREFA1(void){
PORTDbits.RD1=!PORTDbits.RD1;
}
void TAREFA2(void){
while (TXSTAbits.TRMT==0) {} //1,1 ms para cada caracter transmitido com 9600
bps
TXREG='C';
while (TXSTAbits.TRMT==0) {}
TXREG='O';
while (TXSTAbits.TRMT==0) {}
TXREG='R';
while (TXSTAbits.TRMT==0) {}
TXREG='N';
while (TXSTAbits.TRMT==0) {}
TXREG='E';
while (TXSTAbits.TRMT==0) {}
TXREG='L';
while (TXSTAbits.TRMT==0) {}
TXREG='I';
while (TXSTAbits.TRMT==0) {}
TXREG='O';
}
void TAREFA3(void){
while (TXSTAbits.TRMT==0) {}
TXREG='P';
while (TXSTAbits.TRMT==0) {}
TXREG='R';
while (TXSTAbits.TRMT==0) {}
TXREG='O';
while (TXSTAbits.TRMT==0) {}
TXREG='C';
while (TXSTAbits.TRMT==0) {}
TXREG='O';
while (TXSTAbits.TRMT==0) {}
TXREG='P';
while (TXSTAbits.TRMT==0) {}
TXREG='I';
while (TXSTAbits.TRMT==0) {}
TXREG='O';
}

2 – Para o exercício 1, todas as tarefas serão executadas corretamente?


Justifique sua resposta, utilizando a comparação com o Exemplo 1 da
Apostila 1.

R: Sim , por causa do BaudRATE alto a soma do tempo de execução é


menor que o tempo da tarefa.

3 – Implemente no microcontrolador PIC18F4550, por meio do kit Exsto,


uma estrutura “SINGLE LOOP”, onde as seguintes tarefas devem ser
implementadas:
- O led D14 deve permanecer 100ms ligado e 100ms desligado;
- O led D15 deve permanecer 200ms ligado e 200ms desligado;
- O led D16 deve permanecer 200ms ligado e 150ms desligado;
Obs2: os leds D14, D15, D16, D17 e D18 são controlados pelos pinos de
I/O RD4, RD3, RD2, RD1 e RD0 respectivamente. Nível lógico 1 apaga os
leds e nível lógico 0 acende os mesmos.

#include <p18f4550.h>
#pragma config FOSC = HS // Fosc = 20MHz Tcy = 200ns
#pragma config CPUDIV = OSC1_PLL2 // PLL desligado
#pragma config WDT = OFF // Watchdog desativado
#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais
#pragma config LVP = OFF // Desabilita gravação em baixa tensão
#pragma config DEBUG = OFF // habilita debug
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
void TAREFA2(void);
void TAREFA3(void);
unsigned char cont=0;
unsigned char cont2=0;
unsigned char cont1=0;
unsigned char est=0;
void main (void){
TRISD=0x00;
T0CON=0b10000111;
INTCONbits.TMR0IE=0;
for(;;){
START_TIMER();
//TAREFA 1 - LED1 a cada 100ms
TAREFA1();
//TAREFA 2 - LED2 a cada 200ms
TAREFA2();
//TAREFA 3 - LED3 a cada 200ms ligado e 150ms desligado
TAREFA3();
VERIFY_END_TIMER();
}}
void START_TIMER(void){
TMR0H=0xFC;
TMR0L=0x2F; //(50 ms)
INTCONbits.TMR0IF=0;
}
void VERIFY_END_TIMER(void){
while(INTCONbits.TMR0IF==0) {}
}
void TAREFA1(void){
cont1++;
if(cont1==2){
PORTDbits.RD4=!PORTDbits.RD4;
cont1=0;
}}
void TAREFA2(void){
cont++;
if(cont==4){
PORTDbits.RD3=!PORTDbits.RD3;
cont=0;
}}
void TAREFA3(void){
cont2++;

if(cont2==4 && est==0){


PORTDbits.RD2=1;
est=1;
cont2=0;
}
if(cont2==3 && est==1){
PORTDbits.RD2=0;
est=0;
cont2=0;
}}

4 – Modifique o exercício 3, utilizando uma estrutura “COOPERATIVE


MULTITASK” e acrescentando uma quarta tarefa onde o led D17 deve
permanecer 250ms ligado e 250ms desligado;
Obs: em cada intervalo de tempo só podem ser executadas no máximo 3
tarefas.

#include <p18f4550.h>
#pragma config FOSC = HS // Fosc = 20MHz Tcy = 200ns
#pragma config CPUDIV = OSC1_PLL2 // PLL desligado
#pragma config WDT = OFF // Watchdog desativado
#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais
#pragma config LVP = OFF // Desabilita gravação em baixa tensão
#pragma config DEBUG = OFF // habilita debug
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
void TAREFA2(void);
void TAREFA3(void);
void TAREFA4(void);
unsigned char slot=0;
unsigned char cont=0;
unsigned char cont1=0;
unsigned char cont2=0;
unsigned char cont3=0;
unsigned char cont4=0;

void main (void){


TRISD=0x00;
T0CON=0b10000011;
INTCONbits.TMR0IE=0;

for(;;){
START_TIMER(); //Inicia a contagem de 50MS
TAREFA4(); // LED1 a cada 10ms obrigatoriamente
TAREFA3(); //
switch(slot){
case 0:
TAREFA2();
slot=1;
break;
case 1:
TAREFA1();
slot=0;
break;
}
VERIFY_END_TIMER();

}
}
void START_TIMER(void){
TMR0H=0xC2;
TMR0L=0xF7; // 50ms
INTCONbits.TMR0IF=0;
}

void VERIFY_END_TIMER(void){
while(INTCONbits.TMR0IF==0) {}
}

void TAREFA1(void){
PORTDbits.RD4=!PORTDbits.RD4;

void TAREFA2(void){
cont2++;
if(cont2 == 2){
PORTDbits.RD3=!PORTDbits.RD3;
cont2 = 0;
}
}

void TAREFA3(void){
if(PORTDbits.RD2==0){
cont3++;
}
if(cont3==4){
PORTDbits.RD2= 1;
cont3=0;
}
if(PORTDbits.RD2==1){
cont++;
}
if(cont==4){
PORTDbits.RD2= 0;
cont = 0;
}
}

void TAREFA4(void){
cont4++;
if(cont4 == 5){
PORTDbits.RD1=!PORTDbits.RD1;
cont4 = 0;
}
}

5 – Modifique o exercício 4, onde na quarta tarefa o led D17 deve


permanecer 250ms ligado e 120ms desligado;
Obs: em cada intervalo de tempo só podem ser executadas no máximo 3
tarefas.

#include <p18f4550.h>

#pragma config FOSC = HS // Fosc = 20MHz Tcy = 200ns

#pragma config CPUDIV = OSC1_PLL2 // PLL desligado

#pragma config WDT = OFF // Watchdog desativado

#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais

#pragma config LVP = OFF // Desabilita gravação em baixa tensão

#pragma config DEBUG = OFF // habilita debug

void START_TIMER(void);

void VERIFY_END_TIMER(void);

void TAREFA1(void);

void TAREFA2(void);

void TAREFA3(void);

void TAREFA4(void);

unsigned char slot=0;

unsigned char cont=0;

unsigned char cont1=0;

unsigned char cont2=0;

unsigned char cont3=0;

unsigned char cont4=0;

unsigned char cont5=0;

void main (void){

TRISD=0x00;

T0CON=0b10000011;
INTCONbits.TMR0IE=0;

for(;;){

START_TIMER(); //Inicia a contagem de 50MS

TAREFA4(); // LED1 a cada 10ms obrigatoriamente

TAREFA3(); //

switch(slot){

case 0:

TAREFA1();

slot=1;

break;

case 1:

TAREFA2();

slot=0;

break;

VERIFY_END_TIMER();

void START_TIMER(void){

TMR0H=0xF3;

TMR0L=0xCB; // 10ms

INTCONbits.TMR0IF=0;

void VERIFY_END_TIMER(void){

while(INTCONbits.TMR0IF==0) {}

void TAREFA1(void){

cont1++;

if(cont1 == 5){

PORTDbits.RD4=!PORTDbits.RD4;
cont1 = 0;

void TAREFA2(void){

cont2++;

if(cont2 == 5){

PORTDbits.RD3=!PORTDbits.RD3;

cont2 = 0;

void TAREFA3(void){

if(PORTDbits.RD2==0){

cont3++;

if(cont3==20){

PORTDbits.RD2= 1;

cont3=0;

if(PORTDbits.RD2==1){

cont++;

if(cont==16){

PORTDbits.RD2= 0;

cont = 0;

void TAREFA4(void){

if(PORTDbits.RD1==0){
cont4++;

if(cont4 == 25){

PORTDbits.RD1=!PORTDbits.RD1;

cont4 = 0;

if(PORTDbits.RD1==1){

cont5++;

if(cont5 == 13){

PORTDbits.RD1=!PORTDbits.RD1;

cont5 = 0;

6 – Construa no microcontrolador PIC18F4550, por meio do kit Exsto, um


“COOPERATIVE MULTITASK”, onde as seguintes tarefas devem ser
implementadas:
- o buzzer deverá ser acionado com uma frequência de 200Hz (DC 50%) de
forma contínua, independente do acionamento de qualquer botão.
- a mensagem “OLA” deverá ser enviada repetidamente via comunicação
serial, com baud-rate de 4800bps;
Obs1: é importante que a frequência e duty-cycle não sejam alterados de
forma alguma;
Obs3: o buzzer está interfaceado com o pino RC2.
Obs: em cada intervalo de tempo só podem ser executadas no máximo 3
tarefas.

#include <p18f4550.h>

#pragma config FOSC = HS // Fosc = 20MHz Tcy = 200ns

#pragma config CPUDIV = OSC1_PLL2 // PLL desligado

#pragma config WDT = OFF // Watchdog desativado

#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais

#pragma config LVP = OFF // Desabilita gravação em baixa tensão


#pragma config DEBUG = OFF // habilita debug

void START_TIMER(void);

void VERIFY_END_TIMER(void);

void TAREFA1(void);

unsigned char slot=0;

void main (void){

TRISD=0x00;

TRISCbits.TRISC2=0; //buzzer

T0CON=0b10000111; // 111 - Pré-scaler 1:256

INTCONbits.TMR0IE=0;

TXSTAbits.BRGH=1;

BAUDCONbits.BRG16=0;

SPBRG=255; //Configura o bau-date para 4800

TXSTAbits.SYNC=0; //Habilita comunicação assíncrona

RCSTAbits.SPEN=1; //Habilita os pinos de I/O para a serial

TRISCbits.TRISC6=1; //Habilita o pino TX como entrada

TXSTAbits.TXEN=1;

for(;;){

START_TIMER();

TAREFA1(); // BUZZER A CADA 2.5ms

switch(slot){

case 0:

while (TXSTAbits.TRMT==0) {}

TXREG='O';

slot=1;

break;

case 1:

while (TXSTAbits.TRMT==0) {}

TXREG='L';

slot= 2;

break;

case 2:

while (TXSTAbits.TRMT==0) {}

TXREG='A';

slot=0;
break;

VERIFY_END_TIMER();

}}

void START_TIMER(void){

TMR0H=0xFF;

TMR0L=0xCF; //(2.5 ms) = 1/(20M/4) * 256 * (65536 - TMR0) => TMR0 = 65487

INTCONbits.TMR0IF=0;

void VERIFY_END_TIMER(void){

while(INTCONbits.TMR0IF==0) {}

void TAREFA1(void){

PORTCbits.RC2=!PORTCbits.RC2;

7 – Se para o exercício 6, a frequência do buzzer for modificada para


250Hz (DC 50%), ambas as tarefas serão executadas corretamente?
Justifique sua resposta.

Visto que que para uma frequência de 250Hz o período será de 1/250 =
4ms, portanto o timer deveria ser configurado para 2ms, atendendo o DC
de 50%, porém trabalhando com o Bound-rate de 4800bps cada caractere
precisa de 2.1ms para ser enviado com uma boa comunicação, por tanto
não será possível executar.

8 – Utilizando o RTOS, execute as mesmas tarefas do Ex4.


Obs: na função vTaskDelay, uma unidade equivale a 1ms (para cristal de
20MHz e FOSC=HS). Ex: vTaskDelay(100/portTICK_RATE_MS) equivale a 100ms.

#include <p18f4550.h>

#pragma config FOSC=HS


#pragma config CPUDIV=OSC1_PLL2
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config BOR = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

/*3.4.6
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+2),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+3),&TASK2);
vTaskStartScheduler();
}

void vTASK0(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD2=!PORTDbits.RD2;
}
}

void vTASK1(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD3=!PORTDbits.RD3;
}
}

void vTASK2(void){
unsigned int a;
while(1) {
for(a=0;a<=20;a++){}
PORTDbits.RD4=!PORTDbits.RD4;
}
}
*/

/*3.4.7
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK2);
vTaskStartScheduler();
}

void vTASK0(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD2=!PORTDbits.RD2;
}
}

void vTASK1(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD3=!PORTDbits.RD3;
}
}

void vTASK2(void){
unsigned int a;
while(1) {
for(a=0;a<=20;a++){}
PORTDbits.RD4=!PORTDbits.RD4;
}
}
*/

/*3.4.8
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+2),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+3),&TASK2);
vTaskStartScheduler();
}
void vTASK0(void){
while(1){
PORTDbits.RD2=!PORTDbits.RD2;
vTaskDelay(1000/portTICK_RATE_MS);
}
}
void vTASK1(void){
while(1){
PORTDbits.RD3=!PORTDbits.RD3;
vTaskDelay(1000/portTICK_RATE_MS);
}
}
void vTASK2(void){
while(1) {
PORTDbits.RD4=0;
vTaskDelay(400/portTICK_RATE_MS);
PORTDbits.RD4=1;
vTaskDelay(1200/portTICK_RATE_MS);
}
}

*/
/*3.4.9
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+2),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+3),&TASK2);
vTaskStartScheduler();
}

void vTASK0(void){
unsigned char a;
while(1){
for(a=0;a<=2;a++){
PORTDbits.RD2=!PORTDbits.RD2;
vTaskDelay(50/portTICK_RATE_MS); //500ms
}
vTaskSuspend(NULL);
}}

void vTASK1(void){
unsigned char a;
while(1){
for(a=0;a<=4;a++){
PORTDbits.RD3=!PORTDbits.RD3;
vTaskDelay(50/portTICK_RATE_MS); //500ms
}
vTaskResume(TASK0);
vTaskSuspend(NULL);
}}

void vTASK2(void){
unsigned char a;
while(1) {
PORTDbits.RD4=!PORTDbits.RD4;
vTaskDelay(50/portTICK_RATE_MS); //500ms
}}
*/

xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
xTaskHandle TASK3;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);
void vTASK3(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK2);
xTaskCreate(vTASK3,(const char
*const)"T3",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK3);
vTaskStartScheduler();
}
void vTASK0(void){
//D14
while(1){
PORTDbits.RD4=!PORTDbits.RD4;
vTaskDelay(100/portTICK_RATE_MS);
}
}
void vTASK1(void){
//D15
while(1){
PORTDbits.RD3=!PORTDbits.RD3;
vTaskDelay(200/portTICK_RATE_MS);
}
}
void vTASK2(void){
//D16
while(1) {
PORTDbits.RD2=0;
vTaskDelay(200/portTICK_RATE_MS);
PORTDbits.RD2=1;
vTaskDelay(600/portTICK_RATE_MS);
}
}
void vTASK3(void){
//D17
while(1){
PORTDbits.RD1=0;
vTaskDelay(300/portTICK_RATE_MS);
PORTDbits.RD1=1;
vTaskDelay(300/portTICK_RATE_MS);
}
}

9 – Utilizando o RTOS, execute as mesmas tarefas do Ex5.


Obs: na função vTaskDelay, uma unidade equivale a 1ms (para cristal de
20MHz e FOSC=HS). Ex: vTaskDelay(100/portTICK_RATE_MS) equivale a 100ms.
#include <p18f4550.h>

#pragma config FOSC=HS


#pragma config CPUDIV=OSC1_PLL2
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config BOR = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

/*3.4.6
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+2),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+3),&TASK2);
vTaskStartScheduler();
}

void vTASK0(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD2=!PORTDbits.RD2;
}
}

void vTASK1(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD3=!PORTDbits.RD3;
}
}

void vTASK2(void){
unsigned int a;
while(1) {
for(a=0;a<=20;a++){}
PORTDbits.RD4=!PORTDbits.RD4;
}
}
*/

/*3.4.7
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK2);
vTaskStartScheduler();
}

void vTASK0(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD2=!PORTDbits.RD2;
}
}

void vTASK1(void){
unsigned int a;
while(1){
for(a=0;a<=20;a++){}
PORTDbits.RD3=!PORTDbits.RD3;
}
}

void vTASK2(void){
unsigned int a;
while(1) {
for(a=0;a<=20;a++){}
PORTDbits.RD4=!PORTDbits.RD4;
}
}
*/

/*3.4.8
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+2),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+3),&TASK2);
vTaskStartScheduler();
}
void vTASK0(void){
while(1){
PORTDbits.RD2=!PORTDbits.RD2;
vTaskDelay(1000/portTICK_RATE_MS);
}
}
void vTASK1(void){
while(1){
PORTDbits.RD3=!PORTDbits.RD3;
vTaskDelay(1000/portTICK_RATE_MS);
}
}
void vTASK2(void){
while(1) {
PORTDbits.RD4=0;
vTaskDelay(400/portTICK_RATE_MS);
PORTDbits.RD4=1;
vTaskDelay(1200/portTICK_RATE_MS);
}
}

*/
/*3.4.9
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+2),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+3),&TASK2);
vTaskStartScheduler();
}

void vTASK0(void){
unsigned char a;
while(1){
for(a=0;a<=2;a++){
PORTDbits.RD2=!PORTDbits.RD2;
vTaskDelay(50/portTICK_RATE_MS); //500ms
}
vTaskSuspend(NULL);
}}

void vTASK1(void){
unsigned char a;
while(1){
for(a=0;a<=4;a++){
PORTDbits.RD3=!PORTDbits.RD3;
vTaskDelay(50/portTICK_RATE_MS); //500ms
}
vTaskResume(TASK0);
vTaskSuspend(NULL);
}}

void vTASK2(void){
unsigned char a;
while(1) {
PORTDbits.RD4=!PORTDbits.RD4;
vTaskDelay(50/portTICK_RATE_MS); //500ms
}}
*/

xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
xTaskHandle TASK3;

void vTASK0(void);
void vTASK1(void);
void vTASK2(void);
void vTASK3(void);

void main( void ){


TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK2);
xTaskCreate(vTASK3,(const char
*const)"T3",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK3);

vTaskStartScheduler();
}
void vTASK0(void){
//D14
while(1){
PORTDbits.RD4=!PORTDbits.RD4;
vTaskDelay(100/portTICK_RATE_MS);
}
}
void vTASK1(void){
//D15
while(1){
PORTDbits.RD3=!PORTDbits.RD3;
vTaskDelay(200/portTICK_RATE_MS);
}
}
void vTASK2(void){
//D16
while(1) {
PORTDbits.RD2=0;
vTaskDelay(200/portTICK_RATE_MS);
PORTDbits.RD2=1;
vTaskDelay(600/portTICK_RATE_MS);
}
}
void vTASK3(void){
//D17
while(1){
PORTDbits.RD1=0;
vTaskDelay(250/portTICK_RATE_MS);
PORTDbits.RD1=1;
vTaskDelay(120/portTICK_RATE_MS);
}
}

10 – Utilizando o RTOS, execute as mesmas tarefas do Ex6. (testar)

#include <p18f4550.h>

#pragma config FOSC=HS


#pragma config CPUDIV=OSC1_PLL2
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config BOR = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

xTaskHandle TASK0;
xTaskHandle TASK1;
void vTASK0(void);
void vTASK1(void);
void main( void ){
INTCONbits.TMR0IE=0;
TXSTAbits.BRGH=1;
BAUDCONbits.BRG16=0;
SPBRG=255; //Configura o baud-date para 9600
TXSTAbits.SYNC=0; //Habilita comunicação assíncrona
RCSTAbits.SPEN=1; //Habilita os pinos de I/O para a serial
TRISCbits.TRISC6=1; //Habilita o pino TX como entrada
TRISCbits.TRISC2=0;
TXSTAbits.TXEN=1;
TRISD=0x00;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK1);
vTaskStartScheduler();
}
void vTASK0(void){
while(1){
PORTCbits.RC2=!PORTCbits.RC2;
vTaskDelay(2/portTICK_RATE_MS); //~2ms para 50%
}
}
void vTASK1(void){
while(1){
while (TXSTAbits.TRMT==0) {}
TXREG='O';
while (TXSTAbits.TRMT==0) {}
TXREG='L';
while (TXSTAbits.TRMT==0) {}
TXREG='A';
}
}

11 – O desenvolvimento do exercício 9 a partir do exercício 8 foi mais


fácil do que o desenvolvimento do exercício 5 a partir do exercício 4?
Se sim, justifique sua resposta.
R: Sim, foi mais fácil, pois exercício 9 foi necessário mudar os
fatores de multiplicação comparado ao 8.

No restante dos exercícios foi necessário mudar o valor do timer,


implementar contadores e recalcular os valores de cada tempo.

12 – Em sistema embarcado o microcontrolador é interfaceado com 1 botão


e 3 leds. O microcontrolador deve realizar as seguintes tarefas:
- TAREFA 1: verificação do botão a cada 40ms, devendo acender o LED1 se
o botão estiver pressionado;
- TAREFA 2: de forma repetida, acender o LED2 por 1s e apagá-lo por 1s;
- TAREFA 3: de forma repetida, acender o LED3 por 800ms e apagá-lo por
400ms;

Considere para o exercício que está disponível um RTOS, o qual necessita


como requisitos mínimos 1300 bytes de memória RAM, 8Kbytes de memória
Flash e um timer. Com base nas informações abaixo, defina um modelo
para o microcontrolador, considerando o menor custo possível. Justifique
suas respostas.
• Microcontroladores:
Model Características Custo
o
µC1 2 pinos de I/O, 1 timer de 16 bits, RAM=2Kbytes e U$1,3
Flash=16Kbytes 0
µC2 4 pinos de I/O, 1 timer de 16 bits, RAM=2Kbytes e U$1,4
Flash=16Kbytes 0
µC3 4 pinos de I/O, RAM=2Kbytes e Flash=16Kbytes U$1,2
0
µC4 3 pinos de I/O, 1 timer de 16 bits, RAM=1Kbytes e U$1,3
Flash=6Kbytes 0
µC5 4 pinos de I/O, 1 timer de 16 bits, RAM=1Kbytes e U$1,1
Flash=6Kbytes 0
µC6 3 pinos de I/O, 1 timer de 16 bits, RAM=4Kbytes e U$1,7
Flash=40Kbytes 0

#pragma config CPUDIV = OSC1_PLL2 // PLL desligado


#pragma config WDT = OFF // Watchdog desativado
#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais
#pragma config LVP = OFF // Desabilita gravação em baixa tensão
#pragma config DEBUG = OFF // habilita debug
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
void TAREFA2(void);
void TAREFA3(void);
unsigned char cont=0;
unsigned char cont2=0;
unsigned char cont3=0;
unsigned char slot=0;
void main (void){
TRISD=0x00;
TRISBbits.RB0=1;
T0CON=0b10000111;
INTCONbits.TMR0IE=0;
for(;;){
START_TIMER();
TAREFA1();
switch(slot){
case 0:
TAREFA2();
slot=1;
break;
case 1:
TAREFA3();
slot=0;
break;
}
VERIFY_END_TIMER();
}}
void START_TIMER(void){
TMR0H=0xFE;
TMR0L=0x7A; //(20 ms)
INTCONbits.TMR0IF=0;
}
void VERIFY_END_TIMER(void){
while(INTCONbits.TMR0IF==0) {}
}
void TAREFA1(void){
cont++;
if(cont==2){
if(PORTBbits.RB0==0){
PORTDbits.RD1=0;
}
else{
PORTDbits.RD1=1;
}
cont=0;
}
}
void TAREFA2(void){
cont2++;
if(cont2==25){
PORTDbits.RD2=!PORTDbits.RD2;
cont2=0;
}
}
void TAREFA3(void){
cont3++;
if(cont3==20){
PORTDbits.RD3=1;
}
else if(cont3==30){
PORTDbits.RD3=0;
cont3=0;
}
}

A melhor opção de microcontrolador seria o uc5 devido ao seu valor


inferior ao uc2 .

13 - Se no sistema embarcado do exercício 12 os tempos de acionamento do


LED3 devessem ser personalizados com diferentes valores para diferentes
unidades do produto, qual microcontrolador deveria ser adotado?
Justifique sua resposta.
Analisando a quantidade de pinos de entrada e saída ,e no exercício 12
devido a tempos de acionamentos diferentes, a melhor opção seria uc2.
devido ao uso do.

14 – Implemente os exercícios 12 e 13 no microcontrolador PIC18F4550 por


meio do kit Exsto, onde o botão e os LEDs 1, 2 e 3 são respectivamente o
botão INT0 e os LEDs D14, D15 e D16 no kit. (teste)
//EX12
#include <p18f4550.h>
#pragma config FOSC = HS // Fosc = 20MHz Tcy = 200ns
#pragma config CPUDIV = OSC1_PLL2 // PLL desligado
#pragma config WDT = OFF // Watchdog desativado
#pragma config PBADEN = OFF // Pinos do PORTB começam como digitais
#pragma config LVP = OFF // Desabilita gravação em baixa tensão
#pragma config DEBUG = OFF // habilita debug
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
void TAREFA2(void);
void TAREFA3(void);
unsigned char cont=0;
unsigned char cont2=0;
unsigned char est=0;
void main (void){
TRISD=0x00;
PORTD=0xFF;
TRISBbits.RB0=1;
T0CON=0b10000111;
INTCONbits.TMR0IE=0;
for(;;){
START_TIMER();
//TAREFA 1 - botão a cada 50ms
TAREFA1();
//TAREFA 2 - LED2 a cada 1000ms
TAREFA2();
//TAREFA 3 - LED3 a cada 1000ms e 500ms
TAREFA3();
VERIFY_END_TIMER();
}}
void START_TIMER(void){
TMR0H=0xFC;
TMR0L=0x2F; //(50 ms)
INTCONbits.TMR0IF=0;
}
void VERIFY_END_TIMER(void){
while(INTCONbits.TMR0IF==0) {}
}
void TAREFA1(void){
if (PORTBbits.RB0==0){
PORTDbits.RD4=0;
}
else PORTDbits.RD4=1;

}
void TAREFA2(void){
cont++;
if(cont==20){
PORTDbits.RD3=!PORTDbits.RD3;
cont=0;
}}
void TAREFA3(void){
cont2++;

if(cont2==20 && est==0){


PORTDbits.RD2=0;
est=1;
cont2=0;
}
if(cont2==10 && est==1){
PORTDbits.RD2=1;
est=0;
cont2=0;
}}

//----------------------------------------------------------------------------
-----------------------------------//

//EX13

#include <p18f4550.h>

#pragma config FOSC=HS


#pragma config CPUDIV=OSC1_PLL2
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config BOR = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;

void vTASK0(void);
void vTASK1(void);
void vTASK2(void);
void main( void ){
TRISD=0x00;
TRISB=0xFF;
xTaskCreate(vTASK0,(const char * const)"T0",configMINIMAL_STACK_SIZE,
NULL,(tskIDLE_PRIORITY+1), NULL);
xTaskCreate(vTASK1,(const char * const)"T1",configMINIMAL_STACK_SIZE,
NULL,(tskIDLE_PRIORITY+1), NULL);
xTaskCreate(vTASK2,(const char * const)"T2",configMINIMAL_STACK_SIZE,
NULL,(tskIDLE_PRIORITY+1), NULL);
vTaskStartScheduler();
}
void vTASK0(){
while(1) {
if (PORTBbits.RB0==0) PORTDbits.RD4=0; //Se o botão INT0 estiver apertado,
led 1 deverá ser ligado
else PORTDbits.RD4=1;
vTaskDelay(50/portTICK_RATE_MS);
}}
void vTASK1(){
while(1) {
PORTDbits.RD3=! PORTDbits.RD3; //Alternar o led 2
vTaskDelay(1000/portTICK_RATE_MS); //1s
}}
void vTASK2(){
while(1) {
PORTDbits.RD2=0; //Acender led 3 por 1s
vTaskDelay(1000/portTICK_RATE_MS);
PORTDbits.RD2=1; //Apagar led 3 por 500ms
vTaskDelay(500/portTICK_RATE_MS);
}}
15 – Considerando o código a seguir, responda:

#include <p18f4550.h>

// CONFIGURATION
#pragma config FOSC=HS

//TASKS PROTOTYPES
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


//Configurações da serial
TXSTAbits.BRGH=1;

xTaskCreate(vTASK0,(const char*const)"T0", configMINIMAL_STACK_SIZE,
NULL,(tskIDLE_PRIORITY+1), NULL);
xTaskCreate(vTASK1,(const char*const)"T1", configMINIMAL_STACK_SIZE,
NULL,(tskIDLE_PRIORITY+1), NULL);
xTaskCreate(vTASK2,(const char*const)"T2", configMINIMAL_STACK_SIZE,
NULL,(tskIDLE_PRIORITY+1), NULL);-
vTaskStartScheduler();
}
void vTASK0(void){
while(1){
while (TXSTAbits.TRMT==0) {}
TXREG='0';
while (TXSTAbits.TRMT==0) {}
TXREG=0x0D;
while (TXSTAbits.TRMT==0) {}
TXREG=0x0A;
}
}

void vTASK1(void){
while(1){
while (TXSTAbits.TRMT==0) {}
TXREG='1';
while (TXSTAbits.TRMT==0) {}
TXREG=0x0D;
while (TXSTAbits.TRMT==0) {}
TXREG=0x0A;
}
}

void vTASK2(void){
while(1){
while (TXSTAbits.TRMT==0) {}
TXREG='2';
while (TXSTAbits.TRMT==0) {}
TXREG=0x0D;
while (TXSTAbits.TRMT==0) {}
TXREG=0x0A;
}
}

Ocorre Starvation com uma ou mais tasks? Se sim, explique detalhadamente.

R: Não acontece starvation, pois as tasks estão todas com a mesma prioridade.

16 – No exemplo 3.4.6 da Apostila1 ocorre Starvation com uma ou mais


tasks? Explique detalhadamente.

R: Ocorre Starvation. As tasks possuem prioridades diferentes, a TASK2


será sempre executada, pois tem maior prioridade, está em laça
infinito e não tem um mecanismo para sair da task, como o vTaskDelay,
assim, esta se sobrepõe às outras.

17 – No exemplo 3.4.7 da Apostila1 ocorre Starvation com uma ou mais


tasks? Explique detalhadamente.

R: Não acontece starvation, pois as taks estão com mesmo nível de


prioridade.

18 – No exemplo 3.4.8 da Apostila1 ocorre Starvation com uma ou mais


tasks? Explique detalhadamente.

R: Não ocorre Starvation. As tasks possuem prioridades diferentes,


mas o vTaskDelay sai das tarefas pelo tempo colocado no código, assim,
executa as demais tarefas e depois volta a executar a tarefa de maior
prioridade.

19 – Implemente no microcontrolador PIC18F4550, por meio do kit Exsto e


do FreeRTOS, as seguintes tarefas:
- TAREFA 1: sempre que o botão INT0(RB0) estiver pressionado (nível
lógico ‘0’), a mensagem “RB0” deve ser transmitida pela porta serial com
uma taxa de 96000bps;
- TAREFA 2: sempre que o botão INT1(RB1) estiver pressionado (nível
lógico ‘0’), a mensagem “RB1” deve ser transmitida pela porta serial com
uma taxa de 9600bps;
- TAREFA 3: de forma repetida, alternar o acendimento do LED no pino RD2
a cada 1ms.

Todas as tarefas são corretamente executadas? Caso isso não ocorra,
explique o por quê?

#include <p18f4550.h>

#pragma config FOSC=HS


#pragma config CPUDIV=OSC1_PLL2
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config BOR = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;

void vTASK0(void);
void vTASK1(void);
void vTASK2(void);

void main( void ){


TRISD=0x00;
TRISB=0xFF;
TXSTAbits.BRGH=1;
BAUDCONbits.BRG16=0;
SPBRG=255; //Configura o bau-date para 4800
TXSTAbits.SYNC=0; //Habilita comunicação assíncrona
RCSTAbits.SPEN=1; //Habilita os pinos de I/O para a serial
TRISCbits.TRISC6=1; //Habilita o pino TX como entrada
TXSTAbits.TXEN=1;
xTaskCreate(vTASK0,(const char
*const)"T0",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK0);
xTaskCreate(vTASK1,(const char
*const)"T1",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK1);
xTaskCreate(vTASK2,(const char
*const)"T2",configMINIMAL_STACK_SIZE,NULL,(tskIDLE_PRIORITY+1),&TASK2);

vTaskStartScheduler();
}

void vTASK0(void){
while(1){
PORTDbits.RD2=!PORTDbits.RD2;
vTaskDelay(1/portTICK_RATE_MS);
}
}

void vTASK1(void){
while(1){
if(PORTBbits.RB0==0){
while (TXSTAbits.TRMT==0) {}
TXREG='R';
while (TXSTAbits.TRMT==0) {}
TXREG='B';
while (TXSTAbits.TRMT==0) {}
TXREG='0';
}
}
}
void vTASK2(void){
while(1){
if(PORTBbits.RB1==0){
while (TXSTAbits.TRMT==0) {}
TXREG='R';
while (TXSTAbits.TRMT==0) {}
TXREG='B';
while (TXSTAbits.TRMT==0) {}
TXREG='1';
}
}
}

R: O led alternando a cada 2ms a task1 e a task2 estarão usando 2ms para
ser executado as duas, 1 ms cada task. Portanto a task3 vai ser
executado depois dos 2ms apenas.

Você também pode gostar