beautypg.com

Atmega16(l) – Rainbow Electronics ATmega64L User Manual

Page 176

background image

176

ATmega16(L)

2466B–09/01

Assembly code example

C example

Comments

1

ldi

r16, (1<

(1<

out

TWCR, r16

TWCR = (1<

(1<

Send START condition

2

wait1:

in

r16,TWCR

sbrs

r16,TWINT

rjmp

wait1

while

(!(TWCR & (1<

;

Wait for TWINT flag set. This indicates
that the START condition has been
transmitted

3

in

r16,TWSR

andi

r16, 0xF8

cpi

r16, START

brne

ERROR

if

((TWSR & 0xF8) != START)

ERROR();

Check value of TWI Status Register. Mask
prescaler bits. If status different from
START go to ERROR

ldi

r16, SLA_W

out

TWDR, r16

ldi

r16, (1<

out

TWCR, r16

TWDR = SLA_W;

TWCR = (1<

Load SLA_W into TWDR register. Clear
TWINT bit in TWCR to start transmission
of address

4

wait2:

in

r16,TWCR

sbrs

r16,TWINT

rjmp

wait2

while

(!(TWCR & (1<

;

Wait for TWINT flag set. This indicates
that the SLA+W has been transmitted,
and ACK/NACK has been received.

5

in

r16,TWSR

andi

r16, 0xF8

cpi

r16, MT_SLA_ACK

brne

ERROR

if

((TWSR & 0xF8) != MT_SLA_ACK)

ERROR();

Check value of TWI Status Register. Mask
prescaler bits. If status different from
MT_SLA_ACK go to ERROR

ldi

r16, DATA

out

TWDR, r16

ldi

r16, (1<

out

TWCR, r16

TWDR = DATA;

TWCR = (1<

Load DATA into TWDR register. Clear
TWINT bit in TWCR to start transmission
of address

6

wait3:

in

r16,TWCR

sbrs

r16,TWINT

rjmp

wait3

while

(!(TWCR & (1<

;

Wait for TWINT flag set. This indicates
that the DATA has been transmitted, and
ACK/NACK has been received.

7

in

r16,TWSR

andi

r16, 0xF8

cpi

r16, MT_DATA_ACK

brne

ERROR

if

((TWSR & 0xF8) != MT_DATA_ACK)

ERROR();

Check value of TWI Status Register. Mask
prescaler bits. If status different from
MT_DATA_ACK go to ERROR

ldi

r16, (1<

(1<

out

TWCR, r16

TWCR = (1<

(1<

Transmit STOP condition