Ir ao conteúdo

PIC16F877a não quer funcionar depois de gravado


felipe1978

Posts recomendados

Postado

Boa noite a todos, estou com problemas para fazer um projeto na pratica... Fiz a programação em C e usei o compilador CCS 4.130 e na simulação com o ISIS funciona perfeitamente, assim como a compilação. Faço a gravação com sucesso, montei no protoboard e nada de funcionar...

Fiz todas as ligações conforme o esquema, coloquei os pinos 11 e 32 no +5v,os pinos 12 e 31 no GND e no pino 1 a resistência de 10k em 5V.... Já verifiquei as tensões em todos os pontos.. e até agora nada :wacko:

Já tentei trocar de cristal (16Mhz) por outros, já troquei os capacitores ligado ao cristal estou usando o de 22pF conforme a indicação, mas já tentei com vários valores. Eu já comprei 3 pics e nada, ja montei e remontei o circuito varias vezes r já estou sem alternativas....

Segui abaixo a programação

 
#include <16F877A.h>

#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc > 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP
#FUSES NOCPD //No EE protection

#use delay(clock = 16000000)

#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09

#define use_portb_lcd TRUE

#define LM_GEL PIN_A0
#define LM_RES PIN_A1
#define BOTAO_TAMPA PIN_C0
#define CH_SEG PIN_C1
#define RESISTENCIA PIN_D0
#define ALARME PIN_D1
#define ventoinha PIN_D2
#define TEMP_INADEQUADA PIN_D3
#define TEMP_IDEAL PIN_D4
#define BUZZER PIN_D5
#define DISP_SEG PIN_D6

#include <LCD.C>

float var_temp_gel;
float var_temp_res;
int16 var_ad_gel;
int16 var_ad_res;
int16 q=0;
int16 i=0;
int8 var_temp_inadequada;
int8 var_temp_ideal;
int8 var_buzzer;
int8 var_saiu_ideal = 1;


#int_timer0
void trata_t0 (void)
{
i++;
if (i == 1000)
{
var_buzzer = 0;
i = 0;
disable_interrupts(INT_TIMER0);
}
set_timer0(131-get_timer0()); //reinicia o timer 0 em 131 menos a contagem que já passou

}

#int_timer1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++;
if (q==458)
{
output_high (ALARME);
q=0;
}
set_timer1 (0); //Preload do Timer1
if (input(BOTAO_TAMPA))
output_low (ALARME);




}

void main(){
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_128);
set_timer1 (0); //Preload do Timer1
set_timer0(131); //INICIA O TIMER 0 EM 131
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
disable_interrupts(INT_TIMER0); //Habilita interrupção timer1
enable_interrupts(global | INT_TIMER0 );


set_tris_a(0x03);
set_tris_b(0x00);
set_tris_c(0x01);
set_tris_d(0x00);
set_tris_e(0x00);
porta = 0x00;
portb = 0x00;
portc = 0x00;
portd = 0x00;
porte = 0x00;

setup_adc_ports (ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);

lcd_init();




for (;
{

set_adc_channel(1);
delay_us(20);
var_ad_res = read_adc(); // Lê o LM35 da resistência
var_temp_res= var_ad_res * 0.488;

set_adc_channel(0);
delay_us(20);
var_ad_gel = read_adc(); // Lê o LM35 do gel
var_temp_gel= var_ad_gel * 0.488;

if ((var_temp_gel<=36)||(var_temp_res<60))
output_high (RESISTENCIA);

if ((var_temp_gel>36)||(var_temp_res>60)||(var_ad_gel==0)||(var_ad_res==0))
output_low (RESISTENCIA);

if ((var_temp_gel<=40)||(var_temp_res>65))
output_low (ventoinha);

if ((var_temp_gel>40)||(var_temp_res>65))
output_high (ventoinha);

if ((var_temp_gel < 36)||(var_temp_gel > 40))
{
var_temp_inadequada = 1;
var_saiu_ideal = 1;
output_low (BUZZER);
}

else
var_temp_inadequada=0;

if ((var_temp_gel >= 36)&&(var_temp_gel <= 40))
{
var_temp_ideal = 1;
if (var_saiu_ideal == 1)
{
var_buzzer = 1;
var_saiu_ideal = 0;
enable_interrupts(INT_TIMER0);
}
}
else
var_temp_ideal = 0;

if (var_temp_ideal == 1)
{
output_high (TEMP_IDEAL);

if (var_buzzer == 1)
{
output_high (BUZZER);
}
else
{
output_low (BUZZER);
}
}
else
{
output_low (TEMP_IDEAL);
}

if (var_temp_inadequada == 1)
{
output_high (TEMP_INADEQUADA);

}
else
{
output_low (TEMP_INADEQUADA);
}

if (input (CH_SEG))
output_low (DISP_SEG);

else
output_high (DISP_SEG);


lcd_putc("\f Temperatura:");
printf(lcd_putc,"\n %3.1f%cC",var_temp_gel,0xdf);
delay_ms(500);
}
}

post-1065294-13884967006209_thumb.jpg

Postado

cara, você esta usando o CCS, eu não entendo muito como é feita a configuração dos periféricos nele, pois trabalho com o microC, mas se fosse no microC neste código esta faltando duas configurações realmente muito importantíssimas, a do CMCON que controla os comparadores, e a do ADCON1 que controla as portas analógicas, não sei se foi caso particular, mas teve um projeto meu que não funcionava, configurei-os e pinba, funcionou na hora

flowwww

Postado

você consegue montar o circuito e fazer com que um led pisque?

Se em um programa básico, o led piscar, podemos descartar a hipótese de erro no circuito base.

O que pode acontecer é o PIC nao conseguir inicializar o LCD e ficar preso na rotina. Tente colocar um output_high logo depois do lcd_init(). Veja se o pino vai a nivel logico alto. Se náo for, é problema nas conexões do LCD. Falando nisso, já colocou o potenciômetro no pino 3 do LCD?

Outra coisa. Recomenda-se colocar o lcd_init() logo depois do void main

Falou

Postado

Bom , eu nao faço o aterramento ao gnd do D0 ao D3. deixo simplesmente sem conexao.

tente usar esse cabeçalho

#include <16F877A.h>

#device adc=10

#FUSES NOWDT

#FUSES HS

#FUSES PUT

#FUSES NOPROTECT

#FUSES NODEBUG

#FUSES NOLVP

#FUSES NOCPD

#use delay(clock=16000000)

amanha vou tentar verificar se encontro algo a mais q possa estar interferindo. e qt a gravaçao, utiliza qual metodo?

abraço

Postado

Amigo...

Só um conselho a mais... Frequências altas e protoboard's não se dão bem:

Eu estava montando um projetinho aqui com um 18f452, usando clock de12 Mhz, era uma situação parecida com a sua, aparentemente tudo OK, mas na hora que ligava, o PIC parecia não responder... Por desencardo de consciência, recompilei o programa para 4 MHz e troquei o cristal de 12 por um de 4Mhz, e para minha surpresa.... Funcionou perfeitamente...

Acho que você deveria fazer o mesmo... Reduza o Clock para 4Mhz e veja o resultado... Afinal, não custa nada tentar... XD

Espero ter ajudado... Grato Luiz Gustavo.

Postado

Bom dia a todos, tentei seguir todas as orientações descritas acima e nada...

Parece que os pics estão mortos, não acende nenhum led e não aparece nada no LCD. JA tentei realizar oss teste também sem o lcd e nada.

ja tentei gravar com o gravador multiprog (ICD2) da smart radio e com um gravador que utiliza o software DIY k150 v150807.

Já tentei reduzir o clock conforme o amigo LuizGBarrio orientou e também continua do mesmo jeito.

Bom dia a todos, tentei seguir todas as orientações descritas acima e nada...

Parece que os pics estão mortos, não acende nenhum led e não aparece nada no LCD. JA tentei realizar o teste também sem o lcd e nada.

ja tentei gravar com o gravador multiprog (ICD2) da smart radio e com um gravador que utiliza o software DIY k150 v150807.

Já tentei reduzir o clock conforme o amigo LuizGBarrio orientou e também continua do mesmo jeito.

Uma dúvida que me fica em relação aos fuses , foi o que o amigo mister nintendo, logo no inicio mencionou, em relação aos fuses que controlan os comparadores (CMCON) e a que controla as portas analogicas (ADCON1). Há como configurar esses fuses no CCS?

Como mencionaram a alta frequência em protoboard, estou montando o circuito em uma placa padrão e realizar os testes na mesma. Espero que seja esse o problema...

Postado

Bom. Os fuses estão corretos.

A fonte de 5v está bem estável? Como montou essa fonte? Tem os capacitores de filtro na saída e bem perto do PIC?

Tente com o básico. Enquanto náo conseguir acender um led, não tente outra coisa.

Consegue tirar uma foto bem nítida da montagem na protoboard?

Falou

Postado

Estou usando uma fonte linear que é composta por:

1 trafo 12v 1A

4 diodos 4007

1 Capacitor eletrolitico de 2200 Micro F 35V

1 capaciotor ceramico (104) de 100 nF

1 led

1 capacitor eletrolitico de 100 Micro F 16V (filtro)

1 capacitor poliester (104) de 100 nF (filtro)

1 Porta fusivel

1 7805

Já coloquei vários valores de capacitor de filtro imaginando que pudesse ter alguma interferência...

Tirei as fotos e elas ficaram bem carregadas aqui segue os links (tirei as fotos em ligar o LCD)

http://prntscr.com/239pfi

http://prntscr.com/239pv6

http://prntscr.com/239qp4

http://prntscr.com/239s29

http://prntscr.com/239to8

http://prntscr.com/239uqe

http://prntscr.com/239w2u

http://prntscr.com/239x26

http://prntscr.com/239zp8

http://prntscr.com/23a0as

http://prntscr.com/23a0s9

http://prntscr.com/23a10o

Postado

Felipe,

Experimente colocar um capacitor ceramico de 100nF entre os pinos 11 e 12 do Pic, bem pertinho do CI, e tambem repita entre os pinos 31 e 32.

Outra coisa, olhando as fotos, acho que falta ligar o pino 31 ao terra; voce ligou ele na linha acima dele, mas não achei onde essa linha faz ligaçāo com o terra ( gnd) .

Paulo

Postado

Amigo se o PIC simplesmente não responde... Pode ser um problema no MCLR/VPP Já tentou pendurar um capacitor de uns 10 uF ali??

Postado

Aphawk eu depois revi tudo e realmente faltou uma ligação conforme mencionou, mas mesmo depois de ligar nada de funcionar... Tentei fazer o que recomentdou junto com a dica do LuizGBarrio de usar capacitores e tb nada...

Fique pensando senão poderia ser algo relacionado com o gravador...

Ao ler um artigo na net http://filipeflop.wordpress.com/2012/12/18/como-utilizar-o-gravador-de-pic-usb-40zif/ em relação ao gravador que estou utilizando vi que as vezes é necessário converter o arquivo .hex atraves para funcionar.

Então tentei usar esse conversor e apresentou-me erro conforme a imagem http://prntscr.com/23bu42 Será que o problema está aí e se for como farei para solucionar?

Postado

Se voce está usando aquele gravador k150 chines baratinho, ele è bem complicadinho de fazer funcionar direito, eu sofrí pacas para conseguir que ele gravasse certo os Fuses ! Ah, e ele não grava certo a EEprom de jeito nenhum !

Eu tive de instalar o compilador da Microchips, importar o .hex, e exportar de novo para ficar direitinho, mas é que eu tinha um .Hex antigo. Experimente fazer isso. Eu também tentei usar esse seu programa de correção e não funcionou !

Mas se eu fosse voce, usava o velho e bom ICD2 .

Paulo

Postado

Pois é. Quando eu estava precisando de um gravador com urgência, pensei em pegar esse K150 pelo preço (~R$60). No entanto, lendo reviews dele, me deparei com pessoas tendo problemas na gravação e que teria que fazer uma infinidade de procedimentos para gravar um simples PIC. Desisti na hora pois eu não estava com tempo a perder. Acabei pagando bem mais caro em um PICKit3. Pelo menos não tive problemas.

Mas felipe1978, com o gravador multiprog acredito que já deveria ter funcionado.

Estou ficando sem ideia do problema. A única coisa que continua me vindo à cabeça é algum fio que você acabou deixando desconectado ou fora do lugar devido à utilização da protoboard.

Atente-se aos capacitores do cristal. Você informou que são 22pF. Nesse caso, são so valores normais. Mas verifique se realmente são de 22pF ou algo entre 13 e 33pF. Talvez você tenha confundido e colocado capacitores da ordem de nF. Aí não funciona mesmo.

Quando ocorre isso comigo, infelizmente não tem outra saída. É desmontar TUDO e montar de novo. A gente acaba esquecendo algo fora do lugar. MOnte em blocos e não tudo de uma vez. Tente acender um LED. Coloque somente os componentes essenciais ao funcionamento básico do circuito. Depois vá colocando o resto.

Outra coisa que pode ser: a própria protoboard. Acontece de ter pequenas trilhas com defeito ou mau contato. Nesse caso, caso decida remontar tudo, monte em outra parte da protoboard, utilizando outros pinos (buracos). Sério, já peguei defeitos assim quase impossíveis de encontrar e que no final era a protoboard com problemas.

Se o circuito estiver realmente correto, a única opção é o gravador defeituoso.

Falou

Postado

Acho que é a melhor ideia... desmontar e montar de novo, apenas o necessário para acender um led !

Eu ví aquele fio faltando porque sua foto estava boa, mas pode ser que tenham outros, e até pode ter ocorrido que os Pics tenham sido danificados pela falta daquele terra.

Eu uso esse K150 para coisas bem simples, mas é mesmo muito problemático para quem está iniciando. Fora que ele não grava as EEPROM; o programa diz que gravou mas quando voce vai ler está tudo em branco !

Use um PicKit2 ou um Pickit3. Pela sua falta de "intimidade" com montagem e gravação, é melhor ter um gravador que seja 100% confiável. É menos coisa para se preocupar quando o circuito não funciona.

Tem gente vendendo clones deles aí no mercado livre mesmo, sai baratinho e te entregam rapidinho.

E por último, alguém já falou acima, coloque um pequeno capacitor no pino de Reset do PIC, por exemplo um de 100nF ligado ao terra. voce já deve ter ligado um resistir ao positivo nesse pino.

Paulo

Postado

Eu ja liguei o cabo que faltava e nada ontem passei o dia fazendo e refazendo tudo do zero... Revisei trilha por trilha do protoboard , colocando o pic em diversas posições no protoboard. Parece que o pic está morto.... Eu fiz um teste com um programa para fazer um led acender feito em mikroC e funcionou então só posso acreditar que houve um problema no arquivo .hex do CCS ... ja tentei recompilar um do zero , refazendo um novo projeto e nada. Tentei importar e exportar o arquivo conforme orientação e nada... Vejo como unica solução seria refazer tudo em MikroC... O problema que tenho que apresentar o projeto funcional daqui 10 dias e refazer numa linguagem que tenho pouco conhecimento em tão pouco tempo fica praticamente inviavel....

Postado

amigão posso transcrever pra você, ja que se esforçou tanto e esta seria uma ótima ajuda pra você, mas como não manjo de ccs pode ir com alguma configuraçãozinha errada ou algum bug, mas ai ja é com você ok?

amanha posto o código

flowwww

Postado

amigão, procure minimamente por bugs e configurações erradas pois como eu não manjo desses #define e configurações que eu acho malucas rsrsrs pode haver configurações erradas, ja na lógica não dava pra erra muito não


sbit LM_GEL at ra0_bit;
sbit LM_RES at ra1_bit;
sbit BOTAO_TAMPA at rc0_bit;
sbit CH_SEG at rc1_bit;
sbit RESISTENCIA at rd0_bit;
sbit ALARME at rd1_bit;
sbit ventoinha at rd2_bit;
sbit TEMP_INADEQUADA at rd3_bit;
sbit TEMP_IDEAL at rd4_bit;
sbit BUZZER at rd5_bit;
sbit DISP_SEG at rd6_bit;

sbit LCD_RS at RB1_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

char txt[15];
float var_temp_gel;
float var_temp_res;
long var_ad_gel;
long var_ad_res;
long q=0;
long i=0;
int var_temp_inadequada;
int var_temp_ideal;
int var_buzzer;
int var_saiu_ideal = 1;



void interrupt()
{
if(tmr0if==1)
{
i++;
if (i == 1000)
{
var_buzzer = 0;
i = 0;
intcon=intcon|0b00000100;
}
tmr0=0;
}

if(tmr1if==1)
{
q++;
if (q==458)
{
ALARME=1;
q=0;
}
tmr1h=0;
tmr1l=0; //Preload do Timer1
if (BOTAO_TAMPA==1)
{
ALARME=0;
}
}
return;
}


void main()
{
pie1=0x01;
t1con=0b00111101;
intcon=0b11100000;
option_reg=0b00000110;
cmcon=0x07;
adcon1=0x80;
adcon0=0x80;
trisa=0x03;
trisb=0x00;
trisc=0x01;
trisd=0x00;
trise=0x00;
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
tmr1h=0x00;
tmr1l=0x00;
tmr0=131;

lcd_init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);



while (1)
{
delay_us(20);
var_ad_res=ADC_Read(1);
var_temp_res= var_ad_res * 0.488;

delay_us(20);
var_ad_gel=ADC_Read(0);
var_temp_gel= var_ad_gel * 0.488;

if ((var_temp_gel<=36)||(var_temp_res<60))
RESISTENCIA=0;

if ((var_temp_gel>36)||(var_temp_res>60)||(var_ad_gel==0)||(var_ad_res==0))
RESISTENCIA=0;

if ((var_temp_gel<=40)||(var_temp_res>65))
ventoinha=0;

if ((var_temp_gel>40)||(var_temp_res>65))
ventoinha=1;

if ((var_temp_gel < 36)||(var_temp_gel > 40))
{
var_temp_inadequada = 1;
var_saiu_ideal = 1;
BUZZER=0;
}

else
var_temp_inadequada=0;

if (var_temp_gel >= 36 && var_temp_gel <= 40)
{
var_temp_ideal = 1;
if (var_saiu_ideal == 1)
{
var_buzzer = 1;
var_saiu_ideal = 0;
intcon=intcon&0b11111011;
}
}
else
var_temp_ideal = 0;

if (var_temp_ideal == 1)
{
TEMP_IDEAL=1;

if (var_buzzer == 1)
{
BUZZER=1;
}
else
{
BUZZER=0;
}
}
else
{
TEMP_IDEAL=0;
}

if (var_temp_inadequada == 1)
{
TEMP_INADEQUADA=0;

}
else
{
TEMP_INADEQUADA=0;
}

if (CH_SEG==1)
{
DISP_SEG=0;
}
else
{
DISP_SEG=1;
}

lcd_out(1, 1," Temperatura:");
floattostr(var_temp_gel, txt);
lcd_out(2, 1, txt);
delay_ms(500);
}
}

flowwwww

Postado

Olá a todos eu recompilei em mickroC e o código do amigo mister nintendo e funcionou... No entanto há algumas coisas que não funcionaram. Seria em relação aos timers. Se habilitar intcon=0b11100000 trava tudo... não sei se teria mais alguma coisa para mudar ja que o meu conhecimento em mickroC é limitado. Hoje aprendi bastante e pretendo migrar para o mikroC.

Em relação a temperatura apresentado no LCD, ficou com 5 casas depois da virgula... Como faria para apresentar apenas uma casa depois da virgula e em seguida colocar o "ºC" (por ex: 35,6ºC).

Obrigado


sbit LM_GEL at ra0_bit;
sbit LM_RES at ra1_bit;
sbit BOTAO_TAMPA at rc0_bit;
sbit CH_SEG at rc1_bit;
sbit RESISTENCIA at rd0_bit;
sbit ALARME at rd1_bit;
sbit ventoinha at rd2_bit;
sbit TEMP_INADEQUADA at rd3_bit;
sbit TEMP_IDEAL at rd4_bit;
sbit BUZZER at rd5_bit;
sbit DISP_SEG at rd6_bit;

sbit LCD_RS at RB1_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

char txt[15];
float var_temp_gel;
float var_temp_res;
long var_ad_gel;
long var_ad_res;
long q=0;
long i=0;
int var_temp_inadequada;
int var_temp_ideal;
int var_buzzer;
int var_saiu_ideal = 1;



void interrupt()
{
if(tmr0if==1)
{
i++;
if (i == 1000)
{
var_buzzer = 0;
i = 0;
intcon=intcon|0b00000100;
}
tmr0=0;
}

if(tmr1if==1)
{
q++;
if (q==458)
{
ALARME=1;
q=0;
}
tmr1h=0;
tmr1l=0; //Preload do Timer1
if (BOTAO_TAMPA==1)
{
ALARME=0;
}
}
return;
}


void main()
{
pie1=0x01;
t1con=0b00111101;
[COLOR="red"][B]// intcon=0b11100000; //quando habilito essa linha some a imagem do lcd e trava o pic (nenhum led acende)[/B][/COLOR]
option_reg=0b00000110;
cmcon=0x07;
adcon1=0x80;
adcon0=0x80;
trisa=0x03;
trisb=0x00;
trisc=0x01;
trisd=0x00;
trise=0x00;
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
tmr1h=0x00;
tmr1l=0x00;
tmr0=131;

lcd_init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);



while (1)
{
delay_us(20);
var_ad_res=ADC_Read(1);
var_temp_res= var_ad_res * 0.488;

delay_us(20);
var_ad_gel=ADC_Read(0);
var_temp_gel= var_ad_gel * 0.488;

if ((var_temp_gel<=36)||(var_temp_res<60))
[COLOR="red"][B]RESISTENCIA=1; // aqui estava errado errado, estava em nível baixo[/B][/COLOR]

if ((var_temp_gel>36)||(var_temp_res>60))
RESISTENCIA=0;

if ((var_temp_gel<=40)||(var_temp_res>65))
ventoinha=0;

if ((var_temp_gel>40)||(var_temp_res>65))
ventoinha=1;

if ((var_temp_gel < 36)||(var_temp_gel > 40))
{
var_temp_inadequada = 1;
var_saiu_ideal = 1;
BUZZER=0;
}

else
var_temp_inadequada=0;

if (var_temp_gel >= 36 && var_temp_gel <= 40)
{
var_temp_ideal = 1;
if (var_saiu_ideal == 1)
{
var_buzzer = 1;
var_saiu_ideal = 0;
intcon=intcon&0b11111011;
}
}
else
var_temp_ideal = 0;

if (var_temp_ideal == 1)
{
TEMP_IDEAL=1;

if (var_buzzer == 1)
{
BUZZER=1;
}
else
{
BUZZER=0;
}
}
else
{
TEMP_IDEAL=0;
}

if (var_temp_inadequada == 1)
{
[B][COLOR="Red"]TEMP_INADEQUADA=1; // aqui estava errado errado, estava em nivel baixo[/COLOR][/B]

}
else
{
TEMP_INADEQUADA=0;
}

if (CH_SEG==1)
{
DISP_SEG=0;
}
else
{
DISP_SEG=1;
}

lcd_out(1, 1,"Temperatura:Gel");
floattostr(var_temp_gel, txt);
Lcd_Out(2,6,txt);

delay_ms(500);
}
}

Postado

Amigo para cortar a exibição das demais casas é só "zerar" o elemento da matriz equivalente ao caractere em que você deseja fazer o corte... Resumindo...

Coloque assim :

floattostr(var_temp_gel, texto);
texto[5]=0;
Lcd_Out(2,6,txt);

Neste caso o LCD não vai exibir o que vier do quarto caractere em diante, é meio chato para explicar, mas faça o teste e depois altere o elemento de "texto[]" e compare os resultados... Em 5 minutos você vai entender plenamente como usar este recurso... XD

Se não me engano (me corrijam se eu estiver errado), a virgula conta no numero de carateres, então quando você colaca texto[5]=0; no display vai aparecer isso:

x,xx

ou isso:

xx,x

de acordo com a tamanho do numero (se for menor que 10 no display vai aparecer duas casas depois da virgula, se for maior ou igual que 10 no display vai aparecer uma casa depois da virgula)....

Se quiser que sempre apareça 1 casa depois da virgula, você vai precisar de um código um pouco maior (acho que não vale o esforço...hehe)

Mas isso não arredonda o valor, apenas deixa de exibir as demais casas....

Espero ter ajudado.

Grato Luiz Gustavo.

Postado
intcon=0b11100000;

amigão, esta linha é a variável que cuida das interrupções, se você anular ela, simplesmente fica sem as interrupções, vamos ter de procurar um problema na função de interrupção, pois se quando a habilitamos da errado esta nela o problema, eu já a re-li e não achei erro nenhum aparente, mas como não estou inteirado da lógica, fica a dica de onde deve ser o problema

flowwww

Postado

Estava olhando o esquema que você fez a simulação no Isis.... está usando uma simples chave para gerar essa interrupção.... isso deve gerar zilhões de ruídos, sugiro você programar interrupção por mudança de nível, e dentro da rotina, esperar 20 milisegundos, e depois ler o estado do pino, para saber se a chave foi ligada ou se foi desligada e proceder de acordo. Assim filtra esses ruídos da chave.

Creio que está travando por cauda disso.

Paulo

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!