Autor Tema: Como juntar dos programas para que funcione en un solo PIC18F4550  (Leído 3757 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado karr77

  • PIC10
  • *
  • Mensajes: 4
Como juntar dos programas para que funcione en un solo PIC18F4550
« en: 19 de Octubre de 2018, 12:20:44 »
Hola muy buenos días a todos, tengo un pequeño problema, lo que pasa es que no sé mucho sobre C y lo que sé es lo poco que he aprendido, pero mi problema es aquí. Estoy haciendo un lector para termopares tipo J, y el armado lo muestro en la imagen adjunta.
Los mV del termopar son amplificados para que el PIC pueda hacer la conversión ADC, todo el programa para que haga la lectura la tengo separada de otra que lo que hace es ingresar la temperatura en un Keypad 4x4 y mostrar el valor de mV correspondientes a la temperatura en la LCD.

No sé si me explico, pero que quiero hacer es que cuando conectes el PIC este te muestre la temperatura a la que se encuentra el termopar y su voltaje correspondiente (lo cual ya tengo en un programa), y al pulsar un botón poder usar el teclado e ingresar la temperatura que yo quiera y muestre su voltaje (ese ya también lo tengo pero en otro código), el problema aquí es que cuando junto los dos programas solamente me funciona la parte de la lectura del termopar y al usar el teclado este no me manda nada ni hace nada.

Si alguien también sabe cómo pudiera hacerle para que por otro pin del PIC salga un voltaje de 0-5v respecto a la temperatura.
Muchas gracias, espero respuestas...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como juntar dos programas para que funcione en un solo PIC18F4550
« Respuesta #1 en: 19 de Octubre de 2018, 16:14:31 »
Que funcionen por si solos separados indican que el codigo hace bien su trabajo.

El problema es cuando se programa pensando en unicamente un solo programa. Esto podria ser valido para un micro mas grande y pensando en algun RTOS que lo controle, pero cuando es baremetal ( sin ningun OS ) al programar tenes que tener en cuenta que tu programa va a tener que compartir tiempo entre varios programas.

De esa forma, pensando en que luego lo vas a tener que juntar, vas a tener que centrarte en hacer un codigo que:

- No demore tiempo en ejecutarse. Asi dar paso al siguiente.
- Loops esperando por un boton que se suelte quedan prohibidos, ya que de quedar encerrados ahi se detiene el programa.
- Si es necesario alguna demora, sea por los botones o lo que sea, deberia haber solo una unica demora (pequeña = 10ms como maximo) en tu loop infinito del programa completo.
- Con lo anterior si o si ya evita que hagas algun while/for que ocupe demasiado tiempo.

De todas formas sin ver como es que intentaste juntar el programa es dificil que podamos decirte que hiciste mal, tal ves los juntaste de forma correcta, pero los programas en si son el problema.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Como juntar dos programas para que funcione en un solo PIC18F4550
« Respuesta #2 en: 19 de Octubre de 2018, 17:32:28 »
el problema aquí es que cuando junto los dos programas solamente me funciona la parte de la lectura del termopar y al usar el teclado este no me manda nada ni hace nada.


Habrá que ver que entiendes por "juntar", y como lo has juntado. Tendrías que publicar ambos fuentes y el resultado de tu fusión.

Lo ideal, es que la rutina que barre el display se active con una interrupción controlada por un timer, y desde tu otra rutina simplemente cargues una variable global con el valor a mostrar, que leerá la rutina del display para sacar el resultado.

También conviene vincular el teclado a interrupciones, en vez de usar el típico bucle infinito que escanea constantemente los puertos del teclado.
« Última modificación: 19 de Octubre de 2018, 17:38:45 por planeta9999 »

Desconectado karr77

  • PIC10
  • *
  • Mensajes: 4
Re:Como juntar dos programas para que funcione en un solo PIC18F4550
« Respuesta #3 en: 19 de Octubre de 2018, 19:31:16 »
Que funcionen por si solos separados indican que el codigo hace bien su trabajo.

El problema es cuando se programa pensando en unicamente un solo programa. Esto podria ser valido para un micro mas grande y pensando en algun RTOS que lo controle, pero cuando es baremetal ( sin ningun OS ) al programar tenes que tener en cuenta que tu programa va a tener que compartir tiempo entre varios programas.

De esa forma, pensando en que luego lo vas a tener que juntar, vas a tener que centrarte en hacer un codigo que:

- No demore tiempo en ejecutarse. Asi dar paso al siguiente.
- Loops esperando por un boton que se suelte quedan prohibidos, ya que de quedar encerrados ahi se detiene el programa.
- Si es necesario alguna demora, sea por los botones o lo que sea, deberia haber solo una unica demora (pequeña = 10ms como maximo) en tu loop infinito del programa completo.
- Con lo anterior si o si ya evita que hagas algun while/for que ocupe demasiado tiempo.

De todas formas sin ver como es que intentaste juntar el programa es dificil que podamos decirte que hiciste mal, tal ves los juntaste de forma correcta, pero los programas en si son el problema.

Gracias por responder, y mira, estos son los programas:
//lectura del teclado
#include <18F4550.h>
#fuses HSPLL,PLL5,USBDIV,VREGEN,CPUDIV1,NOPBADEN,NOLVP,NOPROTECT,PUT,MCLR,WRTB
#use delay(clock=48000000)

#include <flex_lcd.c>
//#include <keypad.h>
#include <KBD1.C>

#byte porta= 0x0F80
long y;
float mvoltaje;
long kdato;
long cdato[3];
long i, dato;

void inicio()
{
    lcd_gotoxy(1,1);
    printf(lcd_putc,"\fTemp: ");
}
void temp()
{
          kdato = ((cdato[0]*100) + (cdato[1]*10) + (cdato[2]*1));
          lcd_gotoxy(1,1);
          printf(lcd_putc,"Temp: %3Lu%cC\n", kdato,0xDF);
         
}
void operaciones()
{
   y=kdato;
if (y == 0){mvoltaje=0;}                                         //000-000
if (y >=1 && y <=006) {mvoltaje =(y-0.058823529)/19.6078431;}  //001-006
if (y >=7 && y <=015) {mvoltaje =(y-0.058823529)/19.6078431;}  //007-015
if (y >=016 && y <=025) {mvoltaje =(y-0.17710583)/19.43844;}     //016-025
if (y >=026 && y <=036) {mvoltaje =(y-0.44230769)/19.23077;}     //026-036
if (y >=037 && y <=49) {mvoltaje =(y-0.77142857)/19.04762;}     //037-049
if (y >=050 && y <=59) {mvoltaje =(y-1.22641509)/18.86792;}     //050-059
if (y >=060 && y <=81) {mvoltaje =(y-1.78291815)/18.68327;}     //060-081
if (y >=82 && y <=90) {mvoltaje =(y-2.48148148)/18.51852;}     //082-090
if (y >=91 && y <=124) {mvoltaje =(y-3.25083426)/18.35373;}     //091-124
if (y >=125 && y <=147) {mvoltaje =(y-4.3818182)/18.18182;}      //125-147
if (y >=148 && y <=491) {mvoltaje =(y-5.3015957)/18.06309;}      //148-491
if (y >=492 && y <=510) {mvoltaje =(y-10.8392857)/17.85714;}     //492-510
if (y >=511 && y <=544) {mvoltaje =(y-15.114807)/17.70386;}      //511-544
if (y >=545 && y <=554) {mvoltaje =(y-19.8947368)/17.54386;}     //545-554
if (y >=555 && y <=578) {mvoltaje =(y-23.9280848)/17.41105;}     //555-578
if (y >=579 && y <=591) {mvoltaje =(y-29.3275862)/17.24128;}     //579-591
if (y >=592 && y <=608) {mvoltaje =(y-33.5229947)/17.1123;}      //592-608
if (y >=609 && y <=622) {mvoltaje =(y-39)/16.94915;}             //609-622
if (y >=623 && y <=636) {mvoltaje =(y-43.5161708)/16.81759;}     //623-636
if (y >=637 && y <=649) {mvoltaje =(y-48.8333333)/16.66667;}     //637-649
if (y >=650 && y <=664) {mvoltaje =(y-53.7885124)/16.52893;}     //650-664
if (y >=665 && y <=674) {mvoltaje =(y-58.7868852)/16.393443;}    //665-674
if (y >=675 && y <=689) {mvoltaje =(y-63.0697674)/16.27907;}     //675-689
if (y >=690 && y <=703) {mvoltaje =(y-68.8387097)/16.12903;}     //690-703
if (y >=704 && y <=723) {mvoltaje =(y-74.6989066)/15.97981;}     //704-723
if (y >=724 && y <=727) {mvoltaje =(y-79.031746)/15.87302;}      //724-727
if (y >=728 && y <=755) {mvoltaje =(y-79.031746)/15.87302;}      //728-755
if (y >=756 && y <=770) {mvoltaje =(y-89.390625)/15.625;}        //756-770
if (y >=771 && y <=843) {mvoltaje =(y-94.5132457)/15.507215;}    //771-843
if (y >=844 && y <=854) {mvoltaje =(y-88.828125)/15.625;}        //844-854
if (y >=855 && y <=870) {mvoltaje =(y-84.8324607)/15.70681;}     //855-870

printf(lcd_putc,"mVolt: %3f", mvoltaje);
}


void main(void)
{   
   set_tris_a(0xFE);

   port_b_pullups(TRUE);   

   kbd_init();
   lcd_init();
   inicio();
   while(TRUE)
   {   
     dato = kbd_getc();
     
     if(dato)
     {
       cdato = dato -48;
       i++;
     
        if(i>2)
        {
         i= 0;

         if(dato!='C')
         { 
          temp();
          operaciones();
         }
        }
     }
   }
}

//lectura termopar
#include <18F4550.h>
#device adc= 10
#fuses HSPLL,PLL5,USBDIV,VREGEN,CPUDIV1,NOPBADEN,NOLVP,PROTECT,PUT,MCLR,WRTB

#use delay(clock=48000000)
#include <LCD.C>

#byte porta = 0x0F80
#byte portc = 0x0F82

int16 adato;
float temperatura,voltaje,x;

void presentacion()
{
   lcd_gotoxy(4,1);
   printf(lcd_putc,"LECTURA DE");
   lcd_gotoxy(2,2);
   printf(lcd_putc,"TERMOPAR TIPO J");
   delay_ms(500);
   printf(lcd_putc,"\f");
   lcd_gotoxy(8,1);
   printf(lcd_putc,"LS");
   lcd_gotoxy(4,2);
   printf(lcd_putc,"AUTOMATION");
   delay_ms(250);   
}

void main(void)
{     
   set_tris_a(0xFF);

   setup_adc(ADC_CLOCK_DIV_64);
   setup_adc_ports(AN0);
   set_adc_channel(0);
   enable_interrupts(GLOBAL);
   port_b_pullups(TRUE); 

   lcd_init();
   presentacion();
   while(TRUE)
   {
      delay_us(100);
      adato = read_adc();
      voltaje = (5.0*adato)/1024;
      x = ((voltaje/1000)*10000)+0.001172;   

      if (x >=0.000  && x <=0.049) {temperatura =0;}                           //000-000
      if (x >=0.050  && x <=0.303) {temperatura =0.01185771 +(19.7628458*x);}  //001-006
      if (x >=0.354  && x <=0.762) {temperatura =0.058823529+(19.6078431*x);}  //007-015
      if (x >=0.814  && x <=1.277) {temperatura =0.177105830+(19.4384400*x);}  //016-025
      if (x >=1.329  && x <=1.849) {temperatura =0.442307690+(19.2307700*x);}  //026-036
      if (x >=1.902  && x <=2.532) {temperatura =0.771428570+(19.0476200*x);}  //037-049
      if (x >=2.585  && x <=3.062) {temperatura =1.226415090+(18.8679200*x);}  //050-059
      if (x >=3.116  && x <=4.240) {temperatura =1.782918150+(18.6832700*x);}  //060-081
      if (x >=4.294  && x <=4.726) {temperatura =2.481481480+(18.5185200*x);}  //082-090
      if (x >=4.781  && x <=6.579) {temperatura =3.250834260+(18.3537300*x);}  //091-124
      if (x >=6.634  && x <=7.844) {temperatura =4.381818200+(18.1818200*x);}  //125-147
      if (x >=7.900  && x <=26.889){temperatura =5.301595700+(18.0630900*x);}  //148-491
      if (x >=26.945 && x <=27.953){temperatura =10.83928570+(17.8571400*x);}  //492-510
      if (x >=28.010 && x <=29.874){temperatura =15.11480700+(17.7038600*x);}  //511-544
      if (x >=29.931 && x <=30.444){temperatura =19.89473680+(17.5438600*x);}  //545-554
      if (x >=30.502 && x <=31.823){temperatura =23.92808480+(17.4110500*x);}  //555-578
      if (x >=31.881 && x <=32.577){temperatura =29.32758620+(17.2412800*x);}  //579-591
      if (x >=32.636 && x <=33.571){temperatura =33.52299470+(17.1123000*x);}  //592-608
      if (x >=33.630 && x <=34.397){temperatura =39.00000000+(16.9491500*x);}  //609-622
      if (x >=34.457 && x <=35.230){temperatura =43.51617080+(16.8175900*x);}  //623-636
      if (x >=35.290 && x <=36.010){temperatura =48.83333330+(16.6666700*x);}  //637-649
      if (x >=36.071 && x <=36.918){temperatura =53.78851240+(16.5289300*x);}  //650-664
      if (x >=36.979 && x <=37.528){temperatura =58.78688520+(16.3934430*x);}  //665-674
      if (x >=37.590 && x <=38.450){temperatura =63.06976740+(16.2790700*x);}  //675-689
      if (x >=38.512 && x <=39.318){temperatura =68.83870970+(16.1290300*x);}  //690-703
      if (x >=39.381 && x <=40.570){temperatura =74.69890660+(15.9798100*x);}  //704-723
      if (x >=40.633 && x <=40.822){temperatura =79.03174600+(15.8730200*x);}  //724-727
      if (x >=40.886 && x <=42.599){temperatura =83.56217160+(15.7618200*x);}  //728-755
      if (x >=42.663 && x <=43.559){temperatura =89.39062500+(15.6250000*x);}  //756-770
      if (x >=43.624 && x <=48.267){temperatura =94.51324570+(15.5072150*x);}  //771-843
      if (x >=48.331 && x <=48.971){temperatura =88.82812500+(15.6250000*x);}  //844-854
      if (x >=49.034 && x <=49.989){temperatura =84.83246070+(15.7068100*x);}  //855-870
     
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Temp = %f",temperatura);
     
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Volt = %02f", x);
   }
}

esos son los codigos pero no tengo alguna idea de juntar ambos para que sea solo uno

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como juntar dos programas para que funcione en un solo PIC18F4550
« Respuesta #4 en: 20 de Octubre de 2018, 16:49:40 »
Veo las mismas funciones pero invertidas, lo unico que se me ocurre que puede detenerte el programa es que la funcion kbd_getc() se quede hasta que detecte algo presionado. Sino, deberia funcionar..

Falto poner como los uniste