TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: amospi en 16 de Mayo de 2008, 19:14:26

Título: Problemas con C
Publicado por: amospi en 16 de Mayo de 2008, 19:14:26
Soy pricipiente en cuanto a programaciòn en C y tengo un problema con mi segundo programa. en el siguiente programa la sentencia IF no me la ejecuta, siempre me ejecuta lo que hay despues del IF, sin importar si el IF se cumple o no, siempre me envìa al Pc lo que hay en printf,  les coloco el programaa

Código: C
  1. #include "C:\Archivos de programa\PICC\estimulador.h"
  2. char n=' ';
  3. int cont= 0;
  4. unsigned char x=0;
  5. int i;
  6. void main()
  7. {
  8.  
  9.    
  10.  
  11. setup_adc_ports(NO_ANALOGS);
  12. setup_adc(ADC_OFF);
  13. setup_spi(FALSE);
  14.    
  15.  
  16. setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
  17.    
  18.  
  19. setup_timer_1(T1_DISABLED);
  20.    
  21.  
  22. setup_timer_2(T2_DISABLED,0,1);
  23.  
  24.    set_tris_c(0);
  25.  
  26.    for(;
  27.  {
  28.    
  29.       if (input (pin_b0))
  30.          
  31.       printf("\r\n proyecto sac \r\n");    
  32.      getc()
  33.        else
  34.          {
  35.           output_high (pin_c0);
  36.           delay_ms (2000);
  37.           output_low (pin_c0);
  38.           delay_ms (2000);
  39.          }
  40.          
  41.        
  42.    }
  43.  
  44. }

Editado por Nocturno: para que el código se vea bien
Título: Re: Problemas con C
Publicado por: firepic en 16 de Mayo de 2008, 19:42:25
Saludos!
Bueno creo que en este parte:

   for(;;)
 {
   
      if (input (pin_b0))
         
      printf("\r\n proyecto sac \r\n");     
     getc()

       else
         {
          output_high (pin_c0);
          delay_ms (2000);
          output_low (pin_c0);
          delay_ms (2000);
         }
         
       
   }

}
Como estás ejecutando dos sentencias antes del else, deberías colocarlas entre llaves no?
Así:

      if (input (pin_b0))
      {   
           printf("\r\n proyecto sac \r\n");     
           getc()
       }
       else
      {
          output_high (pin_c0);
          delay_ms (2000);
          output_low (pin_c0);
          delay_ms (2000);
       }

Y por otro lado, deberías colocar: #use standard_io (B) en la cabecera... para que configure apropiadamente RB0 como una entrada...
Solo son sugerencias...
Pruebalo así a ver...
Bueno, seguramente algún experto ya te dará una mejor opinión...
Nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: Gonzalo_BlackHawk en 16 de Mayo de 2008, 21:49:10
Hola chicos, traten de colocar el código utilizando la herramienta code, sino el código se tergiversa y se agregan esos dibujitos reemplazando el código (Pues creo que toda via los pics no soportan variables del tipo smileys  :D :D).

amospi, si no colocas ninguna declaración #use xxx_io el compilador asume en forma predeterminada que estas utilizando standard_io, por lo tanto no necesitas la instruccion set_tris(c). La función input() por si sola configura el registro tris para que el puerto a leer sea entrada, salvo que este utilizando #use fast_io, asi que no te preocupes por configurar los puertos.

Con respecto a lo de la sentencia If, el consejo de firepic es el correcto.

Nos vemos.
Título: Re: Problemas con C
Publicado por: firepic en 16 de Mayo de 2008, 21:54:41
Ya me imaginaba que el experto serías tú Gonzalo...  :D
Gracias por la aclaratoria... tenía duda sobre lo del standard_io ya me estaba volviendo una galleta con eso... pero ya entiendo entonces que si uno no especifica nada, el compilador asume standard_io, y no hay que definir los tris...
Bueno qué te diré? "Aprendiendo con Gonzalo"   :P
Ya sabes amospi, olvida lo que te dije sobre colocar standard_io...  :D

Ok nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: amospi en 16 de Mayo de 2008, 22:47:43
Gracias por sus oportunas respuestas, disculpen lo del dibujito, se me metió accidentalmente

Hice lo que me indicaron y  cuando compilo me saca un error (a numeric expression must appear here) donde está la instrucción else . no se realmente que es lo que pasa ¡¡¡¡
Título: Re: Problemas con C
Publicado por: firepic en 16 de Mayo de 2008, 23:04:43
Podrías cargar el archivo "estimulador.h" a ver si lo compilo por aquí y veo en qué te puedo ayudar?
Título: Re: Problemas con C
Publicado por: firepic en 16 de Mayo de 2008, 23:06:36
Te adelanto que cuando aparece ese error: "a numeric expression must appear here"... generalmente se trata de alguna variable u otra configuración que no has definido correctamente...
No te preocupes, no es nada del otro mundo...
Ok nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: poseidon20 en 17 de Mayo de 2008, 01:02:12
para usar delays, deberias poner #delay=xxMhz(de acuerdo al cristal ausar) algo asi, depues de declarar el tipo de procesador que usas, revisa la ayuda del CCS te sera de gran ayuda como lo es para mi :D
Título: Re: Problemas con C
Publicado por: firepic en 17 de Mayo de 2008, 01:08:50
Si es verdad amigo poseidon!   :)

Amospi, debes colocar en la cabecera la sentencia:
#use delay (clock=4000000)
Eso en caso de que tu cristal sea de 4MHz... si no, como te dice poseidon, colocas la velocidad de tu cristal...
Revisa bien eso amospi, tal vez ese sea el error...

Ok nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: Nocturno en 17 de Mayo de 2008, 01:31:32
Yo he probado a compilar el código y no me ha dado ese error, lo único es que te falta un ";" detrás del getc() pero si se lo pones no debería fallar.
Si sigue fallando sube tu programa y lo revisamos:
Código: C
  1. for(;;) {
  2.       if (input (pin_b0)) {
  3.          printf("\r\n proyecto sac \r\n");    
  4.          getc();
  5.          }
  6.        else
  7.          {
  8.           output_high (pin_c0);
  9.           delay_ms (2000);
  10.           output_low (pin_c0);
  11.           delay_ms (2000);
  12.          }
  13.    }
  14. }
Título: Re: Problemas con C
Publicado por: firepic en 17 de Mayo de 2008, 09:57:53
Buen ojo nocturno!
Algo tan elemental y parece que ninguno nos dimos cuenta, pues nadie lo mencionó...  :D
Pues eso era todo amospi, problema resuelto!
Nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: amospi en 19 de Mayo de 2008, 18:12:24
Perdonen la burrada, pero cuando uno es nuevo en esto, le pasan estas cosas;  De todas maneras, agregandole
el ; tampoco me compila, me sigue mostrando el error en la instrucción else (A numeric expression must appear here)
Les pego el programa que estoy compilando para que lo miren.  Gracias por su oportuna atención¡¡¡

#include "C:\Archivos de programa\PICC\C_virtual2.h"
#use delay (clock=4000000)
#use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,bits=8)
char n='a';
int cont= 0;
unsigned char ocupado=0;
unsigned char casos=0;
char digit=0;
unsigned char contador=20;
unsigned flag= 0;
//set_tris_c(0);


void main()
{
   int recv;
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   for (;;)
   {


        if(input (pin_b0));
            {
            printf("Presione N o S.\n\r");
            getc();

             }

         else
             {
              output_high(pin_c0);
              delay_ms(500);
              output_low(pin_c0);
              delay_ms(500);
              }

      }
       
}
Título: Re: Problemas con C
Publicado por: firepic en 19 de Mayo de 2008, 19:59:33
Saludos!

Copio nuevamente tu código:

Código: C
  1. #include "C:\Archivos de programa\PICC\C_virtual2.h"
  2. #use delay (clock=4000000)
  3. #use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,bits=8)
  4. char n='a';
  5. int cont= 0;
  6. unsigned char ocupado=0;
  7. unsigned char casos=0;
  8. char digit=0;
  9. unsigned char contador=20;
  10. unsigned flag= 0;
  11. //set_tris_c(0);
  12.  
  13.  
  14. void main()
  15. {
  16.    int recv;
  17.    setup_adc_ports(NO_ANALOGS);
  18.    setup_adc(ADC_OFF);
  19.    setup_spi(FALSE);
  20.    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
  21.    setup_timer_1(T1_DISABLED);
  22.    setup_timer_2(T2_DISABLED,0,1);
  23.  
  24.    for (;Wink
  25.    {
  26.  
  27.  
  28.         if(input (pin_b0));
  29.             {
  30.             printf("Presione N o S.\n\r");
  31.             getc();
  32.  
  33.              }
  34.  
  35.          else
  36.              {
  37.               output_high(pin_c0);
  38.               delay_ms(500);
  39.               output_low(pin_c0);
  40.               delay_ms(500);
  41.               }
  42.  
  43.       }
  44.        
  45. }

En la línea 28 tienes un punto y coma después del if... ese es el problema...
Lo compilé de esta forma y no tuve problemas:

Código: C
  1. #include <16f876.h>
  2. #use delay (clock=4000000)
  3. #use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,bits=8)
  4. char n='a';
  5. int cont= 0;
  6. unsigned char ocupado=0;
  7. unsigned char casos=0;
  8. char digit=0;
  9. unsigned char contador=20;
  10. unsigned flag= 0;
  11.  
  12. void main()
  13. {
  14.    int recv;
  15.    setup_adc_ports(NO_ANALOGS);
  16.    setup_adc(ADC_OFF);
  17.    setup_spi(FALSE);
  18.    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
  19.    setup_timer_1(T1_DISABLED);
  20.    setup_timer_2(T2_DISABLED,0,1);
  21.    for (;;)
  22.    {
  23.                 if(input(pin_b0))
  24.         {
  25.                         printf("Presione N o S.\n\r");
  26.             getc();
  27.         }
  28.          else
  29.                 {
  30.                         output_high(pin_c0);
  31.                         delay_ms(500);
  32.             output_low(pin_c0);
  33.             delay_ms(500);
  34.                 }
  35.         }
  36. }
  37.  
  38. Ok nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: amospi en 20 de Mayo de 2008, 00:27:29
Correcto firepic esa era la falla, gracias por su colaboración. Les cuento que hace mucho tiempo que
  programo en assembler, desafortunadamente me demoré demasiado para cambiarme al C; Ahora estoy decidido a hacerlo;
  empecé por pasar mis programas más sencillos de assembler a lenguaje C, pero este me está dando en la cabeza,
  les cuento en que consiste:
 
  Inicialmente debe poner en UNO los pines RC0 y RC1.
  despues
  Mientras el pin RB0 permanezca en 1 no pasa nada,
  si pasa a cero durante aproxi...SIETE segundos,
  debe poner en CERO el pin RC1 durante cinco segundos, volverlo a UNO y retornar a inicio.
 
  Hasta aquí el programa me funciona muy bien, pero la dificultad aparece cuando debo agregarle lo
  siguiente:

  Durante el retardo de aproxi...SIETE segundos si RB0 retorna a UNO,
  inmediatamente debe poner el pin RC0 en cero por medio segundo, ponerlo nuevamente a UNO y retonar a inicio o
  si durante este mismo retardo, RB1 pasa al estado CERO, inmediatamente debe irse para inicio
  teniendo siempre presente de colocar nuevamente RC0 y RC1 en UNO.
 
  Si durate el retardo de cinco segundos RB0 cambia nuevamente al estado UNO, inmediatamente debe colocar
  RC0 en CERO por medio segundo, retornarlo nuevamente a UNO e irse para inicio.
 
  No se si me hice entender. De todas maneras, el programa que realicé en C me hace algunas cosas, pero no todo,
  estos retardos condicionados, no se como hacerlos en C, ahí les pego el programa si me indican que es lo que le
  falta o cómo debo hacerlo.  Si es necesario también les pego el programa en assembler, que si me funciona bien.

#include "C:\Archivos de programa\PICC\hopper.h"
char n=' ';
int cont= 0;
unsigned char x=0;
int i;
int j;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   output_high (pin_c0);
   output_high (pin_c1);

   for(;;)
   {
    if (!input (pin_b0))
    {
       for(i=0;i<100;i++)
       {
          delay_ms(500);
          if (input (pin_b0))
            {
             output_low (pin_c0);
             delay_ms (2000);
             output_high (pin_c0);
             break;
            }
          if (!input (pin_b1))
          break;
        }

        output_low (pin_c0);
        for(i=0;i<9;i++)
        {
        if(input (pin_b0))
          {
           output_low (pin_c1);
           delay_ms (2000);
           output_high (pin_c1);
           break;
          }
          delay_ms(1000);
          output_high(pin_c0);
          break;
        }
     }
  }
}
Título: Re: Problemas con C
Publicado por: firepic en 20 de Mayo de 2008, 01:17:19
Saludos amospi!  :-)
Bueno dos cosas:

1- Recuerda lo que te mencionó el dr. Gonzalo:
Hola chicos, traten de colocar el código utilizando la herramienta code, sino el código se tergiversa y se agregan esos dibujitos reemplazando el código (Pues creo que toda via los pics no soportan variables del tipo smileys  :D :D).
Esa herramienta "code" está, cuando escribes los mensajes,  en la parte superior izquierda, en la franja arriba de los smyles... representada por un "#"... le das allí y te aparecerán las palabras code y /code entre corchetes, entre esas dos palabras escribe el código para que no salgan los smyles.
Bueno es un detalle pero trata de tenerlo presente para la próxima vez que insertes código en tu mensaje.

2- De la forma como estás contando el tiempo, usando "delay_ms", no sé si sea la más apropiada. Porque así el programa se detendrá por el tiempo que le insertes al delay, y no estará evaluando el estado del pin sino hasta que termine de ejecutarse el delay. Por ejemplo, si evalúas el estado de RB0 y está en alto, pero ejecutas el delay_ms(500)... si el estado pasa a 0 y vuelve a 1 en ese tiempo, el pic ni se enterará... ahora bien, todo depende de qué es lo que tienes conectado a RB0 y si eso que tienes conectado no variará tan rápido de manera que lo puedas detectar de 500ms en 500ms (como lo haces usando el for). Si es así, me parece excelente la manera como lo estás haciendo.

En lo que tenga un chance trataré de compilar tu código y simularlo en el proteus, pero sería bueno que nos dijeras de antemano qué parte es la que no funciona. Además, creo que aún no nos has especificado qué pic es el que estás usando. También sería bueno que lo hicieras.
Por otro lado, hay muchas definiciones que no veo en el código, como los fuses, #uses, etc... no sé si las tienes en ese archivo hopper.h; en caso de ser así podrías también incluir ese archivo para compilarlo todo completo.

Ok es todo por ahora, nos leemos!
Felicidades por tus progresos y sigue adelante!  :mrgreen:
Título: Re: Problemas con C
Publicado por: amospi en 23 de Mayo de 2008, 15:21:08
Código: [Seleccionar]
#include "C:\Archivos de programa\PICC\hopper.h"
char n=' ';
int cont= 0;
unsigned char x=0;
unsigned short i;
int j;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   output_high (pin_c0);
   output_high (pin_c1);
iter:
   for(;;)

   {
    if (!input (pin_b0))
     {
       for(i=0;i<700;i++)
        {
          delay_ms(10);
          if (input (pin_b0))
            {
              output_low (pin_c1);
              delay_ms (400);
              output_high (pin_c1);
              i==0;
              goto iter;
             }

           if (!input (pin_b1))
             {
              i==0;
              goto iter;
             }
         }
         i==0;
         output_low (pin_c0);
         for(i=0;i<=1000;i++)
         {
          delay_ms(10);
         if(input (pin_b0))
           {
            output_low (pin_c1);
            delay_ms (2000);
            output_high (pin_c1);
            output_high (pin_c0);
            i==0;
            break;
           }
         }
        output_high(pin_c0);
       }
     }
 }

Este es el archivo.H

Código: [Seleccionar]
#include <16F873.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,RC, NOPUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT, NODEBUG
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,bits=8)
El PIC que estoy utilizando es el 16F873A; respecto a los retardos inicialmente los hice muy largos para facilitar las pruebas en mi tarjeta simuladora, ya están ajustados.

Este es el programa final, no le encuentro nada malo, el problema es que no me realiza la segunda parte del programa, es decir, no me ingresa al último for; al segundo for si me ingresa pero no se sale, únicamente cuando se da uno de los if.  Los goto que estoy utilizando me dicen que no son recomendables, pero no encuentro otra forma de irme para inicio.  Gracias FIREPIC por tus recomendaciones
Título: Re: Problemas con C
Publicado por: mandoanaiz en 03 de Junio de 2008, 12:38:28
Hola:
No sé si es una mania mia, pero  creo que "goto" se desaconsejaba para programar en C, por los efectos de recursion que producia; seguramente estaré equivocado pero... ¿porqué no intentas cambiar los saltos por unos "while"?
 :-)
Título: Re: Problemas con C
Publicado por: firepic en 03 de Junio de 2008, 12:52:19
Tienes razón mandoanaiz, eso pasa cuando uno está acostumbrado a trabajar en asm... luego quieres usar las mismas herramientas en C  :D
Es cuestión de cambiar un poco la mentalidad de programación y adaptarla al C.
No había vuelto a este hilo... en lo que tenga chance veo en qué puedo ayudar con ese código... o ya lo solucionaste amospi?
Espero tu respuesta...
Saludos a todos, nos leemos!  :mrgreen:
Título: Re: Problemas con C
Publicado por: amospi en 06 de Junio de 2008, 19:18:17
Hola Firepic, ya solucioné el problema, era una variable mal definida.  Ahora estoy tratando de leer y escribir en una EEPROM de  16Kbytes que bajé del foro, pero no me compila el programa principal ni los programas que están dentro del .H; lo único que le cambié fueron los pines de lectura y escritura y el microcontrolador; le pego el código si le da una miradita

este es el principal

Código: [Seleccionar]
#include "C:\Archivos de programa\PICC\EEpromX.h"


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

//#include <16f873.h> //pic a utilizar
//#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
//#fuses RC_IO //reloj interno
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //manejo del RS232
#define EEPROM_SDA PIN_C5 //pines para...
#define EEPROM_SCL PIN_C4 //...manejo de eeprom 24LC256
//#include <24256.c> //libreria eeprom 24LC256

///DECLARACION DE VARIABLES GLOBALES
 boolean menu=1,opcion=1; //si menu=0 se muestra el menu de inicio...
//...si opcion=1 estamos en modo direccion
// opcion=0 estamos en modo dato

///DECLARACION DE FUNCIONES
BYTE gethex1( );                 //verifica que esta dentro del rango y muestra por pantalla
BYTE gethex( );                  //devuelve el numero en hex
                                 ///LLAMADA FUNCION INTERRUPCION
#int_rda
   void rs232( )
   {
      BYTE i=0,j=0,value;           //definicion...
      EEPROM_ADDRESS address;
      char digito;                  //...variables

      disable_interrupts(global);   //apago interrupcion

      digito=getc( );               //almaceno dato serial(rs232) en digito

      puts("****************************************************" );

         switch(digito)
         {
           case "0": menu=!menu;      //muestra menu
               break;

           case "1": printf("LLenando buffer..." ); //llena memoria 0xff
               for(i=0; i<16;i++)
                {
                  for(j=0; j<16;j++)
                  write_ext_eeprom(i*16+j,0xff);
                }
                  puts(" Buffer completado!" );
                  break;


            case "2": puts("Realizando Lectura..." ); //opcion que realiza la lectura modo hex
                  puts("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" );
                  puts("==============================================" );
                  for(i=0;i<16;i++)
                    {
                     for(j=0;j<16;j++)
                        {
                        printf("%2x ",read_ext_eeprom(i*16 +j) );
                        }
                        printf("|| %3x0",i );
                    }
                        puts("Lectura finalizada!" ;
                        break;


             case "3": printf("Direccion a cambiar: " ); //opcion que realiza la escritura address = gethex( ); //le damos la direccion
                       printf("Nuevo valor: " );
                       opcion=0; //modo datos
                       value = gethex( ); //le damos el dato a escribir
                       opcion=1; //modo direcciones
                       printf("Realizando escritura..." );
                       write_ext_eeprom(address,value); //escribe en la eeprom
                       printf(" Escritura finalizada!" );
                        break;


             case "4": puts("Realizando Lectura..." ); //opcion que realiza la lectura modo texto
                       puts("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" );
                       puts("==============================================" );
                       for(i=0;i<16;i++)
                        {
                           for(j=0;j<16;j++)
                            {
                             printf("%c ",read_ext_eeprom(i*16 +j) );
                            }
                             printf("||%3x0 ",i );
                         }
                           puts("Lectura finalizada!" );
                           break;

         default: puts("Opcion incorrecta, para ver Menu pulse 0 VsZeNeR"06" );
                  }
                  puts("****************************************************" ;
                  enable_interrupts(global); //activamos de nuevo la interrupcion serial rs-232
                  }

      void main(void)
    {
 //     setup_oscillator(OSC_4MHZ); //reloj interno de 4MHz
      enable_interrupts(int_rda); //activo interrupcion serial rs-232
      enable_interrupts(global); //habilito la interrupcion

      init_ext_eeprom( );

      do
      { //bucle...
         puts("Lectura/Escritura de EEPROM 24LC256 VsZeNeR"06" ); //menu...
         puts("==============================================" );
         puts("Seleccione opcion:" );
         puts("¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨" );
         puts(" 0->Ver opciones" );
         puts(" 1->LLenar buffer" );
         puts(" 2->Lectura modo HEX" );
         puts(" 3->Escritura EEPROM" );
         puts(" 4->Lectura modo TEXTO" ); //...principal
         menu=1; //muestra menu solamente una vez
         while(menu==1){ } //espera tecla pulsada por teclado(rs-232)
        }
          while(TRUE); //...infinito
     }
      ///FUNCION QUE SELECCIONA DIGITO CORRESPONDIENTE
      BYTE gethex1( )
       {
         char digit;

         do { //espera hasta tener un dato correcto
            digit = getc();
            if(opcion==0) //si estamos introduciendo un dato no hace falta las restricciones
            break;
            }
           while((digit<"0" || digit>"9") && (digit<"A" || digit>"F") && (digit<"a" || digit>"f" ));

           putc(digit); //muestra por pantalla el dato introducido

            if(digit<="9" ) //se ha introducido un numero
            return(digit-"0" );
            else //se ha introducido una letra
            return((toupper(digit)-"A" )+10);
        }

            BYTE gethex()  ///FUNCION QUE DEVUELVE EL NUMERO HEXADECIMAL
           {
            int lo,hi;

            hi = gethex1(); //parte alta
            lo = gethex1( ); //parte baja
            if(lo==0xdd)
            return(hi);
            else
            return( hi*16+lo );
            }
      }


}

y este es el 24256 que es necesario para el programa principal

Código: [Seleccionar]
////   Library for a 24LC256 serial EEPROM                             ////
////                                                                   ////
////   init_ext_eeprom();    Call before the other functions are used  ////
////                                                                   ////
////   write_ext_eeprom(a, d);  Write the byte d to the address a      ////
////                                                                   ////
////   d = read_ext_eeprom(a);   Read the byte d from the address a    ////
////                                                                   ////
////   The main program may define eeprom_sda                          ////
////   and eeprom_scl to override the defaults below.                  ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////


#ifndef EEPROM_SDA

#define EEPROM_SDA  PIN_C5
#define EEPROM_SCL  PIN_C4

#endif

#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)

#define EEPROM_ADDRESS long int
#define EEPROM_SIZE   16384

 void init_ext_eeprom()

   output_float(EEPROM_SCL);
   output_float(EEPROM_SDA);


 void write_ext_eeprom(long int address, BYTE data)
 {
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0);
   }
 }


BYTE read_ext_eeprom(long int address)
{
   BYTE data;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_start();
   i2c_write(0xa1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}
Título: Re: Problemas con C
Publicado por: MGLSOFT en 07 de Junio de 2008, 10:55:07
Esa memoria (24c256) es de 32 KBytes, no de 16, no sera alli tu problema?? :mrgreen:
Título: Re: Problemas con C
Publicado por: firepic en 07 de Junio de 2008, 12:02:46
Saludos amospi!
Felicitaciones por haber resuelto tu problemilla!  :-/
Bueno te confieso que yo no he trabajado con ese tipo de memorias, pronto tendré que hacerlo, pero aún no.
Así que lamento no poder ayudarte en este caso particular.
No obstante, ya el maestro MGLSOFT te dió una pista... y hay mucha gente experta aquí en el foro que te puede ayudar.
Recuerda usar siempre el buscador del foro, no vaya a ser que ya la respuesta a tu problema esté publicada por allí.
Y tal vez sería mejor que abrieras un hilo aparte en este mismo subforo de C con un tema más específico referente a esto de las EEPROM.
Ok sólo son recomendaciones. Te deseo éxito, nos leemos!  :mrgreen: