CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

I2C Force_HW doesn't work...

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
cgperalta



Joined: 14 Mar 2005
Posts: 4

View user's profile Send private message

I2C Force_HW doesn't work...
PostPosted: Mon Mar 14, 2005 2:54 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Mon Mar 14, 2005 3:05 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Wed Mar 16, 2005 6:45 am     Reply with quote

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

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Wed Mar 16, 2005 1:42 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Wed Mar 16, 2005 2:20 pm     Reply with quote

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...
PostPosted: Wed Mar 16, 2005 9:01 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Fri Mar 18, 2005 9:50 am     Reply with quote

Thanks!
Have to buy new version now...
gjmsd



Joined: 24 Mar 2005
Posts: 2

View user's profile Send private message

FORCE_HARDWARE
PostPosted: Thu Mar 24, 2005 10:40 pm     Reply with quote

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

View user's profile Send private message

FORCE_HARDWARE
PostPosted: Thu Mar 24, 2005 10:47 pm     Reply with quote

On my previous post I forgot to mention

PIC18F252

MPLAB 6.60

PCH 3.181
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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