AVR汇编百例晋级篇参考程序.docx
《AVR汇编百例晋级篇参考程序.docx》由会员分享,可在线阅读,更多相关《AVR汇编百例晋级篇参考程序.docx(45页珍藏版)》请在冰豆网上搜索。
AVR汇编百例晋级篇参考程序
; 以下提供几个补充参考程序,都带有详细说明和指令注释.它们是主从多机通讯程序,采
;用中断方式写入EEPROM,直接对晶振分频产生0.1秒和秒号的精确定时程序,以及RS-232/
;RS-485标准转换程序,AVR频率计程序,串行时锺日历芯片DS1302读写,共享时基的PWM输出、
;输入捕获测周期程序和定时信号获取,以及DS18B20测温等程序.多机通讯主要用8和9位数
;据模式区分被选分机(9位)和其它分机(8位),达到主机只与被选分机交换数据之目的.以中
;断方式写EEPROM的优点是可与系统运行同时进行(即在线写入),占用很少机时.
;精确定时用定时/计数器1(或0)直接对MCU主频(不设分频)设定时间常数,分频精度可达到
;1HZ.RS-232/RS-485标准转换程序中AVR不作中转,使两种器件相关脚位直接连接.以TCNT0
;定时,以T0引脚接收RS-232数据.以收到RS-232字符起始位下跳沿或结束符($03)为依据,
;控制切换RS-485的收发使能.(系统中的主AVR可兼做对通信标准之监控转换,即只是在完成
;主要工作任务的同时'附带'进行).具体过程不再细述.串行时锺日历芯片DS1302具体积小,
;可靠性高,与单片机连接方便等优点.
; 以下程序请参看有关章节或程序中的注释。
;范例91;多机通讯主机程序/晶振4MHZ
.ORG0;以8/9位数据模式区分被选/未被选分机通讯
.EQUDTPINT=$180;UBRR=12波特率19200(REL.ERR.=0.16%)
.EQUDRPINT=$1C0;主机对1#,2#,3#,4#分机发送数据块在$180-18F,$190-19F,$1A0-1AF)和$1B0-1BF
STRT38:
RJMPRST38;主机从1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF
.ORG$00B;
RJMPSTRT38
.ORG$00C
RJMPSTRT38;主机不设串口中断,只以查询接收
.ORG$011
RST38:
LDIR16,12
OUTUBRR,R16;设波特率:
[BAUDRATE=FCP/16(UBRR+1)]
CLRR15;初始化分机号
LDIR27,HIGH(DTPINT)
LDIR26,LOW(DTPINT);发送数据指针(首指$180)
LDIR29,HIGH(DRPINT)
LDIR28,LOW(DRPINT);接收数据指针(首指$1C0)
NEXTNO:
LDIR16,$18
OUTUCR,R16;允许UART接收和发送,8位数据模式
INCR15;指向1#分机
OUTLP:
OUTUDR,R15;呼分机号,1:
1#/2:
2#/03:
3#/04:
4#...
TSLOP:
INR16,USR
SBRSR16,7
RJMPTSLOP;分机返回机号?
INR16,UDR
CPR16,R15;分机号正确返回?
BRNEOUTLP
LDIR16,$1C;改为9位数据模式TXB8=0
OUTUCR,R16;
TXLOP:
LDR16,X+
OUTUDR,R16;向分机发送数据块
TESTL:
INR17,USR
SBRSR17,5
RJMPTESTL;等待发送完成
CPIR16,$0A
BRNETXLOP;
RXTST:
INR17,USR
SBRSR17,7;RXC=1收到数据
RJMPRXTST;等待接收分机返回数据块
INR16,UDR
STY+,R16;存储接收数据
CPIR16,$0A;分机数据块发完?
BRNERXTST
MOVR16,R15
CPIR16,4;与分机轮询通讯完毕?
BRNENEXTNO;未完转对下一分机通信
HH38:
RJMPHH38;否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询)
.DSEG
.ORG$180
DTPINT:
.BYTE$40
;$41$45$65$73$46$42$40$6F$33$44$66$5C$4D$4B$0D$0A
;$42$4F$66$78$47$45$44$63$32$48$60$7C$6D$45$0D$0A
;$43$56$55$53$4D$4F$40$2E$31$42$67$4C$47$4A$0D$0A
;$45$54$59$63$3D$4B$48$2F$35$48$69$3C$77$43$0D$0A
.ORG$1C0
DRPINT:
.BYTE$40
;范例92
.ORG0;多机通讯1#分机程序/晶振4MHZ
.EQUDTPIT1=$180;(UBRR)=12波特率为19200(REL.ERR.=0.16%)
.EQUDRPNT1=$1C0
STRT39:
RJMPRST39
.ORG$00B
RJMPUARXC;8535UART接收完成中断
.ORG$00C
RJMPUATXC;UART发送完成中断
.ORG$011
RST39:
CLRR18;清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7)
LDIR16,12
OUTUBRR,R16;设波特率[BAUDRATE=4000000/16*(12+1)=19200]
LDIR16,HIGH(DRPNT1)
MOVR8,R16
LDIR16,LOW(DRPNT1)
MOVR9,R16;r8,r9:
接收数据指针(FIRSTPOINTTO$1C0)
LDIR16,$98;允许UART中断接收,8位数据模式
OUTUCR,R16
SEI
RXDTS:
SBRSR18,6;主机呼号已收到(若收到,在R17中)?
RJMPRXDTS
OUTUDR,R17;返还该机号
TXDON:
INR16,USR
SBRSR16,5
RJMPTXDON;该机号发送完成?
LDIR16,$9C;允许UART中断接收,9位数据模式,TXB8=0
OUTUCR,R16
RCVBLK:
SBRSR18,7
RJMPRCVBLK;主机发来数据块已接收完毕?
LDIR16,HIGH(DTPIT1)
MOVR6,R16
LDIR16,LOW(DTPIT1)
MOVR7,R16;设发送数据指针r6r7,首指$180
LDIR16,$3C;允许UART中断发送,9位数据模式,TXB8=0
OUTUCR,R16
TXDN:
SBICUCR,5
RJMPTXDN;发送完毕?
RJMPRST39;
:
UART中断接收程序
UARXC:
SBICUSR,4
RETI;祯错误(主机正与其它分机进行9位数据模式通信),不予接收
INR14,SREG;保存当前状态
TSTR18
BREQNUMB;(R18)=0时收到数据,只可能是机号,转去核实
PUSHR16;否则为主机向本分机发来数据块(9位模式,机号已符合)
PUSHR26
PUSHR27
INR17,UDR;接收数据
MOVXH,R8
MOVXL,R9;取接收数据指针
STX+,R17;转入RAM
MOVR8,XH
MOVR9,XL;存数据指针
CPIR17,$0A;是数据块结束符LF?
BRNERSCOM1
SBRR18,$80;收到完整数据块标志
RSCOM1:
POPR27
POPR26
POPR16
DRETI:
OUTSREG,R14
RETI
NUMB:
INR17,UDR;取出数据
CPIR17,1;是1#分机?
2#分机与$02比较/3#分机与$03比较...
BRNEDRETI;机号不符合,转!
SBRR18,$40;建机号符合标志
RJMPDRETI
;UART中断发送程序
UATXC:
PUSHR16;r6r7:
发送数据指针,首指$180
INR16,SREG
PUSHR16
PUSHR26
PUSHR27
MOVXH,R6
MOVXL,R7;取出发送指针
LDR16,X+;取数据,调指针
MOVR6,XH
MOVR7,XL
OUTUDR,R16;送入发送寄存器
CPIR16,$0A
BRNESDCOM
CBIUCR,5;发送最后1个字符后,禁止发送寄存器空中断(CLRUDRIE)
LDIR16,HIGH(DRPINT)
MOVR8,R16
LDIR16,LOW(DRPINT)
MOVR9,R16;接收数据指针初始化(POINTTO$1C0)
SDCOM:
POPR27
POPR26
POPR16
OUTSREG,R16
POPR16
RETI
.DSEG
.ORG$180
DTPIT1:
.BYTE$40
.ORG$1C0
DRPNT1:
.BYTE$10
;$41$45$65$73$46$42$40$6F$33$44$66$5C$4D$4B$0D$0A
;范例93
;以中断方式写入EEPROM(仅对8535,8515无此功能),克服查询方式占用过多机时的缺点,
;并可在线写入
;运作过程特点如下:
;
(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位
;
(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成
;(3)本程序为一写入特例,写入地址为$100--$1FF,可作适当修改(如设块长计数器等)
;(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套
;(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序
;(6)如能确信当前系统没有EEPROM正在写入,可删除对其进行查询部分.
STWEEP:
LDIR16,HIGH(ramend)
OUTSPH,R16
LDIR16,LOW(ramend)
OUTSPL,R16
SBIEECR,3;设置EEPROM就绪(ready)中断使能位
SEI;中断总使能
RJMPSRTW
.ORG$00F
RJMPEEPRDY;8535EEPROM就绪(ready)中断向量
SRTW:
LDIYH,1
LDIYL0;EEPROM写入首地址:
$100
LDIXL,$60;欲写入数据块首地址:
$60
CLRXH
WEEP0:
SBICEECR,1;当前有EEPROM写入操作,有则等待写入完成
RJMPWEEP0
RCALLWREEP;写入第一个字节,($60)->$100,写入完成后,EEWE=0时引发EEPROM就绪中断
INCYL;调整写入地址指针
HHWEEP:
TSTYL
BRNEHHWEEP
CPIYH,2;写入地址达到$2