搜索
bottom↓
回复: 20

发个汇编写的m8的twi中断(主机发送模式)

[复制链接]

出0入0汤圆

发表于 2005-12-2 20:42:55 | 显示全部楼层 |阅读模式
//****************************TWI 相关****************************************

/*****************TWI中断中要用的常量********************/

.equ        STATE_START                =        0

.equ        STATE_SLAW                =        1

.equ        STATE_COMMAND        =        2

.equ        STATE_ADDRH                =        3

.equ        STATE_ADDRL                =        4

.equ        STATE_DATA                =        5

.equ        STATE_STOP                =        6

/********************************************************/

/* TWSR values (not bits) */

.equ        TW_READ                =        1

.equ        TW_WRITE        =        0

.equ        TWI_ADDRESS        =        0x02

/* Master */

.equ        TW_START                =        0x08

/* Master Transmitter */

.equ        TW_MT_SLA_ACK        =        0x18

.equ        TW_MT_DATA_ACK        =        0x28

//******************************************************************************

        ;I2C初始化

    ;ldi                r16,$0

        ;OUT                TWSR,R16

        LDI                R16,$0e

        OUT                TWBR,R16 ;400K

        LDI                R16,$0

        OUT                TWAR,R16 ;SLAVE ADDRESS,BROADCAST ADDRESS EN

        LDI                R16,$85

        OUT                TWCR,R16  ;  INT EN    ;TWI  EN  



//******************************************************************************

TWI_TRANS_INT:



                ;用寄存器R16,R17作为局部变量                       

                ;中断入口保护

                 PUSH        R16

                 PUSH        R17



                 IN         temvar2        ,TWSR

                 ANDI        temvar2        ,0xf8    ;----------找出状态                       

START_DEAL:

                 CPI        TWI_STATE,STATE_START

                 BRNE        SLAW_DEAL

                 CPI        temvar2        ,TW_START

                 BRNE        START_ERROR



                                

                 LDI        R16,TWI_ADDRESS|TW_WRITE   ;从机地址设为02

                 OUT        TWDR,R16       

                 

                 LDI        R16,0x85        ;clear  twsta

                 OUT        TWCR,R16

                                 

                 LDI        TWI_STATE,STATE_SLAW                       

                 RJMP   TWI_TRANS_END       



START_ERROR:

                 RJMP        TWI_TRANS_ERROR

;---------------------------------------------------------------------

SLAW_DEAL:

                 CPI        TWI_STATE,STATE_SLAW

                 BRNE        ADDH_DEAL

                 CPI        temvar2,TW_MT_SLA_ACK

                 BRNE        SLAW_ERROR



                 OUT        TWDR,COMMAND



                 CPI        COMMAND,$1

                 BREQ        OPEN_BACKLIGHTS

                 CPI        COMMAND,$2

                 BREQ        CLOSE_BACKLIGHTS

                 CPI        COMMAND,$3

                 BREQ   ADDRESS_TRANS

                 CPI        COMMAND,$4

                 BREQ        DATA_TRANS                                     

SLAW_ERROR:

                 RJMP        TWI_TRANS_ERROR       

;--------------------------------------------------

OPEN_BACKLIGHTS:                

CLOSE_BACKLIGHTS:

                 LDI        TWI_STATE,STATE_STOP

                 LDI        R16,0x85

                 OUT        TWCR,R16

                 RJMP        TWI_TRANS_END



ADDRESS_TRANS:

                 LDI        TWI_STATE,STATE_ADDRH

                 LDI        R16,0x85

                 OUT        TWCR,R16

                 RJMP        TWI_TRANS_END

DATA_TRANS:

                 LDI        TWI_STATE,STATE_DATA

                 LDI        R16,0x85

                 OUT        TWCR,R16

                 RJMP        TWI_TRANS_END

;-------------------------------------------------------------------

ADDH_DEAL:

                CPI                TWI_STATE,STATE_ADDRH

                BRNE        ADDL_DEAL

            RCALL        RED_LED_SHINE

                CPI                temvar2,TW_MT_DATA_ACK

                BRNE        TWI_TRANS_ERROR



                OUT                TWDR,ADDRH



                LDI        R16,0x85        ;clear  twsta

                OUT        TWCR,R16                 

                LDI                TWI_STATE,STATE_ADDRL

                RJMP        TWI_TRANS_END

ADDL_DEAL:

                CPI                TWI_STATE,STATE_ADDRL

                BRNE        DATA_DEAL

            RCALL        GREEN_LED_SHINE          ; green led ------------------------               

                CPI                temvar2,TW_MT_DATA_ACK

                BRNE        TWI_TRANS_ERROR

               

                OUT                TWDR,ADDRL

                LDI                R16,0x85        ;clear  twsta

                OUT                TWCR,R16                 

                LDI                TWI_STATE,STATE_STOP

                RJMP        TWI_TRANS_END



;--------------------------------------------------------------------------

DATA_DEAL:

                CPI                TWI_STATE,STATE_DATA

                BRNE        STOP_DEAL

            CPI                temvar2,TW_MT_DATA_ACK

                BRNE        TWI_TRANS_ERROR     ;R10  = TWI_TRANS_SIZE



                LD                R16,Z+

                ;LPM                R16,Z+

                OUT                TWDR,R16       

               

                LDI                R16,0x85        

                OUT                TWCR,R16

                 

                DEC                TWI_TRANS_SIZE

                BREQ        DATA_TRANS_END



                LDI                TWI_STATE,STATE_DATA

                RJMP        TWI_TRANS_END

DATA_TRANS_END:

                ;RCALL        GREEN_LED_SHINE          ; green led ------------------------                         

                LDI                TWI_STATE,STATE_STOP                       

                RJMP    TWI_TRANS_END               





STOP_DEAL:

                CPI                TWI_STATE,STATE_STOP

                BRNE        TWI_TRANS_ERROR

            CPI                temvar2,TW_MT_DATA_ACK

                BRNE        TWI_TRANS_ERROR

                 

                LDI                R16,0x95   ;---发结束位

                OUT                TWCR,R16       

                LDI                TWI_STATE,0

               

                RJMP        TWI_TRANS_END

                                

TWI_TRANS_ERROR:

                LDI                R16,$95   ;---发结束位

                OUT                TWCR,R16       

                LDI                TWI_STATE,0                                 



TWI_TRANS_END:

                 POP        R17

                 POP        R16

                 RETI

出0入0汤圆

 楼主| 发表于 2005-12-2 20:46:40 | 显示全部楼层
此中断函数作用是向从机mega8发送数据,从机mega8是液晶的驱动芯片。

command =1 为开背光;

command =2 为关背光;

command =3 为发送地址;

command =4 为发送数据;



程序已经验证,可能有些罗嗦,因为我就用汇编做过两个项目,呵呵 大家多提意见。

出0入0汤圆

 楼主| 发表于 2005-12-2 20:51:30 | 显示全部楼层
以上的函数也可移植到m64上,只要修改对twi的寄存器的操作指令即可,因为m64的twi寄存器地址超出了in out的操作范围,可用sts等把twi寄存器看作sram寄存器的指令来代替。

出0入0汤圆

发表于 2006-3-8 22:03:05 | 显示全部楼层
这么好的东东,怎么没有人顶啊!这个网站的会员使用汇编的真的这么少吗?

出0入0汤圆

发表于 2006-3-22 15:22:34 | 显示全部楼层
现在要求两种都要会,两种都要硬

出0入0汤圆

 楼主| 发表于 2006-3-23 08:53:07 | 显示全部楼层
:)这个帖子发了好久,终于有人帮顶了! 多谢多谢啊! 一会送上我的串口中断程序!  嘿嘿
-----此内容被sswanglei于2006-03-23,08:56:28编辑过

出0入0汤圆

发表于 2006-3-23 09:46:46 | 显示全部楼层
多谢.先收藏了.

出0入0汤圆

发表于 2006-3-23 21:36:47 | 显示全部楼层
还有串口中断程序啊!也是汇编的吗?

我现在在学AVR,一直是用汇编的,很想找到有关汇编的例子,期待!

出0入0汤圆

发表于 2006-3-23 21:46:28 | 显示全部楼层
AVR 指令集的核心设计思路就是以接近 ANSI C 伪码为最终目标的,换句话说,C 语言才是 AVR 最适宜的编程语言,或许一些要精确到百纳秒级的时序相关操作因为考虑到编译器优化的作用而必须用汇编来写,但既然 TWI 根本是毫秒级的动作,何必非用汇编这种难写难记难看的东西?

出0入0汤圆

发表于 2006-3-24 09:51:45 | 显示全部楼层
适合的就是最好了,用汇编有什么不好,汇编就一定难懂吗?语言只是工具而已,争来争去的...

出0入0汤圆

发表于 2006-3-24 10:02:45 | 显示全部楼层
汇编无助于别人与自己的技术交流



汇编会妨碍别人接手自己作的项目



汇编会严重阻碍自己将来技术转型



家爵牌铁锤是工具,氢弹也是工具



但有铁锤的只能敲死四个狼狈逃窜



有氢弹的便可毫无畏惧的无恶不作



这样你能说,工具都是一样的么?

出0入0汤圆

发表于 2006-3-24 10:09:01 | 显示全部楼层
不赞成只学汇编。建议以C为主,汇编为辅。



C的优点很多......[省略1000字,自己看书吧],对于高速或特殊场合,可以通过嵌入汇编来解决。



除非是用只有512B/1KB/2KB之类的小芯片,那只好用汇编了。

出0入0汤圆

发表于 2006-3-24 21:45:19 | 显示全部楼层
我想自己用汇编做了一个项目以后,再转向C!

要不然学了这么久的汇编,又没有做出一个项目来,感觉没有一点成就感!

出0入0汤圆

发表于 2006-3-24 21:54:48 | 显示全部楼层
檀越,着相了

出0入0汤圆

 楼主| 发表于 2006-4-4 15:13:10 | 显示全部楼层
:( 我现在用汇编做了2个项目了,想赶紧转c,用汇编作控制还可以,如果牵扯到复杂的算法,那就太麻烦了。





http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=606327&bbs_page_no=1&bbs_id=1000

这是我用汇编写的串口中断程序。
-----此内容被sswanglei于2006-04-04,15:14:52编辑过

出0入0汤圆

发表于 2006-4-4 18:36:29 | 显示全部楼层
支持楼主,并向楼主学习!

出0入0汤圆

发表于 2006-4-4 21:07:52 | 显示全部楼层
其实只要达到了一定境界,都是一样的



C还不是要编译成汇编,学好汇编对写C很有帮助的,不同级别的人写出的C程序编译出来的效率肯定是不一样的,只有掌握了汇编才能更好的把握C,单片机跟PC机在资源上还是有很大区别的,个人见解

出0入0汤圆

发表于 2007-6-19 16:17:07 | 显示全部楼层
好东东,但是看不懂.

出0入0汤圆

发表于 2007-10-31 15:05:45 | 显示全部楼层
我也是刚接触AVR,想做几个项目,现在学着用汇编,想找几个编译通过完整的汇编的程序
最好是采用M8,M16也可以了
哪位能提供我两个作模板呢?
不然自己的程序缺乏规范性!
谢谢

出0入0汤圆

发表于 2008-1-20 15:45:41 | 显示全部楼层
好东西,找个汇编例子不容易啊!

出0入0汤圆

发表于 2009-6-9 17:27:39 | 显示全部楼层
这个论坛还是不要发汇编的东西了.找骂
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 07:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表