|
|
View previous topic :: View next topic |
Author |
Message |
asunca
Joined: 09 Sep 2005 Posts: 36
|
I/O expander |
Posted: Mon Sep 26, 2005 4:57 am |
|
|
i have a max7313 , 16 port i/o expander with led intensity control , to use in my rgb led project. i ve learned the process of i2c communication and i should know how i can use this i/o expander as a slave device. do i have to write a slave interrupt routine or driver for the device by myself, or use a universal device programmer or just send the register addresses and pwm values by master??
thanks |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Mon Sep 26, 2005 6:21 am |
|
|
The MAX7113 will be the slave device. There is no need for your PIC to have a slave interrupt routine. If you read the datasheet for the MAX7313, it will state the address and register values needed to control the IO. Then take a look at one of the I2C eeprom examples (2401.c). You can modify one of those to write your values. |
|
|
asunca
Joined: 09 Sep 2005 Posts: 36
|
|
Posted: Tue Sep 27, 2005 8:34 am |
|
|
i ve modified the extee example and used 2401.c file. and i ve written my driver code for max7313. when i was struggling with two pics communicating,i knew which step i was on, but now i dont know what happens inside the maxim.. master transmits the codes according to my readings of datasheet but nothing happens... max7313 stays at the initial power up configuration, outputs are hi-Z. what is hard is the maxim has more complex inside addressing than eeprom.
slave address+ command address(internal register address)+ data byte
that is the process for writing to maxim..
ithink i should swallow the datasheet ... again... |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Tue Sep 27, 2005 8:40 am |
|
|
Post your code. |
|
|
asunca
Joined: 09 Sep 2005 Posts: 36
|
|
Posted: Wed Sep 28, 2005 4:52 am |
|
|
i dont know what is going on inside this microprocessor and i have no idea about how isr is done inside it...
and extra thing; the scl line stays at 2.2V and sda line stays at 1.4V when i use slave_ready() function..
i ve found out that ,when i try a simple code whether the maxim will acknowledge my command. it cannot acknowledge.. here is the try
void try()
{
if (slave_ready(0x10)) output_high(pin_b7); // slave address is 0x10
}
here is the driver code for max7313:
Code: |
#ifndef slave_SDA
#define slave_SDA PIN_C4
#define slave_SCL PIN_C3
#endif
#use i2c(master,sda=slave_SDA, scl=slave_SCL)
void init_slaves()
{
output_float(slave_SCL);
output_float(slave_SDA);
}
BOOLEAN slave_ready(int address)
{
int1 ack;
i2c_start(); // If the write command is acknowledged,
ack = i2c_write((address>>7) & 0xfe); // then the device is ready.
i2c_stop();
return !ack;
}
void write_slave(int address,int command,int data)
{
//while(!slave_ready(address)); // if i usethis line sda and scl are wrong
i2c_start();
delay_ms(15);
i2c_write( (address>>7) & 0xfe);
delay_ms(15);
i2c_write(command);
delay_ms(15);
i2c_write(data);
delay_ms(15);
i2c_stop();
}
void configure_slave(int address)
{
write_slave(address,0x06,0x00); // port configuration registers
write_slave(address,0x07,0x00); // port configuration registers
write_slave(address,0x0F,0x00); // Configuration register settings
write_slave(address,0x0E,0x80); // master intensity 8/15 oraninda
write_slave(address,0x02,0xFF); // outputs are set to high
write_slave(address,0x03,0xFF); // outputs are set to high
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/*BOOLEAN ext_eeprom_ready()
{
int1 ack;
i2c_start(); // If the write command is acknowledged,
ack = i2c_write(0xa0); // then the device is ready.
i2c_stop();
return !ack;
}*/
/*void write_slave(int address, BYTE data) {
while(!ext_eeprom_ready());
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
i2c_write(address);
i2c_write(data);
i2c_stop();
}*/
/*BYTE read_ext_eeprom(long int address) {
BYTE data;
while(!ext_eeprom_ready());
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
i2c_write(address);
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))|1);
data=i2c_read(0);
i2c_stop();
return(data);
}*/
|
and the main program iis dedicated to give diffrent pwms to rgb leds. for the color pink, the commands are transmitted....
Code: |
#include <16F877.h>
#device adc=8
#use delay(clock=20000000)
#fuses NOWDT,HS, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#include <max7313.c>
void pink()
{
configure_slave(0x10);
delay_ms(5);
write_slave(0x10,0x10,0xF6); // red, green
write_slave(0x10,0x10,0x0F); // blue
}
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);
init_slaves();
delay_ms(20);
pink();
while(1);
}
| [/code] |
|
|
|
|
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
|