Buscar

Programação em linguagem C - PICF184550

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.

💡 3 Respostas

User badge image

Diego Coelho

Tô querendo saber tbm
1
Dislike0
User badge image

Marcos Fernando

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

Blog: marcosprogramacao.blogspot.com.br

0
Dislike1
User badge image

Wesley Rodrigo

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

       }

   }

}


0
Dislike1

✏️ Responder

SetasNegritoItálicoSublinhadoTachadoCitaçãoCódigoLista numeradaLista com marcadoresSubscritoSobrescritoDiminuir recuoAumentar recuoCor da fonteCor de fundoAlinhamentoLimparInserir linkImagemFórmula

Para escrever sua resposta aqui, entre ou crie uma conta

User badge image

Outros materiais