A empresa ONTIMER, é uma empresa fabricante de produtos plásticos. Entre seus equipamentos, existe um sistema de aquecimento central, que é realizado através de uma caldeira. O sistema de controle da caldeira deverá ser atualizado e você, técnico eletrônico da empresa, deverá realizar essa atividade, utilizando um microcontrolador PIC 18F4550.
O sistema de aquecimento central é ligado através de um botão liga (BT_LIGA). Esse sistema possui uma caldeira, que tem seu elemento de aquecimento ligado após BT_LIGA ter sido pressionado. A caldeira possui um pressostato (Pre_1),que deve ter seu estado verificado a cada 2 segundos. Quando o pressostato é acionado (Pre_1=0), o elemento de aquecimento é desligado e um alarme sonoro é acionado.
Se após 5 seg o Pre_1 estiver desacionado (Pre_1=1), o elemento de aquecimento é ligado novamente. Se após esse tempo, Pre_1 ainda estiver acionado, o sistema entra em um modo de falha, o alarme sonoro tem sua frequência alterada, e também é acionado uma alarme visual (sinaleiro), sincronizado com o alarme sonoro. Quando o sistema entra nesse modo, é necessário resetar o mesmo através de um botão (BT_RESET). Após o reset, o sistema deve ser reiniciado através do botão liga (BT_LIGA). Fora do modo de falha, o sistema pode ser desligado através de um botão (BT_DESL). Elabore um programa em linguagem C, utilizando o Timer do microcontrolador para as temporizações, que solucione essa aplicação. Para isso, considere: BT_RESET - RB5; Pre_1 - RB4; BT_LIGA - RB3; BT_DESL - RB2; Elemento de Aquecimento - RE1; Sinaleiro - RE0; Alarme Sonoro - RC0; 1° Estágio do alarme - 3 Hz; 2° Estágio do alarme - 5 Hz.
Com dificuldades nas suas atividades e Precisando de ajudas nos trabalhos académicos entre em contato com a nossa equipe que vamos ajudar você!
Contato:
Facebook: fb.me/ajudaemTrabalhosdeprogramacao
E-mail: ajudastrabalhosprogramacao@gmail.com
consegui até aqui
/*
* File: timer0.c
* Author: wesle
*
* Created on 16 de Junho de 2020, 19:10
*/
#pragma config PLLDIV = 5 // PLL Prescaler Selection bits (Divide by 5 (20 MHz oscillator input))
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator (HS))
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config BORV = 3 // Brown-out Reset Voltage bits (Minimum setting 2.05V)
#pragma config VREGEN = OFF // USB Voltage Regulator Enable bit (USB voltage regulator disabled)
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config MCLRE = OFF // MCLR Pin Enable bit (RE3 input pin enabled; MCLR pin disabled)
#pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#include <xc.h>
#define _XTAL_FREQ 20000000
int tempo=0, tempo1=0,tempo2=0;//variáveis do tipo inteiro
char ok=0; // variável do tipo char
void interrupt Timer_0 (void) //função de tratamento da interrupção do Timer0
{
tempo++; //incrementa a variável tempo
if(tempo>=133) /* se a variável tempo for igual ou maior a
133 (equivale a contagem de 5 segundos em estouros do timer)
executa as instruções a seguir*/
{
if(PORTBbits.RB4==0) // se RB4 for igual a 0, executa as funções a seguir
{
if(tempo2<=2) /* se a variável tempo2 for igual ou menor que
2 (valor referente a metade do período
para uma freqeuncia de 5Hz, executa as funções a seguir */
{
PORTCbits.RC0 = 1; // Coloca o pino RC0 em nivel logico 1
PORTEbits.RE2 = 1; // Coloca o pino RE2 em nivel logico 1
}
if(tempo2>=3) /*se a variável tempo2 for igual ou maior que
3 (valor referente a metade do período
para uma freqeuncia de 5Hz, executa as funções a seguir */
{
PORTCbits.RC0 = 0;// Coloca o pino RC0 em nivel logico 0
PORTEbits.RE2 = 0;// Coloca o pino RE2 em nivel logico 0
}
if(tempo2==4) /*se a variável tempo2 for igual a 4
(valor que termina o periodo para uma
frequencia de 5 Hz), executa as funções a seguir*/
{
tempo2 = 0;//Escreve 0 na variável tempo2 para reinicio do ciclo
}
tempo2++; // incrementa a variável tempo2
}
if(PORTBbits.RB4==1&tempo==133)/*Se o pino RB4 for igual a 1 e
a variável tempo for igual a 133
executa as instruções a seguir*/
{
ok=0; /*escreve 0 na variável ok.Essa variável permite
o funcionamento do pino RE1 pelo fluxo normal do programa*/
tempo=0;//escreve 0 na variável tempo, permitindo o reinicio do ciclo
tempo1=0;//escreve 0 na variável tempo1, permitindo o reinicio do ciclo
tempo2=0;//escreve 0 na variável tempo2, permitindo o reinicio do ciclo
PORTEbits.RE1=1;//Coloca o pino RE1 em nível lógico 1
}
if(PORTBbits.RB3==0)/*Se o pino RB3 for igual a 0,
executa as instruções a seguir*/
{
ok=0;/*escreve 0 na variável ok.Essa variável permite
o funcionamento do pino RE1 pelo fluxo normal do programa*/
tempo=0;//escreve 0 na variável tempo, permitindo o reinicio do ciclo
tempo1=0;//escreve 0 na variável tempo1, permitindo o reinicio do ciclo
tempo2=0;//escreve 0 na variável tempo2, permitindo o reinicio do ciclo
PORTCbits.RC0 = 0;//Coloca o pino RC0 em nível lógico 0
PORTEbits.RE2 = 0;//Coloca o pino RE2 em nível lógico 0
}
}
if(tempo>=38)/* se a variável tempo for igual ou maior a
38 (equivale a contagem de 2 segundos em estouros do timer)
executa as instruções a seguir*/
{
if(PORTBbits.RB4==0)// se RB4 for igual a 0, executa as funções a seguir
{
ok=1;/*escreve 1 na variável ok.Essa variável permite
o funcionamento do pino RE1 pelo fluxo normal do programa*/
PORTEbits.RE1=0;//Coloca o pino RE1 em nível lógico 0
if(tempo1<=5)/*se a variável tempo1 for igual ou menor que
5 (valor referente a metade do período
para uma freqeuncia de 3Hz, executa as funções a seguir */
{
PORTCbits.RC0 = 1;//Coloca o pino RC0 em nívle lógico 1
}
if(tempo1>=6)/*se a variável tempo1 for igual ou maior que
6 (valor referente a metade do período
para uma freqeuncia de 3Hz, executa as funções a seguir */
{
PORTCbits.RC0 = 0;//Coloca o pino RC0 em nívle lógico 0
}
if(tempo1==10)/*se a variável tempo1 for igual a 10
(valor que termina o periodo para uma
frequencia de 3 Hz), executa as funções a seguir*/
{
tempo1 = 0;//Escreve 0 na variável tempo1 para reinicio do ciclo
}
tempo1++; // incrementa a variável tempo1
}
}
INTCONbits.TMR0IF = 0;//limpa bit de flag da interrupção timer 0.
}
//Esta funcao inicializa os registradores SFRs.
void Inic_Regs (void)
{
TRISA = 0x00; //PORT A saída
TRISB = 0xFF; //PORT B como entrada
TRISC = 0x00; //PORT C saída
TRISD = 0x00; //PORT D saída
TRISE = 0x00; //PORT E saída
ADCON1 = 0x0F; //configura pinos do PORT A e PORT E como digitais
PORTA = 0; //limpa PORT A
PORTB = 0; //limpa PORT B
PORTC = 0; //limpa PORT C
PORTD = 0x00; //limpa PORT D
PORTE = 0; //limpa PORT E
//habilita interrupção de estouro do timer 0
INTCONbits.GIE = 1; //liga chave geral de interrupção
INTCONbits.TMR0IE = 1; //liga chave individual de interrupção do timer 0
//configura timer 0 para operar como temporizador e estourar a cada 4ms
T0CON = 0b00000001; /* Configuração do Registrador do timer 0:
0 = desliga o timer 0
0 = habilita o timer 0 para 16 bits
0 = Timer 0 configurado como temporizador
0 = se Timer 0 for configurado como contador,
o mesmo é incrementado na borda de subida
0 = Habilita prescaler do timer 0
001 = configura prescaler para 1:4. */
}
void main(void) //função main
{
Inic_Regs (); //configurar SFRs
while(1) //Loop infinito
{
if(PORTBbits.RB5==0&ok==0)/*Se o pino RB5 for igual a 0 e
a varável ok for igual a 0,
as instruções entre chaves são executadas*/
{
PORTEbits.RE1=1;//Coloca o pino RE1 um nível lógico 1
T0CONbits.TMR0ON=1;//Liga o Timer 0
}
if(PORTBbits.RB7==0)/*Se o pino RB7 for igual a 0
a instrução entre chaves é executada*/
{
PORTEbits.RE1=0;//Coloca o pino RE1 um nível lógico 0
}
}
}
Para escrever sua resposta aqui, entre ou crie uma conta
Linguagem e Lógica de Programação
Compartilhar