Autor Tema: Problemas con C  (Leído 4459 veces)

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

Desconectado amospi

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con C
« Respuesta #15 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
« Última modificación: 28 de Mayo de 2008, 13:35:06 por amospi »

Desconectado mandoanaiz

  • PIC10
  • *
  • Mensajes: 47
Re: Problemas con C
« Respuesta #16 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"?
 :-)

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #17 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:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado amospi

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con C
« Respuesta #18 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);
}
« Última modificación: 06 de Junio de 2008, 19:22:13 por amospi »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problemas con C
« Respuesta #19 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:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #20 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:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web