音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

高手指點(diǎn)一下mega8的I2C,不勝感激

作者:cpldx 欄目:單片機(jī)
高手指點(diǎn)一下MEGA8的I2C,不勝感激
為什么I2C置標(biāo)志置位進(jìn)不了中斷,定時(shí)器,外中斷都可以,是我弄錯(cuò)了,還是怎么回事,煩請(qǐng)高手指點(diǎn),以及其注意事項(xiàng),謝謝


2樓: >>參與討論
david1234
slaver or MASTER?
 
3樓: >>參與討論
cpldx
都是這樣啊
    ldi    TEMP,0x20        ;設(shè)置波特率
    out      TWBR,TEMP
    ldi      TEMP,0x00
    out    TWSR,TEMP
    
主機(jī),我用查詢方式    
    
ldi r16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR, r16    
wait1:
in r16,TWCR
sbrs r16,TWINT
rjmp wait1    
in r16,TWSR
andi r16, 0xF8
cpi r16, 0x08
brne ERROR    
ldi r16, 0x02
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16    
wait2:
in r16,TWCR
sbrs r16,TWINT
rjmp wait2    
in r16,TWSR
andi r16, 0xF8
cpi r16, 0x18
brne ERROR    
ldi r16, 0xff
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16    
wait3:
in r16,TWCR
sbrs r16,TWINT
rjmp wait3    
in r16,TWSR
andi r16, 0xF8
cpi r16, 0x28
brne ERROR    
ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR, r16    
    
error:    rjmp    error    



                    從機(jī)中斷


ldi    TEMP,SLA        ;從機(jī)地址
    out    TWAR,TEMP
    ldi    TEMP,(1<<TWEN)|(1<<TWIE)|(TWEA);開(kāi)I2中斷
    out    TWCR,TEMP
    sei
wait1:    sbrs    bvalid,0
    rjmp    wait1
    clr    bvalid
tt:    rjmp    tt

I2int:              cbi    PORTB,0
kk:              rjmp    kk
    in    TEMP,TWSR        ;檢測(cè)TWI狀態(tài)寄存器TWSR,屏蔽預(yù)分頻位
    andi    TEMP,0xf8
    cpi    TEMP,0x60        ;如果不是SLA+W轉(zhuǎn)移
    brne    end
    ldi    TEMP,(1<<TWINT)|(1<<TWEA)
    out    TWCR,TEMP
wait2:    in    TEMP,TWCR
    sbrs    TEMP,TWINT
    rjmp    wait2            ;等待TWINT置位
    in    TEMP,TWSR
    andi    TEMP,0xf8
    cpi    TEMP,0x88        ;如果不是SLA+W尋址,DATA已經(jīng)收到,NACK已經(jīng)發(fā)出,轉(zhuǎn)移
    brne    end
    in    MOrder,TWDR        ;讀出主機(jī)命令
    clr    TEMP
    out    TWCR,TEMP
    ldi    TEMP,Time1_scaler    ;開(kāi)定時(shí)器
    out    TCCR1B,TEMP
    ldi    TEMP,(1<<TWINT)|(1<<TWEA)|(1<<TWEN);轉(zhuǎn)入被控初始狀態(tài),進(jìn)行本機(jī)SLA匹配
    out    TWCR,TEMP  
wait3:    in    TEMP,TWCR
    sbrs    TEMP,TWINT
    rjmp    wait3
    in    TEMP,TWSR
    andi    TEMP,0xf8
    cpi    TEMP,0xa8        ;收到本機(jī)SLA+R,ACK已經(jīng)發(fā)出
    brne    end
    out    TWDR,MOrder        ;發(fā)送剛剛受到的命令
    ldi    TEMP,(1<<TWINT)|(1<<TWEN);發(fā)送最后一個(gè)DATA,接收NACK信號(hào)
    out    TWCR,TEMP
wait4:    in    TEMP,TWCR
    sbrs    TEMP,TWINT
    rjmp    wait4
    in    TEMP,TWSR
    andi    TEMP,0xf8
    cpi    TEMP,0xc0        ;如果不是DATA已經(jīng)發(fā)出,受到NACK信號(hào),轉(zhuǎn)移
    brne    end
    ldi    TEMP,(1<<TWINT)|(1<<TWEA);轉(zhuǎn)入被控初始狀態(tài),進(jìn)行本機(jī)SLA匹配
    out    TWCR,TEMP
    call    delay
wait5:    sbic    PINB,OK            ;等待主機(jī)應(yīng)答信號(hào)
    rjmp    wait5
    cbi    PORTB,Answer        ;應(yīng)答主機(jī)
    call    delay
    sbi    PORTB,Answer
    sbr    bvalid,0x01        
end:    clr    TEMP
    out    TWCR,TEMP
    reti

開(kāi)始我主機(jī)也是用的中斷,不行,我又改為查詢方式
還是不行,資料上都說(shuō)寫1清TWINT,但是我用軟件
仿真是清不掉的,怎么回事??


4樓: >>參與討論
david1234
這是我從程序中拷出來(lái)的,實(shí)際中肯定能用
    ; *** Init I2C ***
    outi    twbr,(ck-16*sclk)/(2*sclk)    ; i2c clock


.equ    START        = 0x8
.equ    MT_SLA_ACK    = 0x18
.equ    MT_DATA_ACK    = 0x28
.equ    MR_SLA_ACK    = 0x40
.equ    MR_DATA_ACK    = 0x50
.equ    MR_DATA_NACK    = 0x58
;************************************
;    i2c write, write a string
;    entry: iicadd, iicnumber-- numbers to be write, X-- data pointer
;    exit: c=0 ok; c=1 failed
;***********************************
i2cwr:
    outi    TWCR,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)    ; i2c start
    in    r16,TWCR
    sbrs    r16,TWINT
    rjmp    pc-2        ; waite
    in    r16,TWSR
    andi    r16,0xf8    ; mask prescale bits
    cpi    r16,START    ; if start?
    brne    error    
    
    out    TWDR,iicadd    ; write i2c DEVICE address
    sts    lastadd,iicadd
    cbi    TWDR,0        ; i2c write
    outi    TWCR,(1<<TWINT)|(1<<TWEN)    ;
    in    r16,TWCR
    sbrs    r16,TWINT
    rjmp    pc-2        ; waite
    in    r16,TWSR
    andi    r16,0xf8    ; mask prescale bits
    cpi    r16,MT_SLA_ACK    ; if address ack?
    brne    error

i2cwr_lp:    
    ld    r16,x+        ; get data
    out    TWDR,r16
    outi    TWCR,(1<<TWINT)|(1<<TWEN)    ;
    in    r16,TWCR
    sbrs    r16,TWINT
    rjmp    pc-2        ; waite
    in    r16,TWSR
    andi    r16,0xf8    ; mask prescale bits
    cpi    r16,MT_DATA_ACK    ; if data ack?
    brne    error
    dec    iicnumber
    brne    i2cwr_lp
            
    outi    TWCR,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)    ; i2c stop
    clc
    ret
    
    
error:    sec
    ret    
    
;*********************************************
;    i2c read, ONLY read one byte
;    entry: iicadd
;    exit: r16--data, c=0 ok; c=1 failed
;*********************************************    
i2crd:
    outi    TWCR,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)    ; i2c start
    in    r16,TWCR
    sbrs    r16,TWINT
    rjmp    pc-2        ; waite
    in    r16,TWSR
    andi    r16,0xf8    ; mask prescale bits
    cpi    r16,START    ; if start?
    brne    error    
    
    out    TWDR,iicadd    ; write i2c DEVICE address
    sbi    TWDR,0        ; i2c read
    outi    TWCR,(1<<TWINT)|(1<<TWEN)    ;
    in    r16,TWCR
    sbrs    r16,TWINT
    rjmp    pc-2        ; waite
    in    r16,TWSR
    andi    r16,0xf8    ; mask prescale bits
    cpi    r16,MR_SLA_ACK    ; if address ack?
    brne    error

    outi    TWCR,(1<<TWINT)|(1<<TWEN)    ;
    in    r16,TWCR
    sbrs    r16,TWINT
    rjmp    pc-2        ; waite
    in    r16,TWSR
    andi    r16,0xf8    ; mask prescale bits
    cpi    r16,MR_DATA_NACK ; if final data?
    brne    error    
    in    r16,TWDR

    PUSH    r16
    outi    TWCR,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)    ; i2c stop
    pop    r16
    clc
    ret



5樓: >>參與討論
david1234
補(bǔ)充一下OUTI的宏定義:
; OUTPUT immediate
;
;    outi    PORT,var

.macro    outi
    ldi    r16,@1
    out    @0,r16
.endm



6樓: >>參與討論
cpldx
多謝指點(diǎn),問(wèn)題已經(jīng)搞定
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
單片機(jī)系統(tǒng)設(shè)計(jì),高手指點(diǎn)
關(guān)于pwm的問(wèn)題
鐵電存儲(chǔ)器的用法
請(qǐng)教AVR8515的多機(jī)通訊
如何用單片機(jī)寫Modem的AT命令
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)