Ir ao conteúdo

Interrupção no Mikroc PIC16F877A


adalberto.maicon

Posts recomendados

Postado

Boa noite pessoal

Mais uma vez aqui para pedir a ajuda de vocês com o seguinte problema que me deparei.

Bom é o seguinte no meu programa estou executando a função main e em determinado ponto preciso para de executar ela e chamar uma outra função, esta outra função vai fazer um ciclo e depois disso deve retornar novamente a função main de onde parou, é possível isso?

Estou usando o PIC16F877A e para compilar o MikroC, pelo que vi tenho que usar uma interrupção para fazer isso, usar os timer.

Postado

é possível sim, mas essa outra função seria independente da função main(), ou ela deve ser executada sempre na mesma sequencia do programa ? o que quero dizer é que uma interrupção pode parar a função main() em pontos diferentes, enquanto que uma subrotina, vamos chamar assim, para a função main() sempre no mesmo ponto... entendeu??

Postado
é possível sim, mas essa outra função seria independente da função main(), ou ela deve ser executada sempre na mesma sequencia do programa ? o que quero dizer é que uma interrupção pode parar a função main() em pontos diferentes, enquanto que uma subrotina, vamos chamar assim, para a função main() sempre no mesmo ponto... entendeu??

a função que eu quero chamar esta fora da função main (), o programa que estou fazendo e o seguinte vou acionar uma sequencia de leds nas portas RC4, RC5, RC6 E RC7. Quando esta sequencia chegar ao fim ao invés de ela voltar ao inicio ela chama uma outra rotina que no caso eu chamei de temperatura, esta função temperatura ela monitora a temperatura com um sensor lm35, assim que ela terminar de fazer essa rotina ela volta para o inicio da função main e executa novamente, e assim por diante sempre nesta ordem.

Postado

a chamada dessa função sera então mesmo pra fins didáticos né, porque voce poderia fazer essa leitura dentro da função main()... qual compilador?? e linguagem esta usando??

em C no mickro C pode ficar assim

void temperatura() { // declara sua função

....aqui o codigo do que a função faz....

} // fecha a função temperatura.

void main() {

.... configuração dos SFRs...

while(1) {

....sequencia dos leds...

temperatura(); //aqui você chama a sua função temperatura.

} // fecha o laço while.

} // fecha a função main().

tenta algo assim... acho que ira funcionar... qualquer coisa estamos aqui.

bons estudos...

Postado
a chamada dessa função sera então mesmo pra fins didáticos né, porque voce poderia fazer essa leitura dentro da função main()... qual compilador?? e linguagem esta usando??

em C no mickro C pode ficar assim

void temperatura() { // declara sua função

....aqui o codigo do que a função faz....

} // fecha a função temperatura.

void main() {

.... configuração dos SFRs...

while(1) {

....sequencia dos leds...

temperatura(); //aqui você chama a sua função temperatura.

} // fecha o laço while.

} // fecha a função main().

tenta algo assim... acho que ira funcionar... qualquer coisa estamos aqui.

bons estudos...

To postando o codigo para voce entender melhor a ideia, mais e isso mesmo que voce escreveu o que estou tentando fazer, porém a minha função temperatura trava e nao deixa o led acender, acho que tenho que colocar um return ou algo parecido para ela retornar ao main. Eu aprendi a fazer códigos no ccs mas em mikroc me adaptei melhor, neste programa utilizo mikroc.

// CONFIGURAÇÃO DOS PINOS DO LCD
sbit LCD_RS at RD0_bit; // vou mudar este pino depois
sbit LCD_EN at RD1_bit; // vou mudar este pino depois
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD0_bit; // vou mudar este pino depois
sbit LCD_EN_Direction at TRISD1_bit; // vou mudar este pino depois
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

// MENSAGENS QUE IRÃO APARECER NA TELA DO LCD

char text1 [] = " TEMPERATURA ";
char text2 [] = " AGUA: ";
char text3 [] = " SET POINT: ";
char text4 [] = " HORA:"; // falta fazer a função hora
char text5 [] = " DATA: "; // falta fazer a função data
char text6 [] = " C "; // falta fazer a função hora

// DEFINIÇÃO DAS VARIAVEIS

unsigned int medido_adc;
unsigned int ajustado_adc;
float medido;
float ajustado;
char estado;
char t1[16];
char t2[16];

// FUNÇÃO O QUE VAI APARECER NA TELA

void tela ()
{
Lcd_init ();
Delay_ms(200);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out (1,5, text1); // Temperatura
Delay_ms(10);
Lcd_Out (2,1, text2); // Agua
Delay_ms(10);
Lcd_Chr (2,18, 223); // º
Delay_ms(10);
Lcd_Out (2,19, text6); // C
Delay_ms(10);
Lcd_Out (1,21, text3); // Set Point
Delay_ms(10);
Lcd_Chr (1,38, 223); // º
Delay_ms(10);
Lcd_Out (1,39, text6); // C
Delay_ms(10);
Lcd_Out (2,21, text4); // Hora
Delay_ms(10);
}
// CONVERSÃO DO VALOR MEDIDO NO POTENCIOMETRO DE AJUSTE DE TEMPERATURA

void setpoint ()
{
ADCON1 = 0x0e; //configura AN0,AN1,AN3 COMO analógico e os demais pinos como digital
TRISA.RA1 = 1; // Entrada do Potenciometro de ajuste do SetPoint
TRISB.RB1 = 1; // Habilita o SetPoint desejado
porta. ra1 = 0;
portb.RB1 = 0;

ajustado_adc = Adc_Read(1); // Le o valor do potenciometro
ajustado = ((ajustado_adc*5.00*20)/1024); // faz a conversão
wordToStr (ajustado, t2); // transforma
Lcd_Out(1,30, t2 ); // envia para o Lcd
}

// CONVERSÃO AD DO VALOR MEDIDO PELO LM35

void agua ()
{
ADCON1 = 0x0e; //'configura AN0,AN1,AN3 COMO analógico e os demais pinos como digital
TRISA.RA2 = 1; // Entrada do Lm 35
porta. ra2 = 0;

medido_adc = Adc_Read(2);
medido = (medido_adc*5.00*100)/1024;
wordToStr(medido, t1);
Lcd_Out(2,10, t1 ); // envia para o Lcd
}
// FUNÇÃO PRINCIPAL

void temperatura ()
{
trisb.rb3 = 0;
portb.rb3 = 0;

tela (); // INICIA O LCD
setpoint(); // INICIA O SET POINT

while(1)
{
if (PORTB.RB1 == 0) // APERTA O BOTÃO DE AJUSTE DO SET POINT
setpoint (); // CHAMA O SET POINT

else
{
if (medido > ajustado) // COMPARA O VALOR MEDIDO FOR MENOR QUE AJUSTADO
{
agua ();
RB3_bit = 0; // LIGA RESISTENCIA EM B3
delay_ms (20);
agua (); // chama medido novamente
}
if ( medido <= ajustado) // faz novo teste medido ajustado
{
agua ();
RB3_bit = 1; // vai desligar porta d3
delay_ms (20);
agua(); // chama medido
}
}
}
}
// FUNÇÃO DE CONTROLE DA ILUMINAÇÃO DO AQUARIO

void main( )
{
char status;
trisb.rb0 = 1;
portb.rb0 = 0;
trisc.rc0 = 0; //configura portb como saida
trisc.rc1 = 0; //configura portb como saida
trisc.rc2 = 0; //configura portb como saida
trisc.rc3 = 0; //configura portb como saida
portc = 0; //resseta todos os pinos do portb

while(1)



{

if (portb.rb0 == 0 && status == 1) // Testa se o botão esta ligado
{

PORTC.RC0 = 1;
PORTC.RC1 = 1;
PORTC.RC2 = 0;
PORTC.RC3 = 0;

delay_ms (1000);

PORTC.RC0 = 1;
PORTC.RC1 = 0;
PORTC.RC2 = 1;
PORTC.RC3 = 0;

delay_ms (1000);

PORTC.RC0 = 1;
PORTC.RC1 = 0;
PORTC.RC2 = 0;
PORTC.RC3 = 1;

delay_ms (1000);

status = 0;
}
else // decisão do que fazer
{
if (portb.rb0 == 1 && status == 0) // Testa se o Botão esta desligado

PORTC.RC0 = 0;
PORTC.RC1 = 0;
PORTC.RC2 = 0;
PORTC.RC3 = 0;
status = 1;
}
temperatura (); //condição de loop infinito
}

}

Postado

Não olhei muito bem o codigo, tem muitas funções...rsrsrsrs

mas na função main(), a variavel status não esta inicializada.

Postado

Essa variavel status deve ser inicializada com algum valor, condição inicial, entende?

O que acontece é o seguinte: digamos que ela seja inicializada com o valor zero

" char status = 0"...... ai voce ira testar o botão, se o nivel logico do botão for igual a 1 e o valor da variavel for igual a 0, executa o bloco de instruções, e dentro deste bloco você incrementa a variavel em uma unidade.Depois você faz ou comando if, de modo que se o botão tenha de ser solto, para ser apertado depois novamente, de modo que se o operador ficar com o dedo pressionando o botão, o comando so sera executado uma vez, forçando o operador a soltar o botão para em seguida fazer tudo novamente...

vou deixar aqui assim...

void main( ) // função principal.

{

unsigned char status = 0

...

...

while(1) {

if (portb.rb0 == 0 && status == 0) // Testa se o botão esta ligado

{

....

....

status ++;

}

else // decisão do que fazer

{

if (portb.rb0 == 1 && status == 1) // Testa se o Botão esta desligado

PORTC.RC0 = 0;

PORTC.RC1 = 0;

PORTC.RC2 = 0;

PORTC.RC3 = 0;

status = 0;

}

temperatura (); //condição de loop infinito

}

}

tenta ai...vamos ver o que acontece. Lembrando que os comandos de acender os leds so serão executados se o botão for pressionado toda vez que o programa voltar ao laço while(1).

Postado

CIS

Como voce falou funcionou, do jeito que estava nao estava bom mesmo, agora esta realmente testando o botão.

O que me ocorreu agora foi o seguinte, digamos que eu quero que cada led fique 5 minutos ligado, a temperatura seria monitorada a cada 15 minutos, ja que o primeiro led vai ficar sempre aceso. Digamos que a temperatura estivesse abaixo do set point a resistencia iria ligar e em 15 munutos a agua iria esquentar muito, acho que o monitoramento da temperatura deve ocorer no maximo a cada minuto, sera que é posivel.

Estou postando a imagem de como ta montado no simulador.

post-945277-13884963808482_thumb.jpg

Postado

é possível sim, mas tera que que fazer essa temporização baseado em algum timer do PIC, você ja estudou os timer's ?

O que acontece é o seguinte, no primeiro codigo que você postou, tem varias funções e você chama apenas a função temperatura dentro da função main()... a questão dos acionamentos dos leds so ocorrera se o botão for pressionado, caso não seja pressionado, a função main() ficara chamando a função temperatura() o tempo todo... entendeu ???

estou meio perdido na sua "linha de raciocínio", mas o que for entendendo e puder ajudar, pode contar comigo...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!