Menu

a-ads Ad Unit #2456538

Ad Unit #2456555

Navbar

a-ads Ad Unit #2456538

Tuesday, September 8, 2020

ATMega32 TWI interfaces to PCF8574A parallel port expansion

PCF8574A is an 8-bit parallel I/O port expander with two-wire serial interface. This TWI peripheral interfaces to the master MCU via two wires. It's I/O pins model similar to the legacy 8051 one's. It operates from a 2.5 to 6 V DC supply voltage. An optional INT (interrupt) triggers an active low signal to the connected MCU pin whenever its digital input changes its logic state.






PCF8574A is similar to its precedence one's PCF8574. In the previous post, I use PIC12F629 to interfaces to PCF8574. However, PCF8574A has a difference reading and writing address, with 0x70 for writing and 0x71 for reading. I don't want to show its full details here.





In this example, the ATMega32 master TWI module reads the digital inputs from lower nibble of PCF8574A I/O. This lower nibble will be wrote back to the higher nibble of PCF8574A repeatedly.

 



ATMega32 TWI interfaces to PCF8574A parallel port expander
A running example

Embedded C source code list below.

/*
 * i2c_pcf8574.c
 *
 * Created: 9/9/2020 9:10:41 AM
 * Author : aki-technical
 */ 

#include <avr/io.h>

#define F_CPU 16000000UL
#include <util/delay.h>

void i2cInit(void){
TWSR=0x03; //Bit Rate Pre-scaler Is 1:64
TWBR=0x0F; 
TWCR=(1<<TWEN); //Enable The TWI Module
PORTC|=(1<<0);
PORTC|=(1<<1);
}

void i2cStart(void){
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
}

void i2cWrite(unsigned char data){
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
}

unsigned char i2cRead(char ACK){
if(ACK==0)
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
else
TWCR=(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
return TWDR;
}

void i2cStop(){
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}

int main(void)
{
unsigned char i2cData=0x00;
i2cInit();
PORTC=0x03;

/*Set the lower nibble high for digital inputs*/
i2cStart();
i2cWrite(0x70);
i2cWrite(0x0F);
i2cStop();

while (1)
{
/*Read the digital inputs*/
i2cStart();
i2cWrite(0x71);
i2cData=i2cRead(1);
i2cStop();

/*Transfer the inputs to outputs*/
i2cData<<=4;

/*Write inputs to outputs*/
i2cStart();
i2cWrite(0x70);
i2cWrite(i2cData|0x0F);
i2cStop();

_delay_ms(10);
}
}

Click here to download the zip file of this programming example.

See also


No comments:

Post a Comment

Ad Unit #2456555

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (133) Distance Sensor (3) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (10) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)