PIC travando(resolvido)

Enviado:
14 Out 2009 15:44
por Controladores
Ola pessoal fiz uma rotina aqui para ler um ntc e mostrar no display de 7 segmentos estou utilizando um 16F916, até ai tudo mas quando o pic entra na rotina que converte a entrada analogica em temperatua ele trava, não consigo entender porque, segue a rotina abaixo.
int ntc_positivo(int temp1){
int c_tempp = 0;
if((temp1 >=164) && (temp1 < 871)){//se estiver no range
if ((temp1>=810)&&(temp1<871)){ // ate 10
c_tempp = (17*(871-temp1));
return(c_tempp);
}
if ((temp1>=736)&&(temp1<810)){ //ate 20
c_tempp = (17*(810-temp1));
return(c_tempp+1000);
}
if ((temp1>=654)&&(temp1<736)){ //ate 30
c_tempp = (12*(736-temp1));
return(c_tempp+2000);
}
if ((temp1>=566)&&(temp1<654)){ //ate 40
c_tempp = (12*(654-temp1));
return(c_tempp+3000);
}
if ((temp1>=480)&&(temp1<566)){ //ate 50
c_tempp = (11*(566-temp1));
return(c_tempp+4000);
}
if ((temp1>=398)&&(temp1<480)){ //ate 60
c_tempp = (14*(480-temp1));
return(c_tempp+5000);
}
if ((temp1>=325)&&(temp1<398)){ //ate 70
c_tempp = (14*(398-temp1));
return(c_tempp+6000);
}
if ((temp1>=265)&&(temp1<325)){ //ate 80
c_tempp = (16*(325-temp1));
return( c_tempp+7000);
}
if ((temp1>=212)&&(temp1<265)){ // ate 90
c_tempp = (18*(265-temp1));
return(c_tempp+8000);
}
if ((temp1>=165)&&(temp1<212)){ // ate 100
c_tempp = (21*(212-temp1));
return(c_tempp+9000);
}
}
else{
return(0);} //se não intão retorna 0
}
Se alguem puder me dar um help agradeço.

Enviado:
17 Out 2009 10:14
por vtrx
O pessoal do 'C',não da pra solucionar ou ajudar o rapaz??

Enviado:
17 Out 2009 10:32
por Controladores
vtrx escreveu:O pessoal do 'C',não da pra solucionar ou ajudar o rapaz??
Muito obrigado pela força ai mas hj eu consegui achar o erro era aqueles retuns refiz o codico sem os return ai ficou bom valeuuuu.

Enviado:
17 Out 2009 10:49
por Andre_Cruz
Controladores,
Eu depurei sua função e realmente ela não tem problema algum !
O problema crio eu que seja no momento de exibi-la.
Testei aqui o seguinte software:
- Código: Selecionar todos
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include "delay.h"
#include "delay.c"
#include "lcd.c"
// Configurar as opcoes de operacao
/*HS - cristal de alta frequencia
WDTDIS - desabilita watch dog timer
PWRTDIS - desabilita Power Up timer
LVPDIS - desabilita low voltage programming
DUNPROT - memoria de dados (EEPROM) desprotegida
UNPROTECT - memoria de programa desprotegida
BORDIS - desabilita brown out reset
*/
__CONFIG(HS & WDTDIS & PWRTDIS & LVPDIS & DUNPROT & UNPROTECT & BORDIS);
unsigned
teste = 0;
//Prototipo da funcao
int ntc_positivo(int temp1);
//funcao
int ntc_positivo(int temp1){
int c_tempp = 0;
if((temp1 >=164) && (temp1 < 871)){//se estiver no range
if ((temp1>=810)&&(temp1<871)){ // ate 10
c_tempp = (17*(871-temp1));
return(c_tempp);
}
if ((temp1>=736)&&(temp1<810)){ //ate 20
c_tempp = (17*(810-temp1));
return(c_tempp+1000);
}
if ((temp1>=654)&&(temp1<736)){ //ate 30
c_tempp = (12*(736-temp1));
return(c_tempp+2000);
}
if ((temp1>=566)&&(temp1<654)){ //ate 40
c_tempp = (12*(654-temp1));
return(c_tempp+3000);
}
if ((temp1>=480)&&(temp1<566)){ //ate 50
c_tempp = (11*(566-temp1));
return(c_tempp+4000);
}
if ((temp1>=398)&&(temp1<480)){ //ate 60
c_tempp = (14*(480-temp1));
return(c_tempp+5000);
}
if ((temp1>=325)&&(temp1<398)){ //ate 70
c_tempp = (14*(398-temp1));
return(c_tempp+6000);
}
if ((temp1>=265)&&(temp1<325)){ //ate 80
c_tempp = (16*(325-temp1));
return( c_tempp+7000);
}
if ((temp1>=212)&&(temp1<265)){ // ate 90
c_tempp = (18*(265-temp1));
return(c_tempp+8000);
}
if ((temp1>=165)&&(temp1<212)){ // ate 100
c_tempp = (21*(212-temp1));
return(c_tempp+9000);
}
} else{
return(0);} //se não intão retorna 0
}
void main() {
/*PORTA:
RA0 - entrada analogica 0 AN0
RA1 - entrada analogica 1 AN1
RA2 - saida para ativar coluna 3 do teclado
RA3 - entrada do comparador analogico
RA4 - saida para ativar coluna 1 do teclado
RA5 - saida para ativar coluna 0 do teclado
*/
TRISA = 0b11001011;
/*PORTB:
RB0 - entrada da INT0
RB1 - saida para ativar coluna 2 do teclado
RB2 - saida do sinal LCD_RS
RB3 - saida do sinal LCD_EN
RB4 - leitura da chave SW0 ou bit D0 comunicacao paralela
RB5 - leitura da chave SW1 ou bit D1 comunicacao paralela
RB6 - leitura da chave SW2 ou bit D2 comunicacao paralela
RB7 - leitura da chave SW3 ou bit D3 comunicacao paralela
*/
TRISB = 0b11110001;
/*PORTC:
RC0 - entrada de pulsos para contador TIMER1
RC1 - saida do PWM CCP2 e saida analogica DA0
RC2 - saida do PWM CCP1 e saida analogica DA1
RC3 - linha SCL da comunicacao I2C
RC4 - linha SDA da comunicacao I2C
RC5 - entrada da linha 3 do teclado
RC6 - saida para sinal TX da comunicacao serial UART
RC7 - entrada para sinal RX da comunicacao serial UART
*/
TRISC = 0b10111101;
/*PORTD:
RD0 - saida para o sinal LCD_D0
RD1 - saida para o sinal LCD_D1
RD2 - saida para o sinal LCD_D2
RD3 - saida para o sinal LCD_D3
RD4 - saida para LED0 e comunicacao paralela (pino 15 da LPT)
RD5 - saida para LED1 e comunicacao paralela (pino 13 da LPT)
RD6 - saida para LED2 e comunicacao paralela (pino 12 da LPT)
RD7 - saida para LED3 e comunicacao paralela (pino 10 da LPT)
*/
TRISD = 0b00000000;
/*PORTE:
RE0 - entrada para linha 0 do teclado
RE1 - entrada para linha 1 do teclado
RE2 - entrada para linha 2 do teclado
- setar os demais bits como mostrado para evitar problemas com PSP -
*/
TRISE = 0b00000111;
ADCON1 = 0xFF; //porta tudo digital
lcd_init(); //inicializacao do LCD
lcd_clear(); //limpa LCD
while (1) {
teste = ntc_positivo (170);
lcd_clear();
printf("TESTE FUNCAO %d", teste);
DelaySeg(1);
/*
ASSIM TRAVA A FUNCAO !
printf("TESTE FUNCAO %d", ntc_positivo (170));
*/
}
}
Espero ter contribuido.
Abraço

Enviado:
17 Out 2009 10:59
por Controladores
Valeu maninho o problema esta quando atribuo o valor da função há uma variavel teste = ntc_positivo(500), outra coisa que noitei é que o pic travava quando retornava.Tirei os return e usao a ctempp como global.Assim funfou.
Andre_Cruz escreveu:Controladores,
Eu depurei sua função e realmente ela não tem problema algum !
O problema crio eu que seja no momento de exibi-la.
Testei aqui o seguinte software:
- Código: Selecionar todos
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include "delay.h"
#include "delay.c"
#include "lcd.c"
// Configurar as opcoes de operacao
/*HS - cristal de alta frequencia
WDTDIS - desabilita watch dog timer
PWRTDIS - desabilita Power Up timer
LVPDIS - desabilita low voltage programming
DUNPROT - memoria de dados (EEPROM) desprotegida
UNPROTECT - memoria de programa desprotegida
BORDIS - desabilita brown out reset
*/
__CONFIG(HS & WDTDIS & PWRTDIS & LVPDIS & DUNPROT & UNPROTECT & BORDIS);
unsigned
teste = 0;
//Prototipo da funcao
int ntc_positivo(int temp1);
//funcao
int ntc_positivo(int temp1){
int c_tempp = 0;
if((temp1 >=164) && (temp1 < 871)){//se estiver no range
if ((temp1>=810)&&(temp1<871)){ // ate 10
c_tempp = (17*(871-temp1));
return(c_tempp);
}
if ((temp1>=736)&&(temp1<810)){ //ate 20
c_tempp = (17*(810-temp1));
return(c_tempp+1000);
}
if ((temp1>=654)&&(temp1<736)){ //ate 30
c_tempp = (12*(736-temp1));
return(c_tempp+2000);
}
if ((temp1>=566)&&(temp1<654)){ //ate 40
c_tempp = (12*(654-temp1));
return(c_tempp+3000);
}
if ((temp1>=480)&&(temp1<566)){ //ate 50
c_tempp = (11*(566-temp1));
return(c_tempp+4000);
}
if ((temp1>=398)&&(temp1<480)){ //ate 60
c_tempp = (14*(480-temp1));
return(c_tempp+5000);
}
if ((temp1>=325)&&(temp1<398)){ //ate 70
c_tempp = (14*(398-temp1));
return(c_tempp+6000);
}
if ((temp1>=265)&&(temp1<325)){ //ate 80
c_tempp = (16*(325-temp1));
return( c_tempp+7000);
}
if ((temp1>=212)&&(temp1<265)){ // ate 90
c_tempp = (18*(265-temp1));
return(c_tempp+8000);
}
if ((temp1>=165)&&(temp1<212)){ // ate 100
c_tempp = (21*(212-temp1));
return(c_tempp+9000);
}
} else{
return(0);} //se não intão retorna 0
}
void main() {
/*PORTA:
RA0 - entrada analogica 0 AN0
RA1 - entrada analogica 1 AN1
RA2 - saida para ativar coluna 3 do teclado
RA3 - entrada do comparador analogico
RA4 - saida para ativar coluna 1 do teclado
RA5 - saida para ativar coluna 0 do teclado
*/
TRISA = 0b11001011;
/*PORTB:
RB0 - entrada da INT0
RB1 - saida para ativar coluna 2 do teclado
RB2 - saida do sinal LCD_RS
RB3 - saida do sinal LCD_EN
RB4 - leitura da chave SW0 ou bit D0 comunicacao paralela
RB5 - leitura da chave SW1 ou bit D1 comunicacao paralela
RB6 - leitura da chave SW2 ou bit D2 comunicacao paralela
RB7 - leitura da chave SW3 ou bit D3 comunicacao paralela
*/
TRISB = 0b11110001;
/*PORTC:
RC0 - entrada de pulsos para contador TIMER1
RC1 - saida do PWM CCP2 e saida analogica DA0
RC2 - saida do PWM CCP1 e saida analogica DA1
RC3 - linha SCL da comunicacao I2C
RC4 - linha SDA da comunicacao I2C
RC5 - entrada da linha 3 do teclado
RC6 - saida para sinal TX da comunicacao serial UART
RC7 - entrada para sinal RX da comunicacao serial UART
*/
TRISC = 0b10111101;
/*PORTD:
RD0 - saida para o sinal LCD_D0
RD1 - saida para o sinal LCD_D1
RD2 - saida para o sinal LCD_D2
RD3 - saida para o sinal LCD_D3
RD4 - saida para LED0 e comunicacao paralela (pino 15 da LPT)
RD5 - saida para LED1 e comunicacao paralela (pino 13 da LPT)
RD6 - saida para LED2 e comunicacao paralela (pino 12 da LPT)
RD7 - saida para LED3 e comunicacao paralela (pino 10 da LPT)
*/
TRISD = 0b00000000;
/*PORTE:
RE0 - entrada para linha 0 do teclado
RE1 - entrada para linha 1 do teclado
RE2 - entrada para linha 2 do teclado
- setar os demais bits como mostrado para evitar problemas com PSP -
*/
TRISE = 0b00000111;
ADCON1 = 0xFF; //porta tudo digital
lcd_init(); //inicializacao do LCD
lcd_clear(); //limpa LCD
while (1) {
teste = ntc_positivo (170);
lcd_clear();
printf("TESTE FUNCAO %d", teste);
DelaySeg(1);
/*
ASSIM TRAVA A FUNCAO !
printf("TESTE FUNCAO %d", ntc_positivo (170));
*/
}
}
Espero ter contribuido.
Abraço