| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| mehmetem 
 
 
 Joined: 29 Jul 2011
 Posts: 12
 
 
 
			    
 
 | 
			
				| pic16f877a i2c  slave problem |  
				|  Posted: Fri Jul 29, 2011 8:25 am |   |  
				| 
 |  
				| Hi All, I have a problem; I could not simulate ex_slave example.
 
 My master code:
 
  	  | Code: |  	  | #include <16F877A.h>
 #device adc=8
 
 #FUSES NOWDT                    //No Watch Dog Timer
 #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
 #FUSES NOPUT                    //No Power Up Timer
 #FUSES PROTECT                  //Code protected from reads
 #FUSES NODEBUG                  //No Debug mode for ICD
 #FUSES NOBROWNOUT               //No brownout reset
 #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
 #FUSES NOCPD                    //No EE protection
 #FUSES NOWRT                    //Program memory not write protected
 
 #use delay(clock=20000000)
 #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3,force_hw)#include <2402.C>
 
 byte gelen=0;
 void main()
 {
 
 setup_adc_ports(NO_ANALOGS);
 setup_adc(ADC_OFF);
 setup_psp(PSP_DISABLED);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_timer_2(T2_DISABLED,0,1);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 init_ext_eeprom();
 
 // TODO: USER CODE!!
 gelen= read_ext_eeprom(0x03);
 while(1);
 }
 
 | 
 My slave code is
 
  	  | Code: |  	  | #if defined(__PCM__)
 #include <16F877.h>
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=20000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
 
 #elif defined(__PCH__)
 #include <18F452.h>
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=20000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
 #endif
 
 #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)
 
 BYTE address, buffer[0x10];
 
 
 #INT_SSP
 void ssp_interupt ()
 {
 BYTE incoming, state;
 
 state = i2c_isr_state();
 
 if(state <= 0x80)                     //Master is sending data
 {
 incoming = i2c_read();
 if(state == 1)                     //First received byte is address
 address = incoming;
 if(state == 2)                     //Second received byte is data
 buffer[address] = incoming;
 }
 if(state == 0x80)                     //Master is requesting data
 {
 i2c_write(buffer[address]);
 }
 }
 
 
 void main ()
 {
 int i=0;
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_SSP);
 
 for (i=0;i<16;i++)
 {buffer[i]=0x37;}
 while (TRUE) {}
 }
 
 | 
 and my problem:  Received data all times 80. Where is my mistake? I could not find.  Here is a Proteus picture:
 
   
 I am sorry for my broken English.
 _________________
 trainee
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9587
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jul 29, 2011 8:51 am |   |  
				| 
 |  
				| Probably a Proteus problem as it is full of bugs, errors, glitches etc. You should use real hardware.
 If you can't contact a Proteus help forum or the mfr of the simulator.
 
 There are working code examples in the CCS examples folder you might consult, see if they work under Proteus.
 |  |  
		|  |  
		| mehmetem 
 
 
 Joined: 29 Jul 2011
 Posts: 12
 
 
 
			    
 
 | 
			
				| Thank you, I solved problem. |  
				|  Posted: Wed Aug 03, 2011 12:57 am |   |  
				| 
 |  
				|  _________________
 trainee
 |  |  
		|  |  
		| PEDE 
 
 
 Joined: 10 Sep 2011
 Posts: 1
 
 
 
			    
 
 | 
			
				| pic16f877a i2c slave problem |  
				|  Posted: Sat Sep 10, 2011 10:29 am |   |  
				| 
 |  
				| How did you fix your problem? Thx... |  |  
		|  |  
		| mehmetem 
 
 
 Joined: 29 Jul 2011
 Posts: 12
 
 
 
			    
 
 | 
			
				| There is not anything, Don't forget pull-up' MY WORKING CODE |  
				|  Posted: Sat Sep 10, 2011 2:12 pm |   |  
				| 
 |  
				|  	  | Code: |  	  | BYTE address, BufferTxt[20], buffer[20];
 
 
 
 #INT_SSP
 void ssp_interupt ()
 {
 BYTE incoming, state;
 
 state = i2c_isr_state();
 
 if(state <= 0x80)                     //Master is sending data
 {
 incoming = i2c_read();
 if(state == 1)                     //First received byte is address
 address = incoming;
 if(state == 2)                     //Second received byte is data
 buffer[address] = incoming;
 }
 if(state == 0x80)                     //Master is requesting data
 {
 i2c_write(buffer[address]);
 }
 }
 | 
 
 AND MASTER
 
 
  	  | Code: |  	  | while(1) {
 
 init_ext_eeprom();
 PresetNumber= read_ext_eeprom(0x09);
 
 if (PresetNumber!=PresetNumberOld)
 {
 
 
 CalcPhase();
 
 yerptr=&(Rpm);
 countL=*(yerPtr);
 write_ext_eeprom(0x07,CountL);
 
 countH=*(yerPtr+1);
 write_ext_eeprom(0x08,CountH);
 delay_ms(40);
 
 
 
 }
 | 
 _________________
 trainee
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |