| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| cgperalta 
 
 
 Joined: 14 Mar 2005
 Posts: 4
 
 
 
			    
 
 | 
			
				| I2C Force_HW doesn't work... |  
				|  Posted: Mon Mar 14, 2005 2:54 pm |   |  
				| 
 |  
				| I'm trying to compile a code using force_hw in #use i2c staement, but when I see the list, it's clearly seen that is using software routines to read the I2C Bus.  I'm using 16F819 and PCM 3.216. The same code, compiled with an earlier version of PCM works as it should.... using hardware.
 All I've changed is the compiler version.
 Any help would be appreciatted.
 Thank you.
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Mar 14, 2005 3:05 pm |   |  
				| 
 |  
				| Post a very simple, but complete program that shows the problem. What we will do, is to drop your program into MPLAB and try
 to duplicate the problem.  Don't leave anything out.   Post #fuses,
 #includes, #use statements, and your code,  etc., but keep it short.
 |  |  
		|  |  
		| cgperalta 
 
 
 Joined: 14 Mar 2005
 Posts: 4
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Mar 16, 2005 6:45 am |   |  
				| 
 |  
				| This is a very simple sample code, and it doesn't work either... #include <16F818.h>                //CCS Header file
 #include <pic16f818.h>             //My header file, hardware registers
 
 
 #device adc=10
 #use delay(clock=8000000,RESTART_WDT)
 #fuses INTRC_IO,PUT,BROWNOUT,WDT,NOLVP,NODEBUG,MCLR,NOWRT,CCPB2,NOPROTECT
 #use i2c(Slave, fast, sda=PIN_B1, scl=PIN_B4, force_hw, address=0x01)
 
 void main() {
 char a;
 osccon = 0x70;                          // Setea el oscilador a 8MHz
 while(!IOFS){}                          // Espera a que el reloj esté estable.
 a= i2c_read();
 
 }
 
 It generates this assembly...
 
 .................... #device adc=10
 .................... #use delay(clock=8000000,RESTART_WDT)
 .................... #fuses INTRC_IO,PUT,BROWNOUT,WDT,NOLVP,NODEBUG,MCLR,NOWRT,CCPB2,NOPROTECT
 .................... #use i2c(Slave, fast, sda=PIN_B1, scl=PIN_B4, force_hw, address=0x01)
 0004:  MOVLW  08
 0005:  MOVWF  @@23
 0006:  BSF    STATUS.5
 0007:  BSF    TRISB.4
 0008:  BSF    TRISB.1
 0009:  BCF    STATUS.5
 000A:  BTFSS  PORTB.4
 000B:  GOTO   00E
 000C:  BSF    STATUS.5
 000D:  GOTO   009
 000E:  BTFSS  PORTB.4
 000F:  GOTO   00E
 0010:  BTFSC  PORTB.1
 0011:  BSF    STATUS.0
 0012:  BTFSS  PORTB.1
 0013:  BCF    STATUS.0
 0014:  RLF    @78,F
 0015:  DECFSZ @@23,F
 0016:  GOTO   018
 0017:  GOTO   01A
 0018:  BSF    STATUS.5
 0019:  GOTO   009
 001A:  BTFSC  PORTB.4
 001B:  GOTO   01A
 001C:  BSF    STATUS.5
 001D:  BCF    TRISB.1
 001E:  BCF    STATUS.5
 001F:  BCF    PORTB.1
 0020:  BTFSS  PORTB.4
 0021:  GOTO   020
 0022:  NOP
 0023:  BSF    STATUS.5
 0024:  BCF    TRISB.4
 0025:  BCF    STATUS.5
 0026:  BCF    PORTB.4
 0027:  GOTO   038 (RETURN)
 ....................
 .................... void main() {
 ....................      char a;
 0028:  CLRF   FSR
 0029:  MOVLW  1F
 002A:  ANDWF  STATUS,F
 002B:  BSF    STATUS.5
 002C:  BSF    ADCON1.0
 002D:  BSF    ADCON1.1
 002E:  BSF    ADCON1.2
 002F:  BCF    ADCON1.3
 ....................      osccon = 0x70;                          // Setea el oscilador a 8MHz
 0030:  MOVLW  70
 0031:  MOVWF
 ....................      while(!IOFS){}                          // Espera a que el reloj esté estable.
 0032:  BTFSS  .2
 0033:  GOTO   032
 ....................      a= i2c_read();
 0034:  MOVLW  01
 0035:  MOVWF  @77
 0036:  BCF    STATUS.5
 0037:  GOTO   @I2C_READ_0_52_49_8000000
 0038:  MOVF   @78,W
 0039:  MOVWF  a
 ....................
 .................... }
 ....................
 003A:  SLEEP
 |  |  
		|  |  
		| mpfj 
 
 
 Joined: 09 Sep 2003
 Posts: 95
 Location: UK
 
 
			        
 
 | 
			
				|  |  
				|  Posted: Wed Mar 16, 2005 1:42 pm |   |  
				| 
 |  
				|  	  | cgperalta wrote: |  	  |  	  | Code: |  	  | ....................      a= i2c_read(); 0034:  MOVLW  01
 0035:  MOVWF  @77
 0036:  BCF    STATUS.5
 0037:  GOTO   @I2C_READ_0_52_49_8000000
 0038:  MOVF   @78,W
 0039:  MOVWF  a
 
 | 
 | 
 
 You should check the function @I2C_READ_0_52_49_8000000 and see what that does.  I think you will find that the code contained in that function uses the I2C hardware.
 |  |  
		|  |  
		| cgperalta 
 
 
 Joined: 14 Mar 2005
 Posts: 4
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Mar 16, 2005 2:20 pm |   |  
				| 
 |  
				| the function @I2C_READ_0_52_49_8000000 goes to address 0x0004 and executes this: 0004: MOVLW 08
 0005: MOVWF @@23
 0006: BSF STATUS.5
 0007: BSF TRISB.4
 0008: BSF TRISB.1
 0009: BCF STATUS.5
 000A: BTFSS PORTB.4
 000B: GOTO 00E
 000C: BSF STATUS.5
 000D: GOTO 009
 000E: BTFSS PORTB.4
 000F: GOTO 00E
 0010: BTFSC PORTB.1
 0011: BSF STATUS.0
 0012: BTFSS PORTB.1
 0013: BCF STATUS.0
 0014: RLF @78,F
 0015: DECFSZ @@23,F
 0016: GOTO 018
 0017: GOTO 01A
 0018: BSF STATUS.5
 0019: GOTO 009
 001A: BTFSC PORTB.4
 001B: GOTO 01A
 001C: BSF STATUS.5
 001D: BCF TRISB.1
 001E: BCF STATUS.5
 001F: BCF PORTB.1
 0020: BTFSS PORTB.4
 0021: GOTO 020
 0022: NOP
 0023: BSF STATUS.5
 0024: BCF TRISB.4
 0025: BCF STATUS.5
 0026: BCF PORTB.4
 0027: GOTO 038 (RETURN)
 
 
 This is the listing for the same source code compiled with version 3.168:
 .................... #use i2c(slave, fast, sda=PIN_B1, scl=PIN_B4, force_hw, address=0x01, restart_wdt)
 ....................
 .................... void main() {
 ....................      char a;
 0004:  CLRF   FSR
 0005:  MOVLW  1F
 0006:  ANDWF  STATUS,F
 0007:  MOVLW  06
 0008:  BSF    STATUS.5
 0009:  MOVWF  ADCON1
 000A:  MOVLW  01
 000B:  MOVWF  SSPADD
 000C:  MOVLW  36
 000D:  BCF    STATUS.5
 000E:  MOVWF  SSPCON
 .....
 .....
 ....................      a= i2c_read(0);
 0015:  BTFSS  SSPSTAT.0
 0016:  GOTO   015
 0017:  BCF    STATUS.5
 0018:  MOVF   SSPBUF,W
 0019:  MOVWF  a
 
 This one uses the hardware SPI, the former doesn't.
 The only change, is the compiler version!!
 |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Re: I2C Force_HW doesn't work... |  
				|  Posted: Wed Mar 16, 2005 9:01 pm |   |  
				| 
 |  
				|  	  | cgperalta wrote: |  	  | I'm trying to compile a code using force_hw in #use i2c staement, but when I see the list, it's clearly seen that is using software routines to read the I2C Bus.  I'm using 16F819 and PCM 3.216. 
 | 
 
 fixed in 3.222
 |  |  
		|  |  
		| cgperalta 
 
 
 Joined: 14 Mar 2005
 Posts: 4
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Mar 18, 2005 9:50 am |   |  
				| 
 |  
				| Thanks! Have to buy new version now...
 |  |  
		|  |  
		| gjmsd 
 
 
 Joined: 24 Mar 2005
 Posts: 2
 
 
 
			    
 
 | 
			
				| FORCE_HARDWARE |  
				|  Posted: Thu Mar 24, 2005 10:40 pm |   |  
				| 
 |  
				| I have the same problem - I2C stops worling if is specify FORCE_HW. I have read the thread and am not finding my problem. Here's my code: 
 
 
  	  | Code: |  	  | #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FAST, FORCE_HW) //#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FAST)
 
 #define EEPROM_SCL  PIN_C3
 #define EEPROM_SDA  PIN_C4
 
 void init_I2C(void)
 {
 output_float(EEPROM_SCL);
 output_float(EEPROM_SDA);
 }
 
 int1 I2C_ready(void)
 {
 int1 bAck;
 i2c_start();
 bAck = i2c_write(0xa0);
 i2c_stop();
 return (!bAck);
 }
 
 void write_I2C_begin(long int address)
 {
 short int status;
 while(!I2C_ready());
 i2c_start();
 i2c_write(0xa0);
 i2c_write(address>>8);
 i2c_write(address);
 }
 
 void write_I2C_data(BYTE data)
 {
 i2c_write(data);
 }
 
 void write_I2C_end(void)
 {
 i2c_stop();
 }
 
 void read_I2C_begin(long int address)
 {
 while(!I2C_ready());
 i2c_start();
 i2c_write(0xa0);
 i2c_write(address>>8);
 i2c_write(address);
 i2c_start();
 i2c_write(0xa1);
 }
 
 BYTE read_I2C_data(void)
 {
 BYTE data;
 data=i2c_read();
 return(data);
 }
 
 BYTE read_I2C_end(void)
 {
 BYTE data;
 data=i2c_read(0);
 i2c_stop();
 return(data);
 }
 
 void Setup_Ports(void)
 {
 setup_adc_ports(NO_ANALOGS);
 set_tris_a(0x10);
 output_a(0x28);
 set_tris_b(0x00);
 port_b_pullups(TRUE);
 set_tris_c(0x81);
 output_c(0x38);
 
 setup_timer_0(RTCC_EXT_L_TO_H | RTCC_DIV_1);
 set_timer0(0);
 
 setup_timer_1(T1_EXTERNAL);
 set_timer1(0);
 
 setup_timer_3(T3_INTERNAL | T3_DIV_BY_1);
 set_timer3(0);
 }
 
 void main()
 {
 disable_interrupts(GLOBAL);
 Setup_Ports();
 output_low(PIN_C5);
 
 disable_interrupts(INT_RB);
 enable_interrupts(INT_TIMER0);
 enable_interrupts(INT_TIMER1);
 enable_interrupts(INT_TIMER3);
 enable_interrupts(INT_SSP);
 enable_interrupts(INT_RDA);
 enable_interrupts(GLOBAL);
 
 init_I2C();
 
 write_I2C_begin(0x00);
 write_I2C_data(0xaa);
 write_I2C_data(0xab);
 write_I2C_data(0xac);
 write_I2C_end();
 read_I2C_begin(0x00);
 write_eeprom(0x00, read_I2C_data());
 write_eeprom(0x01, read_I2C_data());
 write_eeprom(0x02, read_I2C_end());
 }
 
 | 
 |  |  
		|  |  
		| gjmsd 
 
 
 Joined: 24 Mar 2005
 Posts: 2
 
 
 
			    
 
 | 
			
				| FORCE_HARDWARE |  
				|  Posted: Thu Mar 24, 2005 10:47 pm |   |  
				| 
 |  
				| On my previous post I forgot to mention 
 PIC18F252
 
 MPLAB 6.60
 
 PCH 3.181
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |