Autor Tema: Como puedo optimizar mi codigo? Nivel critico de ROM  (Leído 2803 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado lopb

  • PIC12
  • **
  • Mensajes: 77
    • contactos lopb
Como puedo optimizar mi codigo? Nivel critico de ROM
« en: 26 de Noviembre de 2010, 11:15:07 »
Hola,

        Estoy usando ccs y un 16f877, mi codigo es un poco extenso pero no se como optimizarlo y necesito optimizarlo ya que estoy en el nivel critico de rom y aun no lo termine.
Alguien tiene experiencia con el asunto?
Dejo el codigo.
Código: C
  1. #include <16F877A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES NODEBUG                  //No Debug mode for ICD
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES NOWRT                    //Program memory not write protected
  12.  
  13. #use delay(clock=20000000)
  14.  
  15. #include "HDM64GS12_scanbang.c"
  16. #include "graphics.c"
  17. #include "math.h"
  18. #include "24256.c"
  19. #include <string.h>
  20. /// para conteo de uptime
  21. #define CLOCKS_PER_SECOND  1000 ///contar cada tantos milisegundos (uptime)
  22. #include <stdlib.h>
  23. // fin de conteo uptime
  24. ///para la eeprom interna del pic
  25. #include "stdlib.h"
  26. #include "limits.h"
  27. typedef int8 INTEE;
  28. ///fin eeprom interna del pic
  29. //////para medir frecuencia
  30. #priority CCP1, TIMER1
  31. #define BytePtr(var, offset) (char *)((char*)&var + offset)
  32. #byte PIR1 = 0x0C
  33. #bit  TMR1IF = PIR1.0
  34. int8  gc_timer1_extension = 0;
  35. int8  gc_capture_flag = FALSE;
  36. int32 g32_ccp_delta;
  37. ///////fin para medir frecuencia
  38.  
  39. int m, p, l;
  40. int16 t = 0; //para el uptime variable de comparacion
  41. unsigned int16 minutos5 = 0; //para el uptime variable de valor en fraciones de 5 minutos
  42. int32 current_ccp_delta; //para la frecuencia
  43. float Values, frequency; //para el adc y frecuencia
  44. char Texto[30];
  45. short int dbutton4, dbutton5, dbutton6, dbutton7, start_hours;
  46.  
  47. ////prototipos
  48. float read_analog(int a);
  49. int menu(int p);
  50. float read_frequency(void);
  51. void write_eeprom16(int address1, int address2, int16 value);
  52. int16 read_eeprom16(int address1, int address2);
  53. void iniciar_eeprom(int e);
  54. ///////fin de los prototipos
  55.  
  56.  
  57. void welcome(void){
  58.  
  59.         delay_ms(50);
  60.         Texto = "Empresa";
  61.         glcd_text57(0, 0, Texto, 2, ON);
  62.         Texto = "ELECTRONIC";
  63.         glcd_text57(0, 20, Texto, 2, ON);
  64. }
  65. void Pantalla_0(){
  66.  
  67.         if (p == 1 || p == 2 || p == 3) {
  68.                 glcd_fillScreen(OFF);
  69.                 m = menu(0);
  70.         }
  71.         extern float Values;
  72.         extern float read_analog(int a);
  73.         extern char Texto[];
  74.  
  75.         Texto = "----TEMPERATURAS----";
  76.         glcd_text57(0, 0, Texto, 1, ON);
  77.         Texto = "Externa:";
  78.         glcd_text57(0, 10, Texto, 1, ON);
  79.         Texto = "Interna:";
  80.         glcd_text57(0, 20, Texto, 1, ON);
  81.         Texto = "Motor";
  82.         glcd_text57(0, 30, Texto, 1, ON);
  83.         Texto = "Alternador:";
  84.         glcd_text57(0, 40, Texto, 1, ON);
  85.  
  86.         Values =        read_analog(0) * (5.0 * 100.0 / 1024.0);
  87.         sprintf(Texto,"%3.1fC",Values);
  88.         l = strlen(Texto);
  89.         glcd_rect(80, 17, 127, 10, YES, OFF);
  90.         if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
  91.         if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
  92.         if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
  93.  
  94.         Values =        read_analog(1) * (5.0 * 100.0 / 1024.0);
  95.         sprintf(Texto,"%3.1fC",Values);
  96.         l = strlen(Texto);
  97.         glcd_rect(80, 27, 127, 20, YES, OFF);
  98.         if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
  99.         if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
  100.         if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
  101.  
  102.         Values =        read_analog(2) * (5.0 * 100.0 / 1024.0);
  103.         sprintf(Texto,"%3.1fC",Values);
  104.         l = strlen(Texto);
  105.         glcd_rect(80, 37, 127, 30, YES, OFF);
  106.         if (l == 4){glcd_text57(92, 30, Texto, 1, ON);}
  107.         if (l == 5){glcd_text57(86, 30, Texto, 1, ON);}
  108.         if (l == 6){glcd_text57(80, 30, Texto, 1, ON);}
  109.  
  110.         Values =        read_analog(3) * (5.0 * 100.0 / 1024.0);
  111.         sprintf(Texto,"%3.1fC",Values);
  112.         l = strlen(Texto);
  113.         glcd_rect(80, 47, 127, 40, YES, OFF);
  114.         if (l == 4){glcd_text57(92, 40, Texto, 1, ON);}
  115.         if (l == 5){glcd_text57(86, 40, Texto, 1, ON);}
  116.         if (l == 6){glcd_text57(80, 40, Texto, 1, ON);}
  117.  
  118.         p = 0;
  119. }
  120. void Pantalla_1(){
  121.  
  122.         if (p == 0 || p == 2 || p == 3) {
  123.                 glcd_fillScreen(OFF);
  124.                 m = menu(1);
  125.         }
  126.         extern float Values;
  127.         extern float read_analog(int a);
  128.         extern char Texto[];
  129.         extern float read_frequency(void);
  130.  
  131.         Texto = "----ESTADO GRUPO----";
  132.         glcd_text57(0, 0, Texto, 1, ON);
  133.         Texto = "VCA:";
  134.         glcd_text57(0, 10, Texto, 1, ON);
  135.         Texto = "Frecuencia:";
  136.         glcd_text57(0, 20, Texto, 1, ON);
  137.         Texto = "Monoxido:";
  138.         glcd_text57(0, 30, Texto, 1, ON);
  139.         Texto = "Horas uso:";
  140.         glcd_text57(0, 40, Texto, 1, ON);
  141.  
  142.         Values =        read_analog(4) * (260.0 / 1024.0);
  143.         sprintf(Texto,"%3.1fV",Values);
  144.         l = strlen(Texto);
  145.         glcd_rect(80, 17, 127, 10, YES, OFF);
  146.         if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
  147.         if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
  148.         if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
  149. ///adicional para saber si empezar a contar despues veo donde lo meto
  150. if (Values > 100) {start_hours = 1;} else {start_hours = 0;}
  151.  
  152. //      Values =        read_analog(5) * (5.0 * 100.0 / 1024.0);
  153.         Values = read_frequency();
  154.         sprintf(Texto,"%2.1fHz",Values);
  155.         l = strlen(Texto);
  156.         glcd_rect(80, 27, 127, 20, YES, OFF);
  157.         if (l == 5){glcd_text57(92, 20, Texto, 1, ON);}
  158.         if (l == 6){glcd_text57(86, 20, Texto, 1, ON);}
  159.         if (l == 7){glcd_text57(80, 20, Texto, 1, ON);}
  160.  
  161.         Values =        read_analog(5) * (5.0 * 100.0 / 1024.0);
  162.         sprintf(Texto,"%3.1fPPM",Values);
  163.         l = strlen(Texto);
  164.         glcd_rect(80, 37, 127, 30, YES, OFF);
  165.         if (l == 6){glcd_text57(92, 30, Texto, 1, ON);}
  166.         if (l == 7){glcd_text57(86, 30, Texto, 1, ON);}
  167.         if (l == 8){glcd_text57(80, 30, Texto, 1, ON);}
  168.  
  169.         //Values = minutos5;//  read_analog(7) * (5.0 * 100.0 / 1024.0);
  170.         sprintf(Texto,"%5LuHs",minutos5);
  171.         l = strlen(Texto);
  172.         glcd_rect(80, 47, 127, 40, YES, OFF);
  173.         if (l == 5){glcd_text57(92, 40, Texto, 1, ON);}
  174.         if (l == 6){glcd_text57(86, 40, Texto, 1, ON);}
  175.         if (l == 7){glcd_text57(80, 40, Texto, 1, ON);}
  176.  
  177.         p = 1;
  178. }
  179. void Pantalla_2(){
  180.  
  181.         if (p == 1 || p == 0 || p == 3) {
  182.         glcd_fillScreen(OFF);
  183.         m = menu(2);
  184.         }
  185.         extern float Values;
  186.         extern float read_analog(int a);
  187.         extern char Texto[];
  188.  
  189.         Texto = "-------MONITOR-------";
  190.         glcd_text57(0, 0, Texto, 1, ON);
  191.         Texto = "VCA Linea:";
  192.         glcd_text57(0, 10, Texto, 1, ON);
  193.         Texto = "Bateria:";
  194.         glcd_text57(0, 20, Texto, 1, ON);
  195.  
  196.         Values =        read_analog(6) * (260.0 / 1024.0);
  197.         sprintf(Texto,"%3.1fV",Values);
  198.         l = strlen(Texto);
  199.         glcd_rect(80, 17, 127, 10, YES, OFF);
  200.         if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
  201.         if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
  202.         if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
  203.        
  204.         Values =        read_analog(7) * (5.0 * 100.0 / 1024.0);
  205.         sprintf(Texto,"%3.1fV",Values);
  206.         l = strlen(Texto);
  207.         glcd_rect(80, 27, 127, 20, YES, OFF);
  208.         if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
  209.         if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
  210.         if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
  211.        
  212.         p = 2;
  213. }
  214. void Pantalla_3(){
  215.  
  216.         if (p == 1 || p == 0 || p == 2) {
  217.         glcd_fillScreen(OFF);
  218.         m = menu(3);
  219.         }
  220.         extern float Values;
  221.         extern float read_analog(int a);
  222.         extern char Texto[];
  223.  
  224.         Texto = "----CONFIGURACION----";
  225.         glcd_text57(0, 0, Texto, 1, ON);
  226.         Texto = "Temp.R. Motor:";
  227.         glcd_text57(0, 10, Texto, 1, ON);
  228.         Texto = "Temp.R. Alt.:";
  229.         glcd_text57(0, 20, Texto, 1, ON);
  230.  
  231.        
  232.         sprintf(Texto,"%3.1fV",Values);
  233.         l = strlen(Texto);
  234.         glcd_rect(80, 17, 127, 10, YES, OFF);
  235.         if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
  236.         if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
  237.         if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
  238.        
  239.         Values =        read_analog(7) * (5.0 * 100.0 / 1024.0);
  240.         sprintf(Texto,"%3.1fV",Values);
  241.         l = strlen(Texto);
  242.         glcd_rect(80, 27, 127, 20, YES, OFF);
  243.         if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
  244.         if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
  245.         if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
  246.        
  247.         p = 3;
  248. }
  249. int menu(int p){
  250. //extern char texto[];
  251. if (p == 0){
  252.         Texto = "TMP | GRP | MON | -- ";
  253.         glcd_rect(0, 54, 127, 63, YES, ON);
  254.         glcd_text57(1, 55, Texto, 1, OFF);
  255.         Texto = "TMP";
  256.         glcd_rect(1, 55, 26, 62, YES, OFF);
  257.         glcd_text57(1, 55, Texto, 1, ON);
  258.         return(0);
  259.         }
  260. if (p == 1){
  261.         Texto = "TMP | GRP | MON | -- ";
  262.         glcd_rect(0, 54, 127, 63, YES, ON);
  263.         glcd_text57(1, 55, Texto, 1, OFF);
  264.         Texto = "      GRP ";
  265.         glcd_rect(28, 55, 62, 62, YES, OFF);
  266.         glcd_text57(1, 55, Texto, 1, ON);
  267.         return(1);
  268.         }
  269. if (p == 2){
  270.         Texto = "TMP | GRP | MON | -- ";
  271.         glcd_rect(0, 54, 127, 63, YES, ON);
  272.         glcd_text57(1, 55, Texto, 1, OFF);
  273.         Texto = "            MON";
  274.         glcd_rect(64, 55, 98, 62, YES, OFF);
  275.         glcd_text57(1, 55, Texto, 1, ON);
  276.         return(2);
  277.         }      
  278. if (p == 3){
  279.         Texto = "UP  | DN  | SET | EX ";
  280.         glcd_rect(0, 54, 127, 63, YES, ON);
  281.         glcd_text57(1, 55, Texto, 1, OFF);
  282.         return(3);
  283.         }      
  284. }
  285. float read_analog(int a) ///ingresar switch
  286. {
  287.         float ADC_Value;
  288.  
  289. if (a == 0){
  290.         output_low(PIN_A1);
  291.         output_low(PIN_A2);
  292.         output_low(PIN_A3);
  293.         }
  294. if (a == 1){
  295.         output_high(PIN_A1);
  296.         output_low(PIN_A2);
  297.         output_low(PIN_A3);
  298.  
  299.         }
  300. if (a == 2){
  301.         output_low(PIN_A1);
  302.         output_high(PIN_A2);
  303.         output_low(PIN_A3);
  304.        
  305.         }
  306. if (a == 3){
  307.         output_high(PIN_A1);
  308.         output_high(PIN_A2);
  309.         output_low(PIN_A3);
  310.      
  311.         }
  312. if (a == 4){
  313.         output_low(PIN_A1);
  314.         output_low(PIN_A2);
  315.         output_high(PIN_A3);
  316.      
  317.         }
  318. if (a == 5){
  319.         output_high(PIN_A1);
  320.         output_low(PIN_A2);
  321.         output_high(PIN_A3);
  322.      
  323.         }
  324. if (a == 6){
  325.         output_low(PIN_A1);
  326.         output_high(PIN_A2);
  327.         output_high(PIN_A3);
  328.      
  329.         }
  330. if (a == 7){
  331.         output_high(PIN_A1);
  332.         output_high(PIN_A2);
  333.         output_high(PIN_A3);
  334.         }
  335.        
  336.         delay_ms(100);
  337.         set_adc_channel (0); //Elige canal a medir RA0
  338.         delay_us (20);
  339.         ADC_Value=read_adc(); //Capturamos señal analógica que entra por el canal previamente seleccionado (RA0)
  340.  
  341.              
  342. return(ADC_Value);
  343. }
  344. void iniciar_eeprom(int e){ // funcion para limpiar la eeprom si es la primera vez que se graba el pic  
  345. #rom 0x2100={1,2,3,4} //eeprom graba en la posicion 0123 los valores 1234
  346.         if (read_eeprom(4) != 1 || e == 1){
  347.                 write_eeprom(4,1);
  348.                 write_eeprom(5,0);
  349.                 write_eeprom(6,0);
  350.         }
  351. }
  352. void write_eeprom16(int address1, int address2, int16 value) //escribe sobre la eeprom ints de 16 bits
  353. {
  354.    int8 lowerhalf = 0;
  355.    int8 upperhalf = 0;
  356.  
  357.    lowerhalf = make8(value,0);
  358.    write_eeprom(address1,lowerhalf);
  359.    upperhalf = make8(value,1);
  360.    write_eeprom(address2,upperhalf);
  361. }
  362.  
  363. int16 read_eeprom16(int address1, int address2) //lee sobre la eeprom ints de 16 bits
  364. {
  365.    int16 finalvalue = 0;
  366.    int8 lowerhalf = 0;
  367.    int8 upperhalf = 0;
  368.  
  369.    upperhalf = read_eeprom(address2);
  370.    lowerhalf = read_eeprom(address1);
  371.  
  372.    finalvalue = make16(upperhalf,lowerhalf);
  373.  
  374.    return finalvalue;
  375. }
  376.  
  377. //funcion para medir frecuencia:
  378. float read_frequency(){
  379. if(gc_capture_flag == TRUE)
  380.      {
  381.       //disable_interrupts(GLOBAL);
  382.       current_ccp_delta = g32_ccp_delta;;
  383.       enable_interrupts(GLOBAL);
  384.  
  385.       frequency =  (5000000L / (float)current_ccp_delta);
  386.         return(frequency);
  387.       gc_capture_flag = FALSE;
  388.      }
  389.   else
  390.     {
  391.         return(0.0);
  392.     }
  393.  
  394.   delay_ms(500);
  395. }
  396. //////////////Codigo obtenido de ccs forums, para medir frecuencia
  397. #int_timer1
  398. void timer1_isr(void)
  399. {
  400. gc_timer1_extension++;
  401. }
  402.  
  403. //------------------------------------------------------
  404. ////codigo para contar segundos o segun se defina en clocks_per_second obtenido de ccs
  405.  
  406. #int_timer2
  407. void updateClock()
  408. {
  409.  #if CLOCKS_PER_SECOND >= 0x10000
  410.    static int32 t;
  411.  #elif CLOCKS_PER_SECOND >= 0x100
  412.    static int16 t;
  413.  #else
  414.    static int8 t;
  415.  #endif
  416.    
  417.    t++;
  418.        
  419.    if(t >= CLOCKS_PER_SECOND)
  420.    {
  421.       t = 0;
  422.                 if (start_hours){minutos5++;}  
  423.         }
  424.  
  425. }
  426. //////////// fin de codigo ccs
  427.  
  428. #int_ccp1
  429. void ccp1_isr(void)
  430. {
  431. char timer_ext_copy;
  432. int32 current_ccp;
  433. static int32 old_ccp = 0;
  434.  
  435. gc_capture_flag = TRUE;        
  436.  
  437. current_ccp = (int32)CCP_1;    
  438.  
  439. // Get local copy of the timer ext.
  440. timer_ext_copy = gc_timer1_extension;
  441.  
  442.  
  443. if(TMR1IF)
  444.   {
  445.    if(*BytePtr(current_ccp, 1) < 2)  // Was CCP captured after Timer1 wrapped?
  446.       timer_ext_copy++;  // If so, inc the copy of the timer ext.
  447.  
  448.    // Since we know a timer interrupt is pending, let's just
  449.    // handle it here and now.  That saves a little load off
  450.    // the processor.
  451.    gc_timer1_extension++;  // Increment the real timer extension
  452.    TMR1IF = 0;     // Then clear the Timer1 interrupt
  453.   }
  454.  
  455. // Insert the timer extension into the proper place in the 32-bit
  456. // CCP value.
  457. // ie.,  Insert it into location "EE" as follows: 0x00EEnnnn
  458. // (nnnn = the CCP).
  459. *BytePtr(current_ccp, 2) = timer_ext_copy;
  460.  
  461. g32_ccp_delta = (current_ccp > old_ccp) ? current_ccp - old_ccp : current_ccp + (0x1000000 - old_ccp);
  462.  
  463. // Save the current ccp value for next time.
  464. old_ccp = current_ccp;
  465.  
  466. }
  467. ///////////fin de codigo ccs para medir frecuencia. Otras cosas se incluyen en MAIN
  468.  
  469. #int_rb
  470. void test_detect_rb_change() {
  471.    set_tris_b(0xF0);
  472.         if (input(PIN_B4)) {dbutton4=1;}
  473.         if (input(PIN_B5)) {dbutton5=1;}
  474.         if (input(PIN_B6)) {dbutton6=1;}
  475.         if (input(PIN_B7)) {dbutton7=1;}
  476.         if (!input(PIN_B7))     {dbutton7=0;}
  477.   }
  478.  
  479. void clear_delta() {
  480.    dbutton4=0;
  481.    dbutton5=0;
  482.    dbutton6=0;
  483.    dbutton7=0;
  484. }
  485.  
  486. void main(void)
  487. {
  488.  
  489.         clear_delta();
  490.         iniciar_eeprom(0);
  491.  
  492.         setup_timer_2(T2_DIV_BY_4,250,5);
  493.         enable_interrupts(INT_TIMER2);
  494.    
  495.         enable_interrupts(INT_RB);
  496.    enable_interrupts(GLOBAL);                                  
  497.  
  498.         glcd_init(ON);   // iniciamos la lcd
  499.         glcd_fillScreen(OFF); //LIMPIAMOS LA PANTALLA
  500.         delay_ms(200);
  501.         welcome();
  502.         delay_ms(2000);
  503.         glcd_fillScreen(OFF); //LIMPIAMOS LA PANTALLA
  504.    
  505.         setup_adc_ports(RA0_ANALOG);
  506.    setup_adc(ADC_CLOCK_INTERNAL);
  507.    setup_spi(SPI_SS_DISABLED);
  508.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  509.    // setup_timer_1(T1_DISABLED);
  510.    //setup_timer_2(T2_DISABLED,0,1);
  511.    // setup_ccp1(CCP_OFF);
  512.    setup_comparator(NC_NC_NC_NC);
  513.    setup_vref(FALSE);
  514. ////////////codigo para medir frecuencia, depurar de ccs forums
  515.  
  516.  
  517. set_timer1(0);            
  518. setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    
  519.  
  520. setup_ccp1(CCP_CAPTURE_RE);    
  521.  
  522. // Enable interrupts.
  523. clear_interrupt(INT_TIMER1);
  524. enable_interrupts(INT_TIMER1);
  525.  
  526. clear_interrupt(INT_CCP1);
  527. enable_interrupts(INT_CCP1);
  528.  
  529. enable_interrupts(GLOBAL);
  530. /////////////fin para medir frecuencia de ccs  
  531.  
  532.         minutos5 = read_eeprom16(5,6); //asigna al intervalo de 5 minutos el ultimo valor que se guardo en la eeprom
  533.  
  534.         set_tris_a(0xEF);
  535.    m = menu(0);
  536.         while (TRUE)
  537.    {
  538.         if(dbutton4) {
  539.                         if (!dbutton7){
  540.                                 if (m != 3){
  541.                                         m = menu(0); dbutton4=0;
  542.                                 }
  543.                         }
  544.                        
  545.         }
  546.         if(dbutton5) {
  547.                         if (m != 3){
  548.                                 m = menu(1); dbutton5=0;
  549.                         }
  550.         }
  551.         if(dbutton6) {
  552.                         if (m != 3){
  553.                                 m = menu(2); dbutton6=0;
  554.                         }
  555.         }
  556.         if(dbutton7) {
  557.                 if (m == 3){m = menu(0);}
  558.                 if (dbutton4){
  559.                                 m = menu(3);
  560.                                 dbutton4=0;
  561.                                 dbutton7=0;
  562.                 }                              
  563.         }
  564.                                
  565.        
  566.         delay_ms(500);
  567.         if (m == 0){
  568.         Pantalla_0();
  569.         }
  570.         if (m == 1){
  571.         Pantalla_1();
  572.         }
  573.         if (m == 2){
  574.         Pantalla_2();
  575.         }
  576.         if (m == 3){
  577.         Pantalla_3();
  578.         }
  579.  
  580.        
  581.         if ((minutos5 - t ) == 5){ /// este if debe estar dentro del rango de refresco de el while superior. debido a que tiene que coincidir con el minuto x (ver diferencia minutos5-m) [graba cada 5 minutos]
  582.                 write_eeprom16(5,6,minutos5);
  583.                 delay_ms(1000);
  584.                 if (read_eeprom16(5,6) != minutos5){
  585.                         iniciar_eeprom(1);
  586.                         write_eeprom16(5,6,minutos5);
  587.                 }
  588.                 t = minutos5;
  589.         }
  590.         }
  591.  
  592.                
  593. }
gracias
« Última modificación: 26 de Noviembre de 2010, 11:21:19 por lopb »

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #1 en: 26 de Noviembre de 2010, 15:30:36 »
Si puedes agregar una Eeprom externa puedes grabar en ella los textos a emitir por el glcd,

tambien puedes probar esto.
Citar
#
#int_rb
#
void test_detect_rb_change() {
#
  set_tris_b(0xF0);//suponiendo que te interese recibir no guardar el estado del botón después de pulsado,en vez de todo esto, puedes definir dbutton 4-7 como bites de un byte, y asignar el valor del puerto
// B directamente a ese byte y ya esta, por ejemplo pulsas el botón 4 por ejemplo , lees el port b y obtienes 0001xxxx,
// lo asignas a una variable portB_tmp=input_b();                               ///xxxx estas no te interesan para nada.
// defines #define dbuton4=portB_tmp.4;
// y ya puedes usar dbuton4 para lo que necesites.
// si quieres borrar lo que contiene dbuton4=0;//
//#
//if (input(PIN_B4)) {dbutton4=1;}
//#
//if (input(PIN_B5)) {dbutton5=1;}
//#
//if (input(PIN_B6)) {dbutton6=1;}
//#
//if (input(PIN_B7)) {dbutton7=1;}
//#
//if (!input(PIN_B7)) {dbutton7=0;}
//#
portB_tmp=input_b();
 }
#
/////////////////////////////////
#
void clear_delta() {// todo esto lo simplificas a
//#
//  dbutton4=0;
//#
 // dbutton5=0;
//#
//  dbutton6=0;
//#
//  dbutton7=0;
//#
portBtmp=0;//
}



 igual para el menú que tienes te funciona bien, pues al pulsar una tecla y después la otra, te volverá a entrar a leer y te asignara bien los bytes, para ahorrar ram , las variables que solo puedan ser TRUE o FALSE, declara las como int1;

Espero que te sirva y no haya propuesto ninguna barbaridad.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #2 en: 26 de Noviembre de 2010, 15:52:45 »
O usar un 18F y te relajas  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #3 en: 27 de Noviembre de 2010, 06:21:38 »
Puedes pasar 2 semanas modificando y conseguiras principalmente 3 cosas:
    1 Hacerlo más difícil de entender y ampliar.
    2 Añadir unos cuantos bugs.
    3 Reducir el volumen de tu código en un 2%(2% es orientativo, pero lo que más ocupa serán las librerías y estas siguen igual).

En lugar de optimizar todo el código escrito, intenta algunas de estas cosas, que son más fáciles:
    1 Juega con las opciones de optimización del compilador y del linker a ver que puedes conseguir.
    2 Elimina las funciones sprintf o printf que siempre he visto que ocupan bastante.( la verdad, esto es optimizar el codigo)
    2 prueba a escribir tu propia funcion strlen, que es muy sencilla y quizas ocupe menos que la que usas.
    3 Si es posible, elimina los calculos en coma flotante. ( la verdad, esto tambien es optimizar el codigo)
    4 Si tu diseño lo permite(parece que ya usas una EEPROM 24256), coloca el array de la GLCD que contiene el texto en una EEPROM externa.
    5 Si nada de lo anterior sirve, antes de pelearte con tu propio código, mira a ver si puedes trabajar con otro micro de la familia PIC16 o de una familia superior.
    6 puedes sustituir:
Código: C
  1. l = strlen(Texto);
  2.         glcd_rect(80, 27, 127, 20, YES, OFF);
  3.         if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
  4.         if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
  5.         if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
por
Código: C
  1. l = strlen(Texto);
  2.         glcd_rect(80, 27, 127, 20, YES, OFF);
  3.         glcd_text57( 92-(l-4)*6 , 20, Texto, 1, ON);
pero es lo que te digo, ahorras muy poco, y es fácil cometer errores...


Saludos

Desconectado lopb

  • PIC12
  • **
  • Mensajes: 77
    • contactos lopb
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #4 en: 06 de Diciembre de 2010, 15:46:57 »
Muy buenas optimizaciones, gracias.
= Tengo mucho mas codigo que meter y no va a entrar en C. Asi que cambie el micro por un 18f877 como dijo suky.
Aun no probe a ver si anda igual, el unico error que obtuve por ahora es seteando vref de los conversores analogicos... ahora lo pruebo, pero me adelanto, saben como setear el vref para que sea vss y vdd en los conversores A/D?
gracias denuevo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #5 en: 06 de Diciembre de 2010, 16:01:46 »
Hay que agregar el setup_adc_ports(....|VSS_VDD);

En el .h del microcontrolador vas a encontrar las opciones para cada caso.


saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #6 en: 06 de Diciembre de 2010, 18:31:54 »
También puedes utilizar el Wizard de Proyectos del CCS.  Es de gran ayuda.

Saludos!

Desconectado lopb

  • PIC12
  • **
  • Mensajes: 77
    • contactos lopb
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #7 en: 07 de Diciembre de 2010, 15:20:06 »
Hay que agregar el setup_adc_ports(....|VSS_VDD);

En el .h del microcontrolador vas a encontrar las opciones para cada caso.


saludos!
Suky, en el header esta esto:


// Constants used in SETUP_ADC_PORTS() are:
#define NO_ANALOGS                           7    // None
#define ALL_ANALOG                           0    // A0 A1 A2 A3 A5 E0 E1 E2
#define AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1    // A0 A1 A2 A5 E0 E1 E2 VRefh=A3     
#define AN0_AN1_AN2_AN3_AN4                  2    // A0 A1 A2 A3 A5         
#define AN0_AN1_AN2_AN4_VSS_VREF             3    // A0 A1 A2 A4 VRefh=A3             
#define AN0_AN1_AN3                          4    // A0 A1 A3
#define AN0_AN1_VSS_VREF                     5    // A0 A1 VRefh=A3
#define AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08    // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2     
#define AN0_AN1_AN2_AN3_AN4_AN5           0x09    // A0 A1 A2 A3 A5 E0       
#define AN0_AN1_AN2_AN4_AN5_VSS_VREF      0x0A    // A0 A1 A2 A5 E0 VRefh=A3           
#define AN0_AN1_AN4_AN5_VREF_VREF         0x0B    // A0 A1 A5 E0 VRefh=A3 VRefl=A2           
#define AN0_AN1_AN4_VREF_VREF             0x0C    // A0 A1 A4 VRefh=A3 VRefl=A2             
#define AN0_AN1_VREF_VREF                 0x0D    // A0 A1 VRefh=A3 VRefl=A2
#define AN0                               0x0E    // A0
#define AN0_VREF_VREF                     0x0F    // A0 VRefh=A3 VRefl=A2
#define ANALOG_RA3_REF         0x1         //!old only provided for compatibility
#define A_ANALOG               0x2         //!old only provided for compatibility 
#define A_ANALOG_RA3_REF       0x3         //!old only provided for compatibility 
#define RA0_RA1_RA3_ANALOG     0x4         //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_REF 0x5         //!old only provided for compatibility
#define ANALOG_RA3_RA2_REF              0x8   //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2              0x9   //!old only provided for compatibility 
#define ANALOG_NOT_RE1_RE2_REF_RA3      0xA   //!old only provided for compatibility 
#define ANALOG_NOT_RE1_RE2_REF_RA3_RA2  0xB   //!old only provided for compatibility 
#define A_ANALOG_RA3_RA2_REF            0xC   //!old only provided for compatibility 
#define RA0_RA1_ANALOG_RA3_RA2_REF      0xD   //!old only provided for compatibility
#define RA0_ANALOG                      0xE   //!old only provided for compatibility
#define RA0_ANALOG_RA3_RA2_REF          0xF   //!old only provided for compatibility

Estoy poniendo asi:
   setup_adc_ports(RA0_ANALOG|VSS_VDD);
sin embargo, me da un error al compilar:
*** Error 12 "main.c" Line 678(28,35): Undefined identifier   VSS_VDD
voy a buscar en google, si sabes algo avisame.
salu2 y gracias

Desconectado lopb

  • PIC12
  • **
  • Mensajes: 77
    • contactos lopb
Re: Como puedo optimizar mi codigo? Nivel critico de ROM
« Respuesta #8 en: 07 de Diciembre de 2010, 16:26:17 »
hola, el comparador eanalogico esta andando. Simplemente le puse an0 y andubo.
   setup_adc_ports(AN0);
gracias, saludos


 

anything