Escolar Documentos
Profissional Documentos
Cultura Documentos
LISTA DE EXERCÍCIOS 1
02 de outubro 2023
Prof. André Sanches Fonseca Sobrinho
#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';
}
#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++;
#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;
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;
}
}
#include <p18f4550.h>
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
void TAREFA2(void);
void TAREFA3(void);
void TAREFA4(void);
TRISD=0x00;
T0CON=0b10000011;
INTCONbits.TMR0IE=0;
for(;;){
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;
#include <p18f4550.h>
void START_TIMER(void);
void VERIFY_END_TIMER(void);
void TAREFA1(void);
TRISD=0x00;
TRISCbits.TRISC2=0; //buzzer
INTCONbits.TMR0IE=0;
TXSTAbits.BRGH=1;
BAUDCONbits.BRG16=0;
TXSTAbits.TXEN=1;
for(;;){
START_TIMER();
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;
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.
#include <p18f4550.h>
#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 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 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);
*/
/*3.4.9
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);
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);
#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 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 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);
*/
/*3.4.9
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);
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);
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);
}
}
#include <p18f4550.h>
#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';
}
}
}
void TAREFA2(void){
cont++;
if(cont==20){
PORTDbits.RD3=!PORTDbits.RD3;
cont=0;
}}
void TAREFA3(void){
cont2++;
//----------------------------------------------------------------------------
-----------------------------------//
//EX13
#include <p18f4550.h>
#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 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;
}
}
R: Não acontece starvation, pois as tasks estão todas com a mesma prioridade.
#include <p18f4550.h>
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
xTaskHandle TASK0;
xTaskHandle TASK1;
xTaskHandle TASK2;
void vTASK0(void);
void vTASK1(void);
void vTASK2(void);
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.