SlideShare a Scribd company logo
13
Most read
16
Most read
17
Most read
How to use I2C with AVR
Sunday, April 28, 13
I2C abstract(1)
AVR1 AVR2
SCL
SDA
Vdd
I2C is one of communication systems for Microcomputer.
I2C uses 2 lines, SCL(clock), SDA(data).
Sunday, April 28, 13
I2C abstract(2)
AVR1 AVR2
SCL
SDA
SCL(clock) is used to send clock for synchronization.
SDA(data) is used for sending data.
1 bit data is transferred every clock.
1 0 1 0
Sunday, April 28, 13
I2C abstract(3)
Master
You can connect more than 2 boards.
One board must be Master and the others are Slave.
Each slave has own address.
Master can send data to each slave using the address.
Slave1 Slave2 Slave3 Slave4
SDA
address1 address2 address3 address4
SCL
Sunday, April 28, 13
I2C abstract(4)
Master
For example, if Master wants to send data to Slave2, Master
sends address2 to SDA line.All Slaves receives the address.
Only Slave2 replies.
Slave1 Slave2 Slave3 Slave4
SDA
address1 address2 address3 address4
SCL
address2
reply
The data is mine!
I must send replay.
The data is not mine.
I will ignore it.
The data is not mine.
I will ignore it.
The data is not mine.
I will ignore it.
Sunday, April 28, 13
I2C abstract(5)
Master
Next Master sends data to SDA line. Only Slave2 receives
the data and reply.
Slave1 Slave2 Slave3 Slave4
SDA
address1 address2 address3 address4
SCL
data
reply
I’ll receive this data.
I must send replay.
The data is not mine.
I will discard it.
The data is not mine.
I will discard it.
The data is not mine.
I will discard it.
discard discard discard
Sunday, April 28, 13
Program I2C with AVR
In this instance, you use arduino uno.
Arduino uno has Atmega168.
I am going to explain how to program
Atmega168 with C, without
Arduino library.
Sunday, April 28, 13
Connection
SDA pin and SCL pin are fixed. On Arduino Uno, analog4 = SDA, analog 5 = SCL.
Connect A4 and A5 of each Arduino.
Vcc
Sunday, April 28, 13
C programming on Arduino IDE
Arduino language is based on C. You can use all construction of C.
When you write C on Arduino IDE, you have to replace “main and while” with “setup() and
loop()”. Initialize process must be inside setup() and loop process must be inside loop().
#include<avr.io.h>
void main(int){
//initialize process
while(1){
//loop process
}
}
#include<avr.io.h>
void setup(){
//initialize process
}
void loop(){
//loop process
}
Normal C C on Arduino IDE
Sunday, April 28, 13
I2C registers(Atmega168 version)
If you want to use I2C function on Microcomputer, you have to use registers for I2C.
(Sometimes different microcomputers have different registers, you have to see data sheet.)
These are I2C resisters(NOT all).
TWAR is TWI(Slave) Address Register. Slave address is set in this register.
TWBR is TWI Bit Rate Register. This is to decide SCL clock.
TWCR is TWI Control Register.You can control I2C with this register.
TWDR is TWI Data Register.The data to be transferred or received is set in this register.
TWSR is TWI Status Register. The status of I2C communication is set in this register.
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCETWAR
TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0
TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
TWBR
TWCR
TWDR
TWSR
Sunday, April 28, 13
The simplest I2C sequence
This is the simplest sequence of I2C.
If you want to send data more than 1 byte.You have to repeat (4)(5).
Master Slave
(1)Start
(2)Slave Adress
(3)Ack
(4)Data
(5)Ack
(6)Stop
Sunday, April 28, 13
How to use TWBR and TWSR
First, you have to decide the communication speed(SCL) with TWBR and TWSR.
SCL = CPU clock/(16+2(TWBR)xPrescaler)
TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0
TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
TWBR
TWSR
Prescaler parameter
(ex)
TWBR =0b00000001=1
TWBR =0b00000011=3
TWBR =0b11111111 = 255
(ex)
CPU clock = 1Mhz
TWBR=255
Prescaler=1
SCL = 1000000/(16+2(255)x1)=2kHz
(ex)
TWBR =(0<<TWPS1)|(0<<TWPS0) : prescaler is 1
TWBR =(0<<TWPS1)|(1<<TWPS0) : prescaler is 4
TWBR =(1<<TWPS1)|(1<<TWPS0) : prescaler is 64
Sunday, April 28, 13
How to use TWCR
You can control I2C message with TWCR.
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIETWCR
Send start condition
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIETWCR
Clear TWINT flag after sending message
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIETWCR
Send stop condition
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Start condition
while(!(TWCR & 1<<TWINT)) {} //After TWCR, always you have to check whether TWINT is updated
TWCR = 0b10000100; //flag clear
while(!(TWCR & 1<<TWINT)) {}
TWCR = 0b10010100; //finish translation
while(!(TWCR & 1<<TWINT)) {}
Source code sample
Sunday, April 28, 13
How to use TWSR
You can check status of I2C sequence from TWSR.
TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
TWSR
Source code sample
//check condition
if((TWSR & 0xF8) == 0x08){
TWDR = 0b00000010; //set slave address
TWCR = 0b10000100; //flag clear
while(!(TWCR & 1<<TWINT)) {}
_delay_ms(1);
if((TWSR & 0xF8) == 0x18){
TWDR = 0b10101010; //write data(1byte)
TWCR = 0b10000100; //send data
while(!(TWCR & (1<<TWINT)));
_delay_ms(1);
}
}
Sunday, April 28, 13
The simplest sample
(1)Connect A4 and A5 between Master and Slave(You need pull-up resisters)
(2)Connect LED and resister to Slave digital 9
(3)Connect MasterV5 to SlaveVin
(4)Connect Master GND and Slave GND
(5)Connect Master to PC with USB cable
(6)Install program from next page
Vcc
Master
Slave
LEDGND
This sample is to turn on LED connected to Slave
using data from Master
Sunday, April 28, 13
Sample code(master)
#include <avr/io.h>
#include <util/delay.h>
void setup(){
TWSR = (0<<TWPS1)|(0<<TWPS0); //Prescaler
TWBR = 0xFF; //TWBR=255
}
void loop(){
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Start condition
while(!(TWCR & 1<<TWINT)) {} //wait for flag update
_delay_ms(1);
if((TWSR & 0xF8) == 0x08){ //check condition
TWDR = 0b00000010; //send slave address
TWCR = 0b10000100; //flag clear
while(!(TWCR & 1<<TWINT)) {}
_delay_ms(1);
if((TWSR & 0xF8) == 0x18){ //check condition
TWDR = 0b10101010; //write data(1byte)
TWCR = 0b10000100; //send data
while(!(TWCR & (1<<TWINT)));
_delay_ms(1);
}
}
TWCR = 0b10010100; //finish translation
_delay_ms(2);
}
Sunday, April 28, 13
Sample code(slave)
#include <avr/io.h>
#include <util/delay.h>
void setup(){
DDRB = 0xFF; //all PINB is output mode
PORTB = 0x00; //all PINB is Low
TWAR = 0b00000010; //salve address setting
}
void loop(){
TWCR = 0b11000100; //start as slave(wait for address)
if((TWSR & 0xF8) == 0x60){ //check status
while(1){
TWCR = 0b11000100; //wait for data
while(!(TWCR & (1<<TWINT)));
if((TWSR & 0xF8) == 0x80){ //check status
char data = TWDR; //receive data
PORTB = data; //insert data to PORTB
}
if((TWSR & 0xF8) == 0xA0){ //check stop status
_delay_ms(10);
break;
}
}
}
}
Sunday, April 28, 13

More Related Content

PPTX
Embedded C programming session10
PPT
AVR Fundamentals
PPTX
Mastering Microcontroller : TIMERS, PWM, CAN, RTC,LOW POWER
PDF
Introduction to Microcontroller
PPTX
Part-2: Mastering microcontroller with embedded driver development
PPT
PPT
1 STM32's DMA.ppt
PPT
Embedded C programming session10
AVR Fundamentals
Mastering Microcontroller : TIMERS, PWM, CAN, RTC,LOW POWER
Introduction to Microcontroller
Part-2: Mastering microcontroller with embedded driver development
1 STM32's DMA.ppt

What's hot (20)

PPTX
gas turbine
PDF
UVM TUTORIAL;
PPT
PPTX
PIC Microcontrollers
PDF
Board Bringup
PDF
Pic microcontroller architecture
PDF
UEFI presentation
PPTX
Cpu registers
ODP
Programming ARM Cortex-M4 STM32 Nucleo
PPTX
Microcontroller
PPTX
Part-1 : Mastering microcontroller with embedded driver development
PDF
Course 102: Lecture 27: FileSystems in Linux (Part 2)
PPTX
Bootloaders (U-Boot)
PPT
STM32 MCU Family
PPTX
Introduction to armv8 aarch64
PDF
LCU14 500 ARM Trusted Firmware
PDF
BusyBox for Embedded Linux
PPSX
Lect 3 ARM PROCESSOR ARCHITECTURE
PDF
Embedded Linux BSP Training (Intro)
gas turbine
UVM TUTORIAL;
PIC Microcontrollers
Board Bringup
Pic microcontroller architecture
UEFI presentation
Cpu registers
Programming ARM Cortex-M4 STM32 Nucleo
Microcontroller
Part-1 : Mastering microcontroller with embedded driver development
Course 102: Lecture 27: FileSystems in Linux (Part 2)
Bootloaders (U-Boot)
STM32 MCU Family
Introduction to armv8 aarch64
LCU14 500 ARM Trusted Firmware
BusyBox for Embedded Linux
Lect 3 ARM PROCESSOR ARCHITECTURE
Embedded Linux BSP Training (Intro)
Ad

Viewers also liked (19)

PDF
SPI Protocol
PPT
Protols used in bluetooth
PDF
Multiple Inheritance
PPT
Arm processor
PPTX
Inheritance in OOPS
PDF
Embedded C - Optimization techniques
PPTX
Compiler in System Programming/Code Optimization techniques in System Program...
PDF
Introduction to Embedded System
PPTX
I2C Protocol
PDF
Object-Oriented Design: Multiple inheritance (C++ and C#)
ODP
Arm developement
PPTX
Serial Peripheral Interface
PDF
I2C Bus (Inter-Integrated Circuit)
PDF
Embedded C - Lecture 1
PPTX
Serial peripheral interface
PPT
Serial Peripheral Interface(SPI)
PPT
Code Optimization
PPTX
SPI Protocol
Protols used in bluetooth
Multiple Inheritance
Arm processor
Inheritance in OOPS
Embedded C - Optimization techniques
Compiler in System Programming/Code Optimization techniques in System Program...
Introduction to Embedded System
I2C Protocol
Object-Oriented Design: Multiple inheritance (C++ and C#)
Arm developement
Serial Peripheral Interface
I2C Bus (Inter-Integrated Circuit)
Embedded C - Lecture 1
Serial peripheral interface
Serial Peripheral Interface(SPI)
Code Optimization
Ad

Similar to I2C programming with C and Arduino (20)

PPTX
basics of temperature data logger (with energia and stellaris)
PPTX
Embedded Systems Lab Practical PowerPoint presentation with source code
PPTX
INTODUCTION OF IOT AND INTERFACING WITH ARDUINO UNO
DOCX
m.tech esd lab manual for record
DOCX
Real Time Clock Interfacing with FPGA
PDF
EEE UNIT-2 PPT.pdf
PPT
ARDUINO AND ITS PIN CONFIGURATION
PDF
020419.pdf
PDF
I2 c communication between nodemcu and aeduino with dht11 (1)
DOCX
Project
DOCX
ARDUINO BASED TIME AND TEMPERATURE DISPLAY
DOCX
project 3 full report
PDF
CMOS Image Sensor Design_00h20_11_io.pdf
DOCX
Keypad interfacing 8051 -NANOCDAC
PDF
Analog To Digital Conversion (ADC) Programming in LPC2148
PPT
Em s7 plc
PDF
Logic gate tester for IC's ( Digital Electronics and Logic deisgn EE3114 )
PDF
Real Time Clock Interfacing for Arduino
PDF
Arduino experimenters guide hq
PDF
Introduction to Arduino
basics of temperature data logger (with energia and stellaris)
Embedded Systems Lab Practical PowerPoint presentation with source code
INTODUCTION OF IOT AND INTERFACING WITH ARDUINO UNO
m.tech esd lab manual for record
Real Time Clock Interfacing with FPGA
EEE UNIT-2 PPT.pdf
ARDUINO AND ITS PIN CONFIGURATION
020419.pdf
I2 c communication between nodemcu and aeduino with dht11 (1)
Project
ARDUINO BASED TIME AND TEMPERATURE DISPLAY
project 3 full report
CMOS Image Sensor Design_00h20_11_io.pdf
Keypad interfacing 8051 -NANOCDAC
Analog To Digital Conversion (ADC) Programming in LPC2148
Em s7 plc
Logic gate tester for IC's ( Digital Electronics and Logic deisgn EE3114 )
Real Time Clock Interfacing for Arduino
Arduino experimenters guide hq
Introduction to Arduino

Recently uploaded (20)

PDF
Automating ArcGIS Content Discovery with FME: A Real World Use Case
PDF
Dell Pro 14 Plus: Be better prepared for what’s coming
PDF
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Why Endpoint Security Is Critical in a Remote Work Era?
PDF
Google’s NotebookLM Unveils Video Overviews
PDF
SparkLabs Primer on Artificial Intelligence 2025
PDF
creating-agentic-ai-solutions-leveraging-aws.pdf
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
A Day in the Life of Location Data - Turning Where into How.pdf
PDF
Event Presentation Google Cloud Next Extended 2025
PDF
Transforming Manufacturing operations through Intelligent Integrations
PDF
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
PDF
Chapter 2 Digital Image Fundamentals.pdf
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Dell Pro 14 Plus: Be better prepared for what’s coming
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
Understanding_Digital_Forensics_Presentation.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
NewMind AI Weekly Chronicles - August'25 Week I
Why Endpoint Security Is Critical in a Remote Work Era?
Google’s NotebookLM Unveils Video Overviews
SparkLabs Primer on Artificial Intelligence 2025
creating-agentic-ai-solutions-leveraging-aws.pdf
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
NewMind AI Monthly Chronicles - July 2025
A Day in the Life of Location Data - Turning Where into How.pdf
Event Presentation Google Cloud Next Extended 2025
Transforming Manufacturing operations through Intelligent Integrations
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
Chapter 2 Digital Image Fundamentals.pdf
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)

I2C programming with C and Arduino

  • 1. How to use I2C with AVR Sunday, April 28, 13
  • 2. I2C abstract(1) AVR1 AVR2 SCL SDA Vdd I2C is one of communication systems for Microcomputer. I2C uses 2 lines, SCL(clock), SDA(data). Sunday, April 28, 13
  • 3. I2C abstract(2) AVR1 AVR2 SCL SDA SCL(clock) is used to send clock for synchronization. SDA(data) is used for sending data. 1 bit data is transferred every clock. 1 0 1 0 Sunday, April 28, 13
  • 4. I2C abstract(3) Master You can connect more than 2 boards. One board must be Master and the others are Slave. Each slave has own address. Master can send data to each slave using the address. Slave1 Slave2 Slave3 Slave4 SDA address1 address2 address3 address4 SCL Sunday, April 28, 13
  • 5. I2C abstract(4) Master For example, if Master wants to send data to Slave2, Master sends address2 to SDA line.All Slaves receives the address. Only Slave2 replies. Slave1 Slave2 Slave3 Slave4 SDA address1 address2 address3 address4 SCL address2 reply The data is mine! I must send replay. The data is not mine. I will ignore it. The data is not mine. I will ignore it. The data is not mine. I will ignore it. Sunday, April 28, 13
  • 6. I2C abstract(5) Master Next Master sends data to SDA line. Only Slave2 receives the data and reply. Slave1 Slave2 Slave3 Slave4 SDA address1 address2 address3 address4 SCL data reply I’ll receive this data. I must send replay. The data is not mine. I will discard it. The data is not mine. I will discard it. The data is not mine. I will discard it. discard discard discard Sunday, April 28, 13
  • 7. Program I2C with AVR In this instance, you use arduino uno. Arduino uno has Atmega168. I am going to explain how to program Atmega168 with C, without Arduino library. Sunday, April 28, 13
  • 8. Connection SDA pin and SCL pin are fixed. On Arduino Uno, analog4 = SDA, analog 5 = SCL. Connect A4 and A5 of each Arduino. Vcc Sunday, April 28, 13
  • 9. C programming on Arduino IDE Arduino language is based on C. You can use all construction of C. When you write C on Arduino IDE, you have to replace “main and while” with “setup() and loop()”. Initialize process must be inside setup() and loop process must be inside loop(). #include<avr.io.h> void main(int){ //initialize process while(1){ //loop process } } #include<avr.io.h> void setup(){ //initialize process } void loop(){ //loop process } Normal C C on Arduino IDE Sunday, April 28, 13
  • 10. I2C registers(Atmega168 version) If you want to use I2C function on Microcomputer, you have to use registers for I2C. (Sometimes different microcomputers have different registers, you have to see data sheet.) These are I2C resisters(NOT all). TWAR is TWI(Slave) Address Register. Slave address is set in this register. TWBR is TWI Bit Rate Register. This is to decide SCL clock. TWCR is TWI Control Register.You can control I2C with this register. TWDR is TWI Data Register.The data to be transferred or received is set in this register. TWSR is TWI Status Register. The status of I2C communication is set in this register. TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCETWAR TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0 TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0 TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0 TWBR TWCR TWDR TWSR Sunday, April 28, 13
  • 11. The simplest I2C sequence This is the simplest sequence of I2C. If you want to send data more than 1 byte.You have to repeat (4)(5). Master Slave (1)Start (2)Slave Adress (3)Ack (4)Data (5)Ack (6)Stop Sunday, April 28, 13
  • 12. How to use TWBR and TWSR First, you have to decide the communication speed(SCL) with TWBR and TWSR. SCL = CPU clock/(16+2(TWBR)xPrescaler) TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0 TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0 TWBR TWSR Prescaler parameter (ex) TWBR =0b00000001=1 TWBR =0b00000011=3 TWBR =0b11111111 = 255 (ex) CPU clock = 1Mhz TWBR=255 Prescaler=1 SCL = 1000000/(16+2(255)x1)=2kHz (ex) TWBR =(0<<TWPS1)|(0<<TWPS0) : prescaler is 1 TWBR =(0<<TWPS1)|(1<<TWPS0) : prescaler is 4 TWBR =(1<<TWPS1)|(1<<TWPS0) : prescaler is 64 Sunday, April 28, 13
  • 13. How to use TWCR You can control I2C message with TWCR. TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIETWCR Send start condition TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIETWCR Clear TWINT flag after sending message TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIETWCR Send stop condition TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Start condition while(!(TWCR & 1<<TWINT)) {} //After TWCR, always you have to check whether TWINT is updated TWCR = 0b10000100; //flag clear while(!(TWCR & 1<<TWINT)) {} TWCR = 0b10010100; //finish translation while(!(TWCR & 1<<TWINT)) {} Source code sample Sunday, April 28, 13
  • 14. How to use TWSR You can check status of I2C sequence from TWSR. TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0 TWSR Source code sample //check condition if((TWSR & 0xF8) == 0x08){ TWDR = 0b00000010; //set slave address TWCR = 0b10000100; //flag clear while(!(TWCR & 1<<TWINT)) {} _delay_ms(1); if((TWSR & 0xF8) == 0x18){ TWDR = 0b10101010; //write data(1byte) TWCR = 0b10000100; //send data while(!(TWCR & (1<<TWINT))); _delay_ms(1); } } Sunday, April 28, 13
  • 15. The simplest sample (1)Connect A4 and A5 between Master and Slave(You need pull-up resisters) (2)Connect LED and resister to Slave digital 9 (3)Connect MasterV5 to SlaveVin (4)Connect Master GND and Slave GND (5)Connect Master to PC with USB cable (6)Install program from next page Vcc Master Slave LEDGND This sample is to turn on LED connected to Slave using data from Master Sunday, April 28, 13
  • 16. Sample code(master) #include <avr/io.h> #include <util/delay.h> void setup(){ TWSR = (0<<TWPS1)|(0<<TWPS0); //Prescaler TWBR = 0xFF; //TWBR=255 } void loop(){ TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Start condition while(!(TWCR & 1<<TWINT)) {} //wait for flag update _delay_ms(1); if((TWSR & 0xF8) == 0x08){ //check condition TWDR = 0b00000010; //send slave address TWCR = 0b10000100; //flag clear while(!(TWCR & 1<<TWINT)) {} _delay_ms(1); if((TWSR & 0xF8) == 0x18){ //check condition TWDR = 0b10101010; //write data(1byte) TWCR = 0b10000100; //send data while(!(TWCR & (1<<TWINT))); _delay_ms(1); } } TWCR = 0b10010100; //finish translation _delay_ms(2); } Sunday, April 28, 13
  • 17. Sample code(slave) #include <avr/io.h> #include <util/delay.h> void setup(){ DDRB = 0xFF; //all PINB is output mode PORTB = 0x00; //all PINB is Low TWAR = 0b00000010; //salve address setting } void loop(){ TWCR = 0b11000100; //start as slave(wait for address) if((TWSR & 0xF8) == 0x60){ //check status while(1){ TWCR = 0b11000100; //wait for data while(!(TWCR & (1<<TWINT))); if((TWSR & 0xF8) == 0x80){ //check status char data = TWDR; //receive data PORTB = data; //insert data to PORTB } if((TWSR & 0xF8) == 0xA0){ //check stop status _delay_ms(10); break; } } } } Sunday, April 28, 13