PIC travando(resolvido)

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PIC travando(resolvido)

Mensagempor Controladores » 14 Out 2009 15:44

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.
Editado pela última vez por Controladores em 17 Out 2009 10:33, em um total de 1 vez.
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor vtrx » 17 Out 2009 10:14

O pessoal do 'C',não da pra solucionar ou ajudar o rapaz??
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor Controladores » 17 Out 2009 10:32

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.
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor Andre_Cruz » 17 Out 2009 10:49

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
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Controladores » 17 Out 2009 10:59

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
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x