| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			Vefa
 
 
  Joined: 13 Feb 2007 Posts: 9
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| write_ext_eeprom | 
			 
			
				 Posted: Tue Feb 20, 2007 4:03 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Hi Everyone,
 
 
Does anyone have any idea why the following simple code would not work?
 
 
 	  | Code: | 	 		  #include <18F8722>
 
#include <24515.c>
 
#include <stdlib.h>
 
#include <math.h>
 
 
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP
 
#use delay(clock=10000000)
 
#use rs232(baud=2400, xmit=PIN_A4, rcv=PIN_A5, stream=PC, ERRORS)
 
 
#define LED PIN_F0
 
 
void main(void) 
 
{
 
   short int c=5;
 
   long address=10;
 
 
   
 
   
 
   while(1)
 
   {
 
      fputc('a', PC);
 
      delay_ms(50);
 
 
      init_ext_eeprom();
 
      WRITE_EXT_EEPROM(address, c);
 
      delay_ms(50);
 
      fputc('*', PC);
 
               
 
   }
 
 
} // end of main
 
 | 	  
 
 
It prints an "a" and waits there.
 
 
Thanks | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Feb 20, 2007 4:09 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Follow standard debugging procedures.   Comment out lines of code
 
until you find out which line is causing the problem. | 
			 
		  | 
	
	
		  | 
	
	
		
			Vefa
 
 
  Joined: 13 Feb 2007 Posts: 9
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Feb 20, 2007 4:30 pm     | 
				     | 
			 
			
				
  | 
			 
			
				| write_ext_eeprom line does not work. I checked my hardware. Am I missing something in the code? | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Feb 20, 2007 4:49 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Do you have pull-up resistors on the each of the SDA and SCL lines ?
 
You need them for i2c.   You can use 4.7K.
 
 
Also, I noticed something else about your program.
 
 
Did you know that in CCS, a 'short' is a 1-bit variable ?
 
 
Download the CCS manual and look at page 23 (page 33 in the Acrobat
 
reader).   It shows a table with the sizes of the data types.
 
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf | 
			 
		  | 
	
	
		  | 
	
	
		
			Vefa
 
 
  Joined: 13 Feb 2007 Posts: 9
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Feb 20, 2007 8:06 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Thanks PCM programmer. I have the pull ups. I used int instead of short int. Thanks for the manual as well.  Do you agree that I have a hardware problem? or should I try low level programming as in 
 
 
  	  | Code: | 	 		  i2c_start();
 
   i2c_write(control_byte | WRITE); // write
 
   i2c_write(high_byte);
 
   i2c_write(low_byte);
 
   i2c_start(); // restart
 
   i2c_write(control_byte | READ); // read
 
   low_byte = i2c_read(0); // no ack
 
   i2c_stop();
 
   return (low_byte);  | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Feb 20, 2007 8:41 pm     | 
				     | 
			 
			
				
  | 
			 
			
				What PIC pins are you using for the EEPROM ?
 
 
What value of resistors are you using for the pull-ups ? | 
			 
		  | 
	
	
		  | 
	
	
		
			Vefa
 
 
  Joined: 13 Feb 2007 Posts: 9
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Feb 21, 2007 10:19 am     | 
				     | 
			 
			
				
  | 
			 
			
				| C3, and C4. Pull-ups are 4K. I tried 3 different 24FC515 EEPROM chips. I did a continuity test. Everything in the hardware end seems to be in good /working condition. I am using a friend's circuit and he successfully used the circuit with a similar code. Still, I can't get the code that I initially posted to work. I am a newbie and I am not sure if I am missing a very simple thing. | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Feb 22, 2007 2:27 pm     | 
				     | 
			 
			
				
  | 
			 
			
				| Post your compiler version.  I'll compile the code and look at the .LST file. | 
			 
		  | 
	
	
		  | 
	
	
		
			Vefa
 
 
  Joined: 13 Feb 2007 Posts: 9
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Feb 23, 2007 9:07 am     | 
				     | 
			 
			
				
  | 
			 
			
				My compiler is PCH version 3.249.
 
When I compile the code with the compiler on my friend's computer, it works! When I compile it with mine it does not. We have the same compiler. I am going to try reinstalling the compiler. Any suggestion? | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah Guest
 
 
 
 
  
			
			
			
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Feb 23, 2007 9:18 am     | 
				     | 
			 
			
				
  | 
			 
			
				I posted about this quite recently.
 
There is a problem with certain chips, when using the hardware I2C, and a 'repeated start' command. For some reason, on these, the ACK never gets seen, and the driver will hang. Either use the software I2C (FORCE_SW), or add a 'I2C_STOP', before the restart.
 
 
Best Wishes | 
			 
		  | 
	
	
		  | 
	
	
		
			Vefa
 
 
  Joined: 13 Feb 2007 Posts: 9
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| works! | 
			 
			
				 Posted: Fri Feb 23, 2007 9:47 am     | 
				     | 
			 
			
				
  | 
			 
			
				I checked the lst file. I saw the following statement:
 
 	  | Code: | 	 		  #ifndef EEPROM_SDA 
 
....................  
 
.................... #define EEPROM_SDA  PIN_B1 
 
.................... #define EEPROM_SCL  PIN_B0 
 
 | 	  
 
 
My sda and scl pins are C3 & C4. I then realized if I defined the sda and scl pins before including the 24515.c file then it would work. That's what I did. Following is the code that works:
 
 	  | Code: | 	 		  #include <18F8722>
 
#include <stdlib.h>
 
#include <math.h>
 
 
#define EEPROM_SDA PIN_C4
 
#define EEPROM_SCL PIN_C3
 
#include <24515.c>
 
 
#define LED PIN_F0
 
 
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP
 
#use delay(clock=10000000)
 
 
 
main() 
 
{
 
   // EEPROM
 
   long address=0;
 
 
   output_high(LED);
 
   delay_ms(1500);
 
   output_low(LED);
 
 
   while(1)
 
   {      
 
      
 
         if(address<65535>255) output_high(LED);
 
         else output_low(LED);
 
   }
 
} // end of main | 	  
 
 
Thanks to everyone.
 
Special thanks to PCM Programmer. | 
			 
		  | 
	
	
		  | 
	
	
		 |