AVRmega8汇编指令汇总.
- 格式:doc
- 大小:20.00 KB
- 文档页数:6
一个A VR(mega8)上非常好用的串口程序当然这个程序也可以很容以的移植到其他avr芯片上。
接受发送都使用中断。
编译程序使用GCC(winavr)uart.h/************************************************* ** 作者:望望** 2005年1月23日** 目标MCU:MEGA8 晶振:外部(EXT) *************************************************/#ifndef _W_UART_H_#define _W_UART_H_#include <avr/io.h>#define REC_CAP 20 //接收缓冲区大小#define SEND_CAP 200 //发送缓冲区大小//标志位#define SEND_OVER 0 //发送结束extern volatile unsigned char FLAG_UART;extern unsigned int rec_tail,rec_head;extern unsigned char rec_buf[];extern unsigned int send_tail,send_head;extern unsigned char send_buf[];extern int i_uart_getchar(void);extern int i_uart_add2buf(char c);extern void i_uart_pstr(unsigned char *buf);extern void i_uart_sendbuf(void);extern int i_uart_putchar(char c);extern void i_uart_putstr(unsigned char *buf,unsigned char size);/* UART初始化*/extern void uart_init(void);#endifuart.c/************************************************* ** 作者:望望** 2005年1月23日** 目标MCU:MEGA8 晶振:外部(EXT) *************************************************/#include <avr/io.h>#include <avr/signal.h>#include "uart.h"typedef void (*voidFun08)(unsigned char);volatile static voidFun08 UartRxFunc;volatile unsigned char FLAG_UART=0;//---------环形buf特性-----------------////--放入数据从头指针,取数据从尾指针---//unsigned int rec_tail=0,rec_head=0;unsigned char rec_buf[REC_CAP];unsigned int send_tail=0,send_head=0;unsigned char send_buf[SEND_CAP];void uartSetRxHandler(void (*rx_func)(unsigned char c)) {UartRxFunc = rx_func;}//-------------UART接收完成中断----------------------// SIGNAL(SIG_UART_RECV){unsigned char c;// get received charc = UDR;// if there's a user function to handle this receive eventif(UartRxFunc){UartRxFunc(c);}else{rec_buf[rec_head]=c;rec_head=(rec_head<(REC_CAP-1))?(rec_head+1):0;}}int i_uart_getchar(void){unsigned char c;if(rec_tail!=rec_head){c=rec_buf[rec_tail];rec_tail=(rec_tail<(REC_CAP-1))?(rec_tail+1):0;return c;}else{return -1;}}//------------UART发送完成中断----------------------// SIGNAL(SIG_UART_TRANS)if(send_tail!=send_head){UDR=send_buf[send_tail];send_tail=(send_tail<(SEND_CAP-1))?(send_tail+1):0;}else{FLAG_UART|=_BV(SEND_OVER); //置标志位,表示发送缓冲区完成;}}int i_uart_add2buf(char c){send_buf[send_head]=c;send_head=(send_head<(SEND_CAP-1))?(send_head+1):0;return 0;}void i_uart_pstr(unsigned char *buf){unsigned char i;i=0;while(*(buf+i)!=0){i_uart_add2buf(*(buf+i));i++;}}void i_uart_sendbuf(void){if(((FLAG_UART&_BV(SEND_OVER))==_BV(SEND_OVER))&&(send_tail!=send_head)) {FLAG_UART&=~_BV(SEND_OVER);UDR=send_buf[send_tail];send_tail=(send_tail<(SEND_CAP-1))?(send_tail+1):0;}}int i_uart_putchar(char c){if((FLAG_UART&_BV(SEND_OVER))!=_BV(SEND_OVER)){send_buf[send_head]=c;send_head=(send_head<(SEND_CAP-1))?(send_head+1):0;}else{UDR=c;FLAG_UART&=~_BV(SEND_OVER);}return 1;void i_uart_putstr(unsigned char *buf,unsigned char size){unsigned char i;for(i=0;i<size;i++){i_uart_putchar(*(buf+i));}}/*----------------设置奇偶校验---------------*//* 0:N无1:E偶2:O奇*//*----------------设置停止位------------------*//* 0:1位1:2位*/void set_verify(unsigned char sc,unsigned char sd){sc=(sc>0)?(sc+1):0;UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0)|(sc<<4)|(sd<<3);}// set the uart baud ratevoid uartSetBaudRate(unsigned long baudrate){// calculate division factor for requested baud rate, and set itunsigned int bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1);UBRRL = bauddiv;#ifdef UBRRHUBRRH = bauddiv>>8;#endif}/* UART初始化*/void uart_init(void){UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE)|_BV(TXCIE);//允许发送和接收//8位数据+1位STOP位偶校验uartSetBaudRate(9600); //设定波特率set_verify(0,0); //无校验,1位停止位#ifdef INTERRUPT_SEND_AND_RECFLAG_UART|=_BV(SEND_OVER);//打开发送完成标志位UartRxFunc = 0; //接收函数初始化#endif}。
Instruction mnemonicsThe Assembler accepts mnemonic instructions from the instruction set.A summary of the instruction set mnemonics and their parameters is given here.For a detailed description of the Instruction set,refer to the AVR Data Book.Arithmetic and Logic InstructionsMnemonic Operands Description Operation Flags CyclesADD聽Rd,Rr聽Add without Carry聽Rd=Rd+Rr聽Z,C,N,V,H,S聽1ADC Rd,Rr Add with Carry Rd=Rd+Rr+CZ,C,N,V,H,S1ADIW Rd,K Add Immediate ToWordRd+1:Rd,K Z,C,N,V,S2SUB Rd,Rr Subtract without Carry Rd=Rd-Rr Z,C,N,V,H,S1 SUBI Rd,K8Subtract Immediate Rd=Rd-K8Z,C,N,V,H,S1SBC Rd,Rr Subtract with Carry Rd=Rd-Rr-CZ,C,N,V,H,S1SBCI Rd,K8Subtract with CarryImmedtiateRd=Rd-K8-CZ,C,N,V,H,S1AND Rd,Rr Logical AND Rd=Rd路Rr Z,N,V,S聽1ANDI Rd,K8Logical AND withImmediateRd=Rd路K8Z,N,V,S1OR Rd,Rr Logical OR Rd=Rd V Rr Z,N,V,S1ORI Rd,K8Logical OR withImmediateRd=Rd V K8Z,N,V,S1EOR Rd,Rr Logical Exclusive OR Rd=Rd EORRrZ,N,V,S1COM Rd One's Complement Rd=$FF-Rd Z,C,N,V,S1 NEG Rd Two's Complement Rd=$00-Rd Z,C,N,V,H,S1 SBR Rd,K8Set Bit(s)in Register Rd=Rd V K8Z,C,N,V,S1CBR Rd,K8Clear Bit(s)in Register Rd=Rd路($FF-K8)Z,C,N,V,S1INC Rd Increment Register Rd=Rd+1Z,N,V,S1 DEC Rd Decrement Register Rd=Rd-1Z,N,V,S1TST Rd Test for Zero orNegativeRd=Rd路Rd Z,C,N,V,S1CLR Rd Clear Register Rd=0Z,N,V,S1 SER Rd Set Register Rd=$FF None1SBIW Rdl,K6Subtract Immediatefrom WordRdh:Rdl=Rdh:Rdl-K6Z,C,N,V,S2MUL Rd,Rr Multiply Unsigned R1:R0=Rd*RrZ,C2MULS Rd,Rr Multiply Signed R1:R0=Rd*RrZ,C2MULSU Rd,Rr Multiply Signed withUnsignedR1:R0=Rd*RrZ,C2FMUL Rd,Rr Fractional MultiplyUnsignedR1:R0=(Rd*Rr)<<1Z,C2FMULS Rd,Rr Fractional MultiplySignedR1:R0=(Rd*Rr)<<1Z,C2FMULSU Rd,Rr Fractional MultiplySigned with UnsignedR1:R0=(Rd*Rr)<<1Z,C2聽Branch InstructionsMnemonic Operands Description Operation Flags Cycles RJMP k Relative Jump PC=PC+k+1None2IJMP None Indirect Jump to(Z)PC=Z None2EIJMP None Extended IndirectJump(Z)STACK=PC+1,PC(15:0)=Z,PC(21:16)=EINDNone2JMP k Jump聽PC=k None3RCALL k Relative CallSubroutineSTACK=PC+1,PC=PC+k+1None3/4*ICALL None Indirect Call to(Z)STACK=PC+1,PC=Z聽None3/4*EICALL None Extended IndirectCall to(Z)STACK=PC+1,PC(15:0)=Z,PC(21:16)=EINDNone4*CALL k Call Subroutine STACK=PC+2,PC=kNone4/5*RET None SubroutineReturnPC=STACK None4/5*RETI None Interrupt Return PC=STACK I4/5*CPSE Rd,Rr Compare,Skip ifequal聽if(Rd==Rr)PC=PC2or3None1/2/3CP Rd,Rr Compare Rd-Rr Z,C,N,V,H,S1CPC Rd,Rr Compare withCarryRd-Rr-C Z,C,N,V,H,S1CPI Rd,K8Compare withImmediateRd-K Z,C,N,V,H,S1SBRC Rr,b Skip if bit inregister clearedif(Rr(b)==0)PC=PC+2or3None1/2/3SBRS Rr,b Skip if bit inregister setif(Rr(b)==1)PC=PC+2or3None1/2/3SBIC P,b Skip if bit in I/Oregister clearedif(I/O(P,b)==0)PC=PC+2or3None1/2/3SBIS P,b Skip if bit in I/Oregister setif(I/O(P,b)==1)PC=PC+2or3None1/2/3BRBC s,k Branch if Statusflag clearedif(SREG(s)==0)PC=PC+k+1None1/2BRBS s,k Branch if Statusflag setif(SREG(s)==1)PC=PC+k+1None1/2BREQ k Branch if equal if(Z==1)PC=PC+k+1None1/2BRNE k Branch if notequalif(Z==0)PC=PC+k+1None1/2BRCS k Branch if carry set if(C==1)PC=PC+k+1None1/2BRCC k Branch if carryclearedif(C==0)PC=PC+k+1None1/2BRSH k Branch if same orhigherif(C==0)PC=PC+k+1None1/2BRLO k Branch if lower if(C==1)PC=PC+k+1None1/2BRMI k Branch if minus if(N==1)PC=PC+k+1None1/2BRPL k Branch if plus if(N==0)PC=PC+k+1None1/2BRGE k Branch if greaterthan or equal(signed)if(S==0)PC=PC+k+1None1/2BRLT k Branch if lessthan(signed)if(S==1)PC=PC+k+1None1/2BRHS k Branch if halfcarry flag setif(H==1)PC=PC+k+1None1/2BRHC k Branch if halfcarry flag clearedif(H==0)PC=PC+k+1None1/2BRTS k Branch if T flagsetif(T==1)PC=PC+k+1None1/2BRTC k Branch if T flagclearedif(T==0)PC=PC+k+1None1/2BRVS k Branch if overflowflag setif(V==1)PC=PC+k+1None1/2BRVC k Branch if overflowflag clearedif(V==0)PC=PC+k+1None1/2BRIE k Branch if interrupt if(I==1)PC=PC+k+None1/2enabled1BRID k Branch if interruptdisabledif(I==0)PC=PC+k+1None1/2*Cycle times for data memory accesses assume internal memory accesses,and are not valid for accesses through the external RAM interface.For the instructions CALL,ICALL,EICALL,RCALL,RET and RETI,add three cycles plus two cycles for each wait state in devices with up to16bit PC(128KB program memory).For devices with more than128KB program memory,add five cycles plus three cycles for each wait state.Data Transfer InstructionsMnemonic Operands Description Operation Flags Cycles MOV Rd,Rr Copy register Rd=Rr None1MOVW Rd,Rr Copy register pair Rd+1:Rd=Rr+1:Rr,r,d evenNone1LDI Rd,K8Load Immediate Rd=K None1 LDS Rd,k Load Direct Rd=(k)None2* LD Rd,X Load Indirect Rd=(X)None2*LD Rd,X+Load Indirect andPost-IncrementRd=(X),X=X+1None2*LD Rd,-X Load Indirect andPre-DecrementX=X-1,Rd=(X)None2*LD Rd,Y Load Indirect Rd=(Y)None2*LD Rd,Y+Load Indirect andPost-IncrementRd=(Y),Y=Y+1None2*LD Rd,-Y Load Indirect andPre-DecrementY=Y-1,Rd=(Y)None2*LDD Rd,Y+q Load Indirect withdisplacementRd=(Y+q)None2*LD Rd,Z Load Indirect聽Rd=(Z)None2*LD Rd,Z+Load Indirect andPost-IncrementRd=(Z),Z=Z+1None2*LD Rd,-Z Load Indirect and Z=Z-1,Rd=(Z)None2*Pre-DecrementLDD Rd,Z+q Load Indirect withdisplacementRd=(Z+q)None2*STS k,Rr Store Direct(k)=Rr None2* ST X,Rr Store Indirect(X)=Rr None2*ST X+,Rr Store Indirect andPost-Increment(X)=Rr,X=X+1None2*ST-X,Rr Store Indirect andPre-DecrementX=X-1,(X)=Rr None2*ST Y,Rr Store Indirect(Y)=Rr None2*ST Y+,Rr Store Indirect andPost-Increment(Y)=Rr,Y=Y+1None2ST-Y,Rr Store Indirect andPre-DecrementY=Y-1,(Y)=Rr None2ST Y+q,Rr Store Indirect withdisplacement(Y+q)=Rr None2ST Z,Rr Store Indirect(Z)=Rr None2ST Z+,Rr Store Indirect andPost-Increment(Z)=Rr,Z=Z+1None2ST-Z,Rr Store Indirect andPre-DecrementZ=Z-1,(Z)=Rr None2ST Z+q,Rr Store Indirect withdisplacement(Z+q)=Rr None2LPM None Load Program Memory R0=(Z)None3 LPM Rd,Z Load Program Memory Rd=(Z)None3LPM Rd,Z+Load Program Memory andPost-IncrementRd=(Z),Z=Z+1None3ELPM None Extended Load ProgramMemoryR0=(RAMPZ:Z)None3ELPM Rd,Z Extended Load ProgramMemoryRd=(RAMPZ:Z)None3ELPM Rd,Z+Extended Load ProgramMemory and Post IncrementRd=(RAMPZ:Z),Z=Z+1None3SPM None Store Program Memory(Z)=R1:R0None-ESPM None Extended Store ProgramMemory(RAMPZ:Z)=R1:R0None-IN Rd,P In Port Rd=P None1OUT P,Rr Out Port P=Rr None1 PUSH Rr Push register on Stack STACK=Rr None2POP Rd Pop register from Stack Rd=STACK None2*Cycle times for data memory accesses assume internal memory accesses and are not valid for accesses through the external RAM interface.For the LD,ST,LDD,STD,LDS,STS,PUSH and聽POP instructions, add one cycle plus one cycle for each wait state.Bit and Bit-test InstructionsMnemonic Operands Description Operation Flags CyclesLSL Rd Logical shift left Rd(n+1)=Rd(n),Rd(0)=0,C=Rd(7)Z,C,N,V,H,S1LSR Rd Logical shift right Rd(n)=Rd(n+1),Rd(7)=0,C=Rd(0)Z,C,N,V,S1ROL Rd Rotate leftthrough carryRd(0)=C,Rd(n+1)=Rd(n),C=Rd(7)Z,C,N,V,H,S1ROR Rd Rotate rightthrough carryRd(7)=C,Rd(n)=Rd(n+1),C=Rd(0)Z,C,N,V,S1ASR Rd Arithmetic shiftrightRd(n)=Rd(n+1),n=0,...,6Z,C,N,V,S1SWAP Rd Swap nibbles Rd(3..0)=Rd(7..4),Rd(7..4)=Rd(3..0)None1BSET聽s Set flag SREG(s)=1SREG(s)1 BCLR s Clear flag SREG(s)=0SREG(s)1SBI P,b Set bit in I/OregisterI/O(P,b)=1None2CBI P,b Clear bit in I/O I/O(P,b)=0None2registerBST Rr,b Bit store fromregister to TT=Rr(b)T1BLD Rd,b Bit load fromregister to TRd(b)=T None1SEC None Set carry flag C=1C1 CLC None Clear carry flag C=0C1 SEN None Set negative flag N=1N1CLN None Clear negativeflagN=0N1SEZ None Set zero flag Z=1Z1 CLZ None Clear zero flag Z=0Z1 SEI None Set interrupt flag I=1I1CLI None Clear interruptflagI=0I1SES None Set signed flag S=1S1 CLN None Clear signed flag S=0S1 SEV None Set overflow flag V=1V1CLV None Clear overflowflagV=0V1SET None Set T-flag T=1T1 CLT None Clear T-flag T=0T1SEH None Set half carryflagH=1H1CLH None Clear half carryflagH=0H1NOP None No operation None None1 SLEEP None Sleep See instruction manual None1 WDR None Watchdog Reset See instruction manual None1 BREAK None Execution Break See instruction manual None1The Assembler is not case sensitive.The operands have the following forms:Rd:Destination(and source)register in the register fileRr:Source register in the register fileb:Constant(0-7),can be a constant expressions:Constant(0-7),can be a constant expressionP:Constant(0-31/63),can be a constant expressionK6;Constant(0-63),can be a constant expressionK8:Constant(0-255),can be a constant expressionk:Constant,value range depending on instruction.Can be a constant expression q:Constant(0-63),can be a constant expressionRdl:聽R24,R26,R28,R30.For ADIW and SBIW instructions。
算术和逻辑指令•ADD 加法•ADC 带进位加•ADIW 加立即数•SUB 减法•SUBI 减立即数•SBC 带进位减•SBCI 带C 减立即数•SBIW 减立即数•AND 与•ANDI 与立即数•OR 或•ORI 或立即数•EOR 异或•COM 取反•NEG 取补•SBR 寄存器位置位•CBR 寄存器位清零•INC 加1•DEC 减1•TST 测试零或负•CLR 寄存器清零•SER 寄存器置FF•MUL 乘法•MULS 有符号数乘法•MULSU 有(无)符号数乘法•FMUL 小数乘法•FMULS 有符号数乘法•FMULSU 有(无)符号小数乘法条件转移指令•RJMP 相对转移•IJMP 间接转移•JMP 长转移•RCALL 相对调用•ICALL 间接调用•CALL 长调用•RET 子程序返回•RETI 中断返回•CPSE 比较相等跳行•CP 比较•CPC 带进位比较•CPI 带立即数比较•SBRC 位清零跳行•SBRS 位置位跳行•SBIC I/O 位清零跳行•SBIS I/O 位置位跳行•BRBS SREG 位置位转•BRBC SREG 位清零转•BREQ 相等转移•BRNE 不相等转移•BRCS C 置位转•ELPM 扩展装载程序存储器•EIJMP 扩展间接跳转•ESPM 扩展存储程序存储器•EICALL延长间接调用子程序•BRCC C 清零转•BRSH 转•BRLO 小于转(无符号)•BRMI 负数转移•BRPL 正数转移•BRGE 转(带符号)•BRLT 小于转(带符号)•BRHS H 置位转移•BRHC H 清零转移•BRTS T 置位转移•BRTC T 清零转移•BRVS V 置位转移•BRVC V 清零转移•BRIE 中断位置位转移•BRID 中断位清零转移数据传送指令•MOV 寄存器传送•MOVW 拷贝寄存器字•LDI 装入立即数•LD X X 间接取数•LD X+ X 间接取数后•LD -X X 间接取数先•LD Y Y 间接取数•LD Y+ Y 间接取数后+•LD –Y Y 间接取数先•LDD Yq Y 间接取数 q•LD Z Z 间接取数•LD Z+ Z 间接取数后•LD –Z Z 间接取数先•LDD Zq Z 间接取数 q•LDS 从SRAM 装入•ST X X 间接存数•ST X+ X 间接存数后•ST –X X 间接存数先•ST Y Y 间接存数•ST Y+ Y 间接存数后•ST –Y Y 间接存数先•STD Yq Y 间接存数 q•ST Z Z 间接存数•ST Z+ Z 间接存数后•ST –Z Z 间接存数先•STD Zq Z 间接存数 q•STS 数据送SRAM•LPM 装程序存储器•LPM Z Z•LPM Z+ Z+•SPM 存储程序存储器•IN I/O 口输入•OUT 送I/O 口•PUSH 压栈•POP 出栈位指令和位测试指令•SBI 置位I/O 位•CBI 清零I/O 位•LSL 左移•LSR 右移•ROL 带进位左循环•ROR 带进位右循环•ASR 算术右移•SWAP 半字节交换•BSET 置位SREG•BCLR 清零SREG•BST Rr 的b 位送T•BLD T 送Rr 的b 位•SEC 置位C•CLC 清零C•SEN 置位N•CLN 清零N•SEZ 置位Z•CLZ 清零Z•SEI 置位I•CLI 清零I•SES 置位S•CLS 清零S•SEV 置位V•CLV 清零V•SET 置位T•CLT 清零T•SEH 置位H•CLH 清零H•NOP 空操作•SLEEP 休眠•WDR 看门狗复位90 条指令器件:Attiny11/12/15/2289 条指令器件:AT90S1200118 条指令器件:AT90S2313/2323/2343/2333 AT90S4414/4433/4434/8515 AT90S8534/8535 121 条指令器件:ATmega603/103130 条指令器件:ATmega161。
第五章A V R单片机指令系统计算机的指令系统是一套控制计算机操作的代码,称之为机器语言。
计算机只能识别和执行机器语言的指令。
为了便于人们理解、记忆和使用,通常用汇编语言指令来描述计算机的指令系统。
汇编语言指令可通过汇编器翻译成计算机能识别的机器语言。
AVR单片机指令系统是RISC结构的精简指令集,是一种简明易掌握﹑效率高的指令系统。
SL-DIY02-3开发实验器使用AT90S8535单片机,有118条指令,而我们所做的11个实验程序仅用了34条指令,我们重点讲这34条指令,其余指令就可自学了。
AVR器件(指令速查表)118条指令器件1.不带进位加法ADD一不带进位加说明:两个寄存器不带进位C标志加,结果送目的寄存器Rd。
操作:Rd✍Rd+Rr语法:操作码:程序计数器:ADDRd,RrO≤d≤31,0≤r≤31PC✍PC+1例子:。
(实践操作程序4411.ASM)实践操作例子*.ASM,必须编译生成*.OBJ文件才可调试,如要修改*.ASM,必须修改文件属性,去掉*.ASM只读文件属性2.带进位加法ADC-一带进位加说明:两个寄存器和C标志的内容相加,结果送目的寄存器Rd。
操作:Rd←Rd+Rr+C语法:操作码:程序计数器:ADCRd,Rr0≤d≤31,0≤r≤31PC←PC+1例子:(实践操作程序4412.ASM)3.减1指令DEC一减1说明:寄存器Rd的内容减1,结果送目的寄存器Rd中。
操作:Rd✍Rd-l语法:操作码:程序计数器:DECRd0≤d≤31PC✍PC十1例子:(实践操作程序4426.ASM)4.立即数比较CPI——带立即数比较说明:该指令完成寄存器Rd和常数的比较操作。
寄存器的内容不改变。
该指令后能使用所有条件转移指令。
操作:Rd-K语法:操作码:程序计数器:CPIRd,K16≤d≤31,0≤K≤255PC✍PC+1例子:(实践操作程序4463.ASM)5.带立即数与ANDI——立即数逻辑与;全1为1,有0即0说明:寄存器Rd的内容与常数逻辑与,结果送目的寄存器Rd。
ATmega8寄存器资料整理ATmega8各模塊及相關寄存器功能ADC模塊1.ADMUX--ADC多路選擇寄存器:REFS1,REFS0: = 0,0 關閉內部的參考電壓0,1 Avcc利用AREF腳的外接電容1,0 保留1,1 開啟內部的2.56V參考電壓, AREF腳外接電容.ADLAR: = 1對ADC轉換結果進行左調節, = 0對ADC轉換結果進行右調節,詳見IC spec,我要ADLAR=0.MUX3~0: =0000~0111分別選擇ADC0~ADC7作為輸入, =1110 1.23V(VBG), =1111 0V(GND).2.ADCSR--ADC控制和狀態寄存器ADEN: ADC使能ADSC: ADC工作于單次模式時,’ADSC=1’啟動一次轉換,轉換結束后ADSC由硬件清0.ADC工作于連續模式時,’ADSC=1’啟動轉換,只需一次.對該位寫0沒有意義.注意:每一次對該位寫’1’都會有一次啞轉換.ADFR: =1選擇ADC連續模式. =0則終止連續模式.ADIF: ADC中斷標識位.執行中斷程序后由硬件清0,對該位寫’1’也可以將其清0ADIE:ADC中斷使能.ADPS2..ADPS0: =000~111時ADC的分頻系數分別為2,2,4,8,16,32,64,1283. ADCH/ADCL:ADC結果數據寄存器,讀取時要先讀ADCL.USART模塊1.UDR--USART數據接收/發射寄存器.2.UCSRA--USART控制和狀態寄存器A.RXC: 接收數據完成標識位, RXC在读UDR时自动被清除, 如果采用中断方式则中断例程必须读一次UDR.TXC: 發送數據結束標識位, TXC 置位表示数据已经从发送移位寄存器发送出去且UDR 中没有新的要发送的数据,在半双工通信应用中,由于发送器在发送完数据之后要立即转换到接收模式,所以这个标志位特别有用.如果TXCIE 已置位则TXC 置位将引发发送结束中断,进入中断例程后TXC 自动清零,或者用户可以对其写1清零. UDRE: UART数据寄存器空当数据从UDR 传送到发送移位寄存器后,UDRE 置位,表明发送器已经准备好接收新的要发送的数据.当UDRIE 置位,则只要UDRE 为’1’, UART 发送结束中断就可以执行.写UDR 将复位UDRE. 如果利用中断方式发送数据,则在UART 数据寄存器空中断例程里必须写UDR 以清除UDRE, 否则中断将连续发生.复位后UDRE 的初始值为’1’, 表明发送器就绪.FE: 接收帧错误標識位,MCU 检测到帧错误如检测到停止位为0 时FE 置位,当检测到数据停止位为1 时FE 复位.讀接收緩沖器清除該標識.DOR: 數據過速標識位, 如果UDR 未读而新接收的数据又已进入移位寄存器,则OR 置位. 讀接收緩沖器清除該標識. PE: (?UPE)接收數據奇偶校驗錯誤標識位,讀接收緩沖器清除該標識.U2X: 對異步通訊, U2X=1時波特率加倍.對同步通訊,該位無效,必須寫0.MPCM: =1時為多處理器通訊模式,在該模式下,接收到的未包含地址的楨數據被忽略,不影響發送數據.3.UCSRB-- USART控制和狀態寄存器B.RXCIE: 接收結束中斷使能.TXCIE: 發送結束中斷使能.UDRIE: 數據寄存器空中斷使能.RXEN: =1時接收使能.同時自動設置RXD引腳為接收腳.接收禁能將導致TXC/DOR/FE無法置位,同時也不能復位已經置位的標識位.TXEN: =1時接收接收.同時自動設置TXD引腳為發送腳.UCSZ2: 與UCSRC中的UCSZ1/UCSZ0位一起決定接收和發送數據的楨格式(8/9/10位)RXB8/TXB8: 接收/發送數據的第9位.4. UCSRC-- USART控制和狀態寄存器C.(UCSRC與UBRRH共用一個IO地址)URSEL: =1時讀/寫UCSRC寄存器,=0時讀/寫UBRRH寄存器.UMSEL: =1選擇UART, =0選擇USARTUPM1..UPM0: =0, 0 禁止奇偶校驗,=0,1 保留, =1,0 使能偶校驗, =1,1 使能奇校驗.USBS: =0 發送1位停止位, =1 發送2位停止位. 該位的設置與接收無關.UCSZ1..UCSZ0: 與UCSZ2一起決定數據楨的位數UCSZ2..UCSZ0 = 0,0,0~0,1,1 分別為5/6/7/8位.= 1,0,0~1,1,0 保留= 1,1,1 9位(復位后的缺省值為0,1,1即8位)UCPOL: =0 在時鐘脈沖的上升沿發送一位數據,下降沿接收一位數據. =1則反之.5.UBRRH/UBRRL: UBRRH的低4位和UBRRL組成12位波特率寄存器.(見IC spec.)WDT模塊1.WDTCR—看門狗定時器控制寄存器WDCE: 看門狗關閉使能.WDE: =1使能看門狗.關閉看門狗的步驟為: 1. 在同一个指令内对WDCE 和WDE 写逻辑1,即使WDE 已经为12. 在4 个时钟之内对WDE 写逻辑0WDP2..WDP0: 選擇WDT的溢出時間.TWI模塊1.TWBR—TWI位傳輸率寄存器.SCL頻率=CPU時鐘/(16+2*TWBR*4TWPS)主機模式下要求TWBR>10.2.TWCR—TWI控制寄存器TWINT: TWI中斷標識位該位必須由軟件清0.另外清0該位時會啟動TWI,因此清0該位之前需先設置好TWAR/TWSR/TWDR TWEA: TWI應答信號時能.TWSTA: TWI啟動條件位. 該位置’1’時向總線發送一個啟動信號,然后該位要用軟件清0.TWSTO: TWI停止條件位. 該位置’1’時向總線發送一個停止信號,然后該位自動清0.TWWC: TWI寫沖突標識位. 當TWIBT=0時寫TWDR,該位置位; 當TWIBT=1時寫TWDR,該位清0. TWEN: TWI使能位. 只要將該位置’1’,TWI就對SDA和SCL腳具有控制權.TWIE: TWI中斷使能.3.TWSR—TWI狀態寄存器.TWS7..TWS3: 指示TWI的狀態.TWPS1..TWPS0: 位傳輸速率的預分頻值. =0,0~1,1對應的預分頻值分別為1,4,16,644.TWDR-- TWI數據寄存器.5.TWAR: TWI(slave) 地址寄存器.TWA6..TWA0: TWI(slave) 地址TWGCE: TWI通用呼叫識別使能位.T0模塊1.TIMSK—T/C中斷屏蔽寄存器TOIE0: T/C0溢出中斷使能.2.TIFR—T/C中斷標識寄存器.TOV0: T/C0溢出中斷標識位.3.TCCR0--T/C控制寄存器.CS02…CS00: = 0,0,0 T/C停止.=0,0,1~1,0,1 時鐘分別為I/O時鐘, I/O時鐘/8, I/O時鐘/64, I/O 時鐘/256, I/O時鐘/1024,=1,1,0 T0腳的時鐘,下降沿=1,1,1 T0腳的時鐘,上升沿4.TCNT0—T/C計數寄存器.T1模塊1. TIMSK—T/C中斷屏蔽寄存器TICIE1: T/C1輸入捕獲中斷使能.OCIE1A: T/C1輸出比較匹配A中斷使能.OCIE1B: T/C1輸出比較匹配B中斷使能.TOIE1: T/C1溢出中斷使能.2.TIFR—T/C中斷標識寄存器.ICF1: T/C1輸入捕獲中斷標識位.OCF1A: T/C1輸出比較匹配A中斷標識位.OCF1B: T/C1輸出比較匹配B中斷標識位.TOV1: T/C1溢出中斷標識位.3.TCCR1A—T/C1控制寄存器A./doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): 决定T/C1 的比较匹配发生时输出引脚OC1A(OC1B)的动作,對I/O口的控制權最高,相应的方向控制位要设置为1, 以便将其配置为输出.WGM13..0=正常模式或CTC模式時:/doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): =0,0 T/C1與输出引脚OC1A(OC1B)斷開=0,1 比较匹配发生时OC1A(OC1B) 輸出反相.=1,0 比较匹配发生时OC1A(OC1B)=0; OC1A(OC1B)=1 at TOP =1,1 比较匹配发生时OC1A(OC1B)=1; OC1A(OC1B)=0 at TOPWGM13..0=快速PWM模式時:/doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): =0,0 T/C1與输出引脚OC1A(OC1B)斷開=0,1 WGM13..0=15: 比较匹配发生时OC1A/OC1B反相輸出. OC1B斷開=1,0 比较匹配发生时OC1A(OC1B)=0; OC1A(OC1B)=1 at TOP =1,1 比较匹配发生时OC1A(OC1B)=1; OC1A(OC1B)=0 at TOP WGM13..0=相位校正模式/相頻校正模式或PWM模式時: /doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): =0,0 T/C1與输出引脚OC1A(OC1B)斷開=0,1 WGM13..0=15: 比较匹配发生时OC1A/OC1B反相輸出. OC1B斷開=1,0 比较匹配发生时,若是向上計數OC1A(OC1B)=0; 若是向下計數則OC1A(OC1B)=1=1,1 比较匹配发生时,若是向上計數OC1A(OC1B)=1; 若是向下計數則OC1A(OC1B)=0FOS1A/FOC1B: 写’1’ 后按照COM1A0/1 的设置在引脚PD5 强迫产生一次比较匹配输出,如果COM的值与FOC 的值在同一写入周期更新,本次功能将被忽略.强迫输出比较功能使得MCU可以不用等待比较匹配的发生就变换引脚的输出,由FOC 置位产生的比较匹配不会引发中断,也不会清除TCNT1. 读FOC 的返回值总为零,在PWM 模式下FOC 没有意義.WGM11/WGM10: 與TCCR1B中的WGM13/WGM12位決定波形產生模式Mode WGM13..WGM10 Timer/Counter Mode TOP UpdateofOCR1x TOV1 Flag Set on0 0 0 0 0 Normal 0xFFFF Immediate MAX1 0 0 0 1 PWM, Phase Correct, 8-bit 0x00FF TOP BOTTOM2 0 0 1 0 PWM, Phase Correct, 9-bit 0x01FF TOP BOTTOM3 0 0 1 1 PWM, Phase Correct, 10-bit 0x03FF TOP BOTTOM4 0 1 0 0 CTC OCR1A Immediate MAX5 0 1 0 1 Fast PWM, 8-bit 0x00FF TOP TOP6 0 1 1 0 Fast PWM, 9-bit 0x01FF TOP TOP7 0 1 1 1 Fast PWM, 10-bit 0x03FF TOP TOP8 1 0 0 0 PWM, Phase&Frequency Correct ICR1 BOTTOM BOTTOM9 1 0 0 1 PWM, Phase& Frequency Correct OCR1A BOTTOM BOTTOM10 1 0 1 0 PWM, Phase Correct ICR1 TOP BOTTOM11 1 0 1 1 PWM, Phase Correct OCR1A TOP BOTTOM12 1 1 0 0 CTC ICR1 Immediate MAX13 1 1 0 1 (Reserved) –––14 1 1 1 0 Fast PWM ICR1 TOP TOP15 1 1 1 1 Fast PWM OCR1A TOP TOP3.TCCR1B—T/C1控制寄存器B.ICNC1: 输入捕捉抑制器(4个时钟)ICNC1 高有效,输入捕捉在ICP输入捕捉引脚的第一个上升/下降沿触发,当ICNC1 =1时ICP信号要进行4次连续采样,只有4个采样值都有效时,输入捕捉标志才置位.采样频率为XTAL 时钟.ICES1:输入捕捉1 边沿选择当ICES1=0 时,T/C1 的值在ICP 引脚电平的下降沿被传送到输入捕捉寄存器ICR1.若ICES1=1 则T/C1 的值在ICP 引脚电平的上升沿被传送到ICR1 WGM13/WGM12: 見上面的表格.CS11..CS10: T/C1的時鐘源選擇=000 停止,=001~101 分別為CK, CK/8,CK/64,CK/256,CK/1204. =110 T1腳下降沿. =111 T1腳上升沿.4.TCNT1H/TCNT1L—T/C1計數器此16 位寄存器包含了T/C1 的值,当CPU 访问这两个寄存器时,为了保证高字节和低字节能够同时读写,要用到一个8 位的临时寄存器TEMP, 此寄存器在访问OCR1A/ OCR1B 和ICR1 的时候也要用到,如果主程序和中断程序在访问寄存器时都要用到TEMP, 那么在适当的时候需要关闭中断使能,防止出错.写TCNT1: 当CPU 写TCNT1H 时数据将被放置在TEMP 寄存器,当CPU 写低字节TCNT1L 时,此数据及TEMP 中的数据一并写入TCNT1, 因此在写TCNT1 16 位时首先要写TCNT1H读TCNT1:当CPU 读取TCNT1L 时,TCNT1L 的数据将送入CPU, 同时TCNT1H 将送入TEMP寄存器,等到CPU 读取TCNT1H 时,TEMP 中的数据送入CPU, 因此在读16 位的TCNT1 时首先要读TCNT1L T/C1 是向上记数器或上/下记数器,在PWM 模式下,若T/C1 被置数,则T/C1 将在预置数的基础上记数.5.OCR1AH / OCR1AL-- T/C1輸出比較寄存器1A.OCR1BH / OCR1BL-- T/C1輸出比較寄存器1BT/C1 输出比较寄存器包含与T/C1 值连续比较的数据,如果T/C1 的值与OCR 相等则比较匹配发生,用软件写操作将TCNT1 和OCR1A 或OCR1B 设置为相等不会引发比较匹配,由于OCR1A/OCR1B为16 位寄存器,所以在访问时要用到TEMP 寄存器,以保证两个字节的同步更新,其读写过程与读写TCNT1 相同.访问TCNT1 和ICR1 同样要用到TEMP 寄存器,如果主程序和中断例程都要用到TEMP,则在主程序访问这些寄存器时要禁止中断.6. ICR1H / ICRAL—輸入捕獲寄存器按照ICES1 的设定,输入捕捉引脚ICP 发生上跳变或下跳变时,TCNT1 被送入ICR1, 同时ICF1 置位,由于ICR1 为16 位寄存器,所以在访问时要用到TEMP 寄存器,以保证同时读取两个字节. 读写过程与读写TCNT1 相同.T2模塊1. TIMSK—T/C中斷屏蔽寄存器OCIE2: T/C2輸出比較匹配中斷使能.TOIE2: T/C2溢出中斷使能.2.TIFR—T/C中斷標識寄存器.OCF2: T/C2輸出比較匹配中斷標識位.TOV2: T/C2溢出中斷標識位.3. TCCR2—T/C2控制寄存器FOC2: 强迫输出比较写1 后按照COM21/20 的设置,在引脚强迫产生一次比较匹配输出,如果COM 的值与FOC 的值在同一写入周期更新,本次功能将被忽略.由FOC 置位产生的比较匹配不会产生中断.读FOC 的返回值总为零.在PWM 模式下FOC没有任何意义.WGM21/WGM20: 波形產生模式Mode WGM21/WGM20 Timer/Counter Mode TOP Update of OCR2 TOV2 FlagSet0 0 0 Normal 0Xff Immediate MAX1 0 1 PWM, Phase Correct 0xFF TOP BOTTOM2 1 0 CTC OCR2 Immediate MAX3 1 1 Fast PWM 0xFF TOP MAXCOM21/COM20: 比較輸出模式Non-PWM模式時:COM21/COM20 Description0 0 Normal port operation, OC2 disconnected.0 1 Toggle OC2 on Compare Match1 0 Clear OC2 on Compare Match1 1 Set OC2 on Compare Matchfast-PWM模式時:COM21/ COM20 Description0 0 Normal port operation, OC2 disconnected.0 1 Reserved1 0 Clear OC2 on Compare Match, set OC2 at TOP1 1 Set OC2 on Compare Match, clear OC2 at TOPPhase Correct PWM模式時:COM21 COM20 Description0 0 Normal port operation, OC2 disconnected.0 1 Reserved1 0 Clear OC2 on Compare Match when up-counting. Set OC2 on Compare Match when downcounting.1 1 Set OC2 on Compare Match when up-counting. Clear OC2 on Compare Match when downcounting.CS22/CS21/CS20: 選擇T/C2的預分頻值CS22/CS21/CS20 Description0 0 0 No clock source (Timer/Counter2 stopped).0 0 1 clk T2S (No prescaling)0 1 0 clk T2S/8 (From prescaler)0 1 1 clk T2S/32 (From prescaler)1 0 0 clk T2S/64 (From prescaler)1 0 1 clk T2S/128 (From prescaler)1 1 0 clk T2S/256 (From prescaler)1 1 1 clk T2S/1024 (From prescaler)4. TCNT2—T/C2計數器5. OCR2—T/C2輸出比較寄存器6.ASSR—T/C2異步狀態寄存器AS2: AS2=0,T/C2的時鐘為clk i/o, AS2=1, T/C2的時鐘為TOSC1腳的晶體時鐘.改變AS2的值,可能破壞TCNT2/ORC2/TCCR2的內容.TCN2UB: T/C2 更新忙標識T/C2 工作于异步模式时,写TCNT2 将引起TCN2UB置位,当TCNT2从暂存寄存器更新完毕后,TCN2UB 由硬件清零.TCN2UB为0 表明TCNT2可以写入新值了.OCR2UB: 输出比较寄存器更新忙T/C2 工作于异步模式时,写OCR2将引起OCR2UB置位,当OCR2从暂存寄存器更新完毕后,OCR2UB由硬件清零,OCR2UB为0 表明OCR2可以写入新值了.TCR2UB: T/C2 控制寄存器更新忙T/C2 工作于异步模式时写TCCR2将引起TCR2UB置位,当TCCR2从暂存寄存器更新完毕后,TCR2UB由硬件清零.TCR2UB为0表明TCCR2可以写入新值了.如果在’更新忙标志’置位的时候写上述任何一个寄存器,都将引起数据的破坏并引发不必要的中断!7.SFIOR—特殊功能IO寄存器PSR2: T/C2 分频器复位置位后,T/C2 的预分频器复位,操作完成后硬件对其清零,软件写零并不真正执行清零工作.如果T/C2 由内部CPU 时钟驱动,读取这一位的结果为零.如果T/C2 工作于异步模式,由自己的晶振驱动,则这一位将一直保持为1, 直到异步操作完成.SPI 模塊1.SPDR—SPI數據寄存器2.SPSR—SPI狀態寄存器SPIF: SPI中斷標識串行发送结束后SPIF置位,即使此时/SS 被拉低(作为输入口).进入中断例程后SPIF自动复位,或者可以通过先读SPSR, 紧接着读SPDR来对SPIF清零.WCOL: 写碰撞标志在SPI 发送当中对SPI 数据寄存器SPDR写数据将置位WCOL, WCOL可以通过先读SPSR,紧接着读SPDR来清零SPI2X: 双速置位后SPI 的速度加倍,若作为主机则SPI 频率可达CPU频率的一半,若为从机只能保证f C L/4.3.SPCR—SPI控制寄存器SPIE: SPI 中斷使能SPE: SPI 使能DORD: 数据發送次序, DORD=1 LSB先发送;DORD=0 MSB先发送.MSTR: 主从选择MSTR 置位时选择主机模式,否则为从机.如果MSTR为1, /SS 为输入,但被拉低,则MSTR被清零,SPIF置位.用户必须重新设置MSTR进入主机模式.CPOL: 时钟极性CPOL置位表明总线空闲时SCK为高.CPHA: 时钟相位SPR1/SPR0: SPI 时钟速率选择位=00~11 时钟速率分別為f OSC/4, f OSC/16, f OSC/64, f OSC/128端口B / 端口C / 端口D 模塊1.PORTB / PORTC / PORTD--端口數據寄存器2.DDRB / DDRC / DDRD—端口數據方向寄存器3.PINB / PINC / PIND—端口輸入引腳地址PINB/PINC/PIND 不是寄存器,这个地址用来访问端口的物理值,读取PORTB/PORTC/PORTD时,读到的是端口锁存的数据,而读取PINB/PINC/PIND时,读到的是施加于引脚上的逻辑数值.外部中斷模塊1.GICR—通用中斷控制寄存器INT1/INT0:外部中斷1/0使能IVSEL: 中斷向量選擇=1 中斷向量放置在flash存儲區的開始. =0中斷向量放置在BOOT LOADER區的開始.IVCE: 中斷向量改變使能.2.GIFR—外部中斷標識位寄存器.INTF1/INTF0: 外部中斷1/0標識3.MCUCR—MCU控制寄存器ISC11/ISC10 / ISC01/ISC00: 外部中斷觸發信號選擇ISC11( ISC01)/ ISC10 (ISC00) Description0 0 The low level of INT1(INT0) generates an interrupt request.0 1 Any logical change on INT1(INT0) generates an interrupt request.1 0 The falling edge of INT1(INT0) generates an interrupt request.1 1 The rising edge of INT1(INT0) generates an interrupt request.EEPROM 模塊1.EEARH/EEARL--EEPROM地址寄存器.(對Atmega8為9位)2.EEDR—EEPROM數據寄存器3.EECR—EEPROM控制寄存器EERIE: EEPROM准備好中斷使能EEMWE: EEPROM主写使能EEMWE 决定是否设置EEWE 为1 以写EEPROM, 当EEMWE 为1 时置位EEWE,将把数据写入EEPROM 的指定地址,若EEMWE 为0 则EEWE 不起作用.EEMWE 置位后4个周期硬件对其清零.EEWE: EEPROM写使能当EEPROM数据和地址设置好之后,需置位EEWE以便将数据写入EEPROM, 写时序如下,第2和第3步不是必须的:1 等待EEWE为0.2 将EEPROM的新地址写入EEAR.3 将新数据写入EEDR.4 置位EEMWE.5 在置位EEMWE 的4个周期内对EEWE 写逻辑1.经过写访问时间(VCC=2.7V 时为4ms左右,VCC=5V时为2.5ms 左右)之后,EEWE硬件清零,用户可以凭此位判断写时序是否已经完成.EEWE置位后CPU要停止2 个周期.注意: 发生在步骤4和5之间的中断将导致写操作失败,如果一个操作EEPROM的中断打断了EEPROM操作,EEAR或EEDR寄存器可能被修改,引起EEPROM操作失败,建议此时关闭全局中断标志I.EERE: EEPROM读使能当EEPROM地址设置好之后,需置位EERE以便将数据读入EEDR, EERE清零表示EEPROM的数据已经读入EEDR, EEPROM数据的读取只需要一条指令,且无需等待.EERE置位后,CPU要停止2个周期.用户在读取EEPROM时应该检测EEWE, 如果一个写操作正在进行,写EEAR 和EEDR将中断EEPROM的写入,使得结果无法预测.防止EEPROM数据毁坏由于电源电压过低,CPU和EEPROM有可能工作不正常造成EEPROM数据的毁坏,这种情况在使用独立的EEPROM 器件时也会遇到.由于电压过低造成EEPROM数据损坏有两种可能:一是电压低至EEPROM写操作所需要的最低电压二是CPU本身已经无法正常工作.EEPROM数据损坏的问题可以通过以下3 种方法解决:1 当电压过低时保持/RESET信号为低,这可以通过外加复位电路(BOD-Brown-out Detection)来完成,有些AVR产品本身就内含BOD电路,详情请看有关数据手册.2 当VCC过低时使AVR内核处于掉电休眠状态,这可以防止CPU 对程序解码和执行代码,有效防止对EEPROM的误操作.3 将那些不需修改的常数存储于FLASH 之中.模擬比較器模塊1. SFIOR--特殊功能IO寄存器ACME: 模擬比較器多路使能ACME=0,AIN1腳作為模擬比較器的負輸入端.ACME=1,ADEN/MUX2..0選擇模擬比較器的負輸入端.2.ACSR--模擬比較器控制和狀態寄存器ACD: 模拟比较器禁止当ACD 为1 时,模拟比较器的电源将切断,可以在任何时候对其置位以关闭模拟比较器,这样可以减少器件的功耗.改变ACD 时要注意禁止模拟比较器的中断,否则有可能引发不必要的中断.ACBG: 模拟比较器帶隙選擇=1 使用內部的參考電壓作為模拟比较器的正輸入.=0 使用AIN0腳的電壓作為模拟比较器的正輸入.ACO:模拟比较器的輸出. ACO與比较器的輸出端直接相連.ACI: 模拟比较器中断标志位当比较器输出触发中断时,ACI 将置位,中断方式由ACIS1 和ACIS0 决定.如果ACI 和I 都为1, 则CPU 执行比较器中断例程,进入中断例程后ACI 被硬件清零.此外ACI 也可以通过对此位写1 来达到清零的目的.要注意的是如果ACSR 的另一些位被SBI 或CBI 指令修改时ACI 亦被清零.ACIE: 模拟比较器中斷使能.ACIC: 模拟比较器输入捕捉使能ACIC为1 时T/C1 的输入捕捉功能由比较器中断触发,此时比较器的输出与T/C1的输入捕捉前端直接相连.T/C1 的输入捕捉噪声抑制和边沿选择仍然适用.如果ACIC 为0 则模拟比较器与T/C1 没有关联,为了使能比较器驱动的T/C1 输入捕捉中断,TICIE1必须置位.ACIS1/ACIS0: 模拟比较器中断模式选择=00 电平切换引发中断=01 保留=10 ACO 下降沿中断=11 ACO 上升沿中断注意: 改变ACIS1/ACIS0 时要注意禁止模拟比较器的中断,否则有可能引发不必要的中断.CPU 模塊1.SREG—CPU狀態寄存器位7---I(R/W): I=1, 允许全局中断; I=0, 不允许全局中断; 在中断发生后I位由硬件清除,并由RETI(中断返回)指令设置,从而允许子序列的中断.位6---T(R/W):位复制存储位5---H(R/W):半进位标志位位4---S(R/W):标志位,S=N⊕V,S位是负数标志位N 和2 的补码溢出标志位V 两者异或值.位3---V(R/W):2的补码溢出标志位,2的补码溢出标志位V支持2的补码运算.位2---N(R/W):负数标志位.指示在不同的运算和逻辑操作之后的负数结果.位1---Z(R/W):零值标志位.指示在不同的运算和逻辑操作之后的零值结果.位0---C(R/W):进位标志位.指示在某一运算和逻辑操作中的某一进位.2.SPH/SPL—堆棧指針3.MCUCR—MCU控制寄存器SE: 睡眠使能SM2..SM0: 睡眠模式選擇SM2/ SM1/ SM0 Sleep Mode0 0 0 Idle0 0 1 ADC Noise Reduction0 1 0 Power-down0 1 1 Power-save1 0 0 Reserved1 0 1 Reserved1 1 0 StandbyNote: Standby mode is only available with external crystals or resonators.ISC11/ISC10 / ISC01/ISC00:見’外部中斷模塊’4.MCUCSR—MCU控制和狀態寄存器WDRF: 看門狗復位標識.BORF: brown-out reset flag (?電壓淡出復位標識?)EXTRF: 外部復位標識PORF: 上電復位標識5.OSCCAL—內部振蕩器頻率調整寄存器6.SPMCR—儲存程序存儲器寄存器SPMIE: SPM中斷使能RWWSB: Read-While-Write Section BusyWhen a Self-Programming (page erase or page write) operation to the RWW section is initiated, the RWWSB will be set (one) by hardware. When the RWWSB bit is set, the RWW section cannot be accessed. The RWWSB bit will be cleared if the RWWSRE bit is written to one after a Self-Programming operation is completed. Alternatively the RWWSB bit will automatically be cleared if a page load operation is initiated.RWWSRE: Read-While-Write Section Read EnableWhen programming (page erase or page write) to the RWW section, the RWW section is blocked for reading (the RWWSB will be set by hardware). To re-enable the RWW section, the user software must wait until the programming is completed (SPMEN will be cleared). Then, if the RWWSRE bit is written to one at the same time as SPMEN, the next SPM instruction within four clock cycles re-enables the RWWsection. The RWW section cannot be re-enabled while the Flash is busy with a page erase or a page write (SPMEN is set). If the RWWSRE bit is written while the Flash is beingloaded, the Flash load operation will abort and the data loaded will be lost (The page buffer will be cleared when the Read-While-Write section is re-enabled).BLBSET: 置位BOOT锁定位若此位与SPMEN一起置位,则在其后4个时钟内执行的SPM将R0的数据写入到BOOT锁定位,R1 及Z寄存器的数据不参与此项操作.锁定位改变完成后,或者在4个时钟内SPM未执行,BLBSET自动清零.锁定位改变过程当中CPU 停止,只有片擦除操作才可以清除锁定位.BLBSET和SPMEN置位后4个时钟内执行的LPM将把锁定位或熔丝位(依赖于Z寄存器的Z0)读到目的寄存器. PGWRT: 页写若此位与SPMEN一起置位,则在其后4个时钟内执行的SPM将把临时缓冲区的数据写入到FLASH.页地址位于Z 寄存器的高位,页写完成后或者在4个时钟内SPM未执行,PGWRT自动清零.页写过程当中CPU停止.PGERS: 页擦除若此位与SPMEN一起置位,则在其后4个时钟内执行的SPM将擦除一页.页地址位于Z寄存器的高位.页擦除完成后或者在4个时钟内SPM未执行,PGERS自动清零.页擦除过程当中CPU 停止.SPMEN: 儲存程序存储器使能使能其后4个时钟内执行的SPM,如果与BLBSET/PGWRT/PGERS 的其中之一一起置位,则SPM将执行特殊命令.如果仅置位SPMEN则其后的SPM指令仅把R1:R0 的值保存到由Z寄存器指定的临时缓冲区.SPM完成后或者在4个时钟内SPM未执行,SPMEN自动清零.如果在低4 位写入除1001/ 0101/ 0011/ 0001 之外的值,或是在任一位已置位后,再对SPMCR操作将无效.写EEPROM将阻止对FLASH的编程以及读熔丝位和锁定位.所以在写SPMCR之前最好先检查EECR的EEWE位, 等EEWE为0 后再操作SPMCR.7.SFIOR—特殊功能IO寄存器PUD: 上拉電阻禁能。
有关MEGA8在应用中编程只有在加载了BOOT引导程序后才可能进行IAP应用如飞利浦对BOOT程序按自己需要进行剪裁那么全部BOOT程序区也可以全部提供给用户程序使用1°²×°P onyProg程序启动PonyProg程序通信协议在WIN98下可选择AVRISP API或AVRISP IO OK从芯片(DEVICE)下拉列表框中选择AVR micro 和AT mega8 4BOOT程序文件名为self.hexÈ»ºó´Ó²Ëµ¥Command->Write Program(FLASH)进行编程以下熔丝位应该是被选中的CKSEL1按Write按钮即可二按动RESET按钮一次可以进行IAP 编程注意第一步是不可少的用BROWSE(浏览)按钮选4择需有装入MCU的HEX文件进行IAP编程4步可实现EEPROM数据的编程连机失败答2²»ÄÜÑ¡ÔñƬÍâRC振荡或外部时钟应该使用SL-MEGA8开发板上的有源晶振4a使用并口通信下载线重新编译后可以连机一般是由于ATMEGA8被加密引起的装BOOT程序失败答2广州天河双龙电子有限公司 广州双龙:广州天河路561号新赛格电子城331室(510630)电话*************62653785 传真*************上海双龙:上海北京东路668号科技京城东搂12H2室(200031) 电话*************。
(-2K 28KB)(-2K 28KB) 执行同功能的程序 8MHzAVR 224MHz C5不再有作废的产品; 不需要5分钟的紫外线擦除时间;再也用不着因为掩模而无法入睡了;没有10周订货交货时间; 添加新特性易如反掌;容易调试;容易在线升级,几秒钟搞定;AVR指令表2000/5耿德根编数据传送指令位指令和位测试指令MOV Rd,Rr寄存器拷贝LSL Rd逻辑左移LDI Rd,K装入立即数LSR Rd逻辑右移LDS Rd,K直接从SRAM装入ROL Rd通过进位左循环LD Rd,X X变址间接装入R ROR Rd通过进位右循环LD Rd,X+X变址ASR Rd算术右移LD Rd,-X X变址SWAP s半字节交换LD Rd,Y Y变址BSET s置状态寄存器的位LD Rd,Y+Y变址BCLR s SREG中的位清除LD Rd,-Y Y变址SBI P,b置I/O寄存器的位LDD Rd,Y+q Y变址间接装入R CBI P,b清I/O寄存器的位LD Rd,Z Z变址BST Rr,b R中位到SREG中T标志LD Rd,Z+Z变址BLD Rd,b SREG中T标志到R某位LD Rd,-Z Z变址SEC置位进位标志LDD Rd,Z+q Z变址CLC清除进位标志STS K,Rr R数据直接送SRAM SEN置位负数标志ST X,Rr X变址间接装入SRAM CLN清除负数标志ST X+,Rr X变址SEZ置位零标志ST-X,Rr X变址CLZ清零标志位ST Y,Rr Y变址SEI置位全局中断标志ST Y+,Rr Y变址CLI清除全局中断标志ST-Y,Rr Y变址SES置位符号标志STD Y+q,Rr变址间接装入SRAM CLS清除符号标志ST Z,Rr Z变址SEV置位溢出标志位ST Z+,Rr Z变址CLV清除溢出标志ST-Z,Rr Z变址SET置位T标志STD Z+q,Rr Z变址CLT清除T标志LPM装入程序存储器SEH置位半进位标志IN Rd,P I/O口数据装入到R CLH清除半进位标志OUT P,Rr寄存器数据送I/O口NOP空操作PUSH Rr压寄存器到堆栈SLEEP休眠POP Rd堆栈弹出到寄存器WDR看门狗复位汇编器伪指令(伪指令前必须加“ ..” ).BYTE-- 保存寄节到变量.CSEG-- 代码段.DB-- 字节常数.EXIT-- 退出文件.DEF-- 设置寄存器的符号名.INCLUDE--包括号外的文件.DEVICE--定义被汇编的器件.LIST-- 打开列表文件生成器.DSEG-- 数据段.LISTMAC--打开宏表达式.DW-- 字常数.MACR O-- 宏开始.ENDMACRO--宏结束.NOLIST-- 关闭列表文件生成器.EQU-- 设置符号相等于一个表达式.ORG-- 设置程序起始位置.ESEG-- EPROM段.SET-- 设置一个与表达式相等的符号A VR ICE200在线仿真器双龙电子为中国大陆总代理ICE200可仿真的器件为A T90S1200/2313/2333/4433/4414/8515/4434/8535及A Ttiny10/11/12由于仿真器的电源不对外所以ICE200也支持低电压器件A T90S I/O空间定义十六进制地址名称AT90SMEG103名称AT90S1200名称AT90S8515功能(对应8515名称,*为对应MEG103)$3F($5F)SREG SREG SREG状态寄存器$3E($5E)SPH SPH堆栈指针高$3D($5D)SPL SPL堆栈指针低$3C($5C)XDIV XTAL分频控制器 *$3B($5B)RAMPZ GIMSK GIMSK通用中断屏蔽寄存器$3A($5A)EICR GIFR通用中断标态寄存器$39($59)EIMSK TIMSK TIMSK定时器/计数器中断屏敝寄存器$38($58)EIFR TIFR TIFR定时器/计数器中断标志寄存器$37($57)TIMSK定时器/计数器中断屏敝寄存器 * $36($56)TIFR定时器/计数器中断标志寄存器 * $35($55)MCUCR MCUCR MCUCR MCU通用控制寄存器$34($54)MCUSR MCU通用控制寄存器 *$33($53)TCCR0TCCR0TCCR0定时器/计数器0控制寄存器$32($52)TCNT0TCNT0TCNT0定时器/计数器0(8位)$31($51)OCR0定时器/计数器0输出比较寄存器 * $30($50)ASSR异步方式状态寄存器 *$2F($4F)TCCR1A TCCR1A定时器/计数器1控制寄存器A$2E($4E)TCCR1B TCCR1B定时器/计数器1控制寄存器B$2D($4D)TCNT1H TCNT1H定时器/计数器1高字节$2C($4C)TCNT1L TCNT1L定时器/计数器1低字节$2B($4B)OCR1AH OCR1AH定时器/计数器1输出比较寄存器A高字节$2A($4A)OCR1AL OCR1AL定时器/计数器1输出比较寄存器A低字节$29($49)OCR1BH OCR1BH定时器/计数器1输出比较寄存器B高字节$28($48)OCR1BL OCR1BL定时器/计数器1输出比较寄存器B低字节$27($47)ICR1H定时器/计数器1输入捕获寄存器高字节 * $26($46)ICR1L定时器/计数器1输入捕获寄存器低字节 * $25($45)TCCR2ICR1H T/C1输入捕获寄存器高字节$24($44)TCNT2ICR1L T/C1输入捕获寄存器低字节$23($43)OCR2定时器/计数器2输出比较寄存器 * $22($42)$21($41)WDTCR WDTCR WDTCR看门狗定时控制寄存器$20($40)$1F($3F)EEARH EEARH EPROM地址寄存器高字节$1E($3E)EEARL EEAR EEARL EPROM地址寄存器低字节$1D($3D)EEDR EEDR EEDR EPROM数据寄存器$1C($3C)EECR EECR EECR EPROM控制寄存器$1B($3B)PORTA PORTA A口数据寄存器$1A($3A)DDRA DDRA A口数据方向寄存器$19($39)PINA PINA A口输入脚$18($38)PORTB PORTB PORTB B口数据寄存器$17($37)DDRB DDRB DDRB B口数据方向寄存器$16($36)PINB PINB PINB B口输入脚$15($35)PORTC PORTC C口数据寄存器$14($34)ODRC C口数据方向寄存器$13($33)PINC C口输入脚$12($32)P0RTD PORTD PORTD D口数据寄存器$11($31)DDRD DDRD DDRD D口数据方向寄存器$10($30)PIND PIND PIND D口输入脚$0F($2F)SPOR SPOR SPI I/O数据寄存器$0E($2E)SPSR SPSR SPI状态寄存器$0D($2D)SPCR SPCR SPI控制寄存器$0C($2C)UDR UDR UART I/O数据寄存器$0B($2B)USR USR UART状态寄存器$0A($2A)UCR UCR UART控制寄存器$09($29)UBRR UBRR UART波特率寄存器$08($28)ACSR ACSR ACSR模拟比较控制和状态寄存器$07($27)ADMUX ADC多路选择寄存器 *$06($26)ADCSR ADC状态和控制寄存器 *$05($25)ADCH ADC数据寄存器高 *$04($24)ADCL ADC数据寄存器低 *$03($23)PORIE E口数据寄存器 *$02($22)DDRE E口数据方向寄存器 *$01($21)PINE E口输入脚 *$00($20)PINF F口输入脚 *复位和中断向量向量号程序地址源源中断定义1$000/RESET/RESET硬件脚和看门狗复位2$001INT0INT0外部中断请求03$002INT1INT1外部中断请求14$003TIMER1 CAPT TIMER1 CAPT定时器/计数器1捕获事件5$004TIMER1 COMPA TIMER1 COMPA定时器/计数器1比较匹配A6$005TIMER1 COMPB TIMER1 COMPB定时器/计数器1比较匹配B7$006TIMER1 OVF TIMER1 OVF定时器/计数器1溢出8$007TIMER0 OVF TIMER0 OVF定时器/计数器0溢出9$008SPI,STC SPI,STC串行传送完成10$009UART,RX UART,RX UART,RX完成11$00A UART,UDRE UART,UDRE UART数据寄存器空12$00B UART,TX UART,TX UART,TX完成13$00C ANA_COMP ANA_COMP模拟比较器OK-AVR万用串行下载开发实验板OK-AVR万用串行下载开发实验板,采用双龙电子公司的专利技术(专利号:98226094.6),是为ATMEL公司的AVR单片机特别研制的廉价的万用串行下载开发实验工具该板适用于ATMEL公司所有具有串行下载功能的AVR单片机,同时还可做AVR单片机的I/O口A/D D/A音频输出等实验本公司随机提供了ATMEL的集成模拟仿真调试软件,对初学AVR 单片机的设计者,可暂时节省购买较昂贵的实时仿真器及万用编程器的费用; OK-AVR万用串行下载开发实验板有CZ1电源及通讯下载用插座,LED电源指示,下载通讯工作指示;附AVR单片机8根下载信号线; AVR单片机四种DIP封装器件下载锁紧插座;WR划线电位器可作为模拟信号输入用,有音响器,另有用户器件扩展区,焊接你实验需要的器件;AVR集成软件包包括: AVR Assembler 1.30编译器; AVR Studio 3.00; AVR Prog;送一片AT90S1200单片机及集成软件AVR单片机数据资料OK-AVR下载开发实验板使用说明等光盘AVR单片机可下载器件:90S120090S231390S2323/90LS232390S2343/90LS234390S2333/90LS233390S4433/90LS443390S441490LS851590S4434/90LS443490S8535/90LS853590S8555ATtiny10/11/12/15MEGA103/603/161/163(适用所有串行下载信号线的AVR单片机)。
指令集概述指令操作数说明操作标志 # 时钟数算数和逻辑指令ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2 SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1SUBI Rd, K 减立即数Rd ← Rd - K Z,C,N,V,H 1SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与Rd ← Rd • Rr Z,N,V 1ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd • K Z,N,V 1OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1COM Rd 1 的补码Rd ← 0xFF − Rd Z,C,N,V 1NEG Rd 2 的补码Rd ← 0x00 − Rd Z,C,N,V,H 1SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1CBR Rd,K 寄存器位清零Rd ← Rd • (0xFF - K Z,N,V 1INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1DEC Rd 减一操作Rd ← Rd − 1 Z,N,V 1TST Rd 测试是否为零或负Rd ← Rd • Rd Z,N,V 1CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1SER Rd 寄存器置位Rd ← 0xFF None 1MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2MULSU Rd, Rr 有符号数与无符号数乘法 R1:R0 ← Rd x Rr Z,C 2FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2跳转指令RJMP k 相对跳转PC ← PC + k + 1 无 2IJMP 间接跳转到(Z PC ← Z 无 2RCALL k 相对子程序调用PC ← PC + k + 1 无 3ICALL 间接调用(Z PC ← Z 无 3RET 子程序返回PC ← STACK 无 4RETI 中断返回PC ← STACK I 4CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr PC ← PC + 2 or 3 无 1 / 2 / 3CP Rd,Rr 比较Rd − Rr Z, N,V,C,H 1CPC Rd,Rr 带进位比较Rd − Rr − C Z, N,V,C,H 1CPI Rd,K 与立即数比较Rd − K Z, N,V,C,H 1SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b=0 PC ← PC + 2 or 3 无 1 / 2 / 3 SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b=1 PC ← PC + 2 or 3 无1 / 2 / 3 SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b=0 PC ← PC + 2 or 3 无 1 / 2 / 3 SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令 if (P(b=1 PC ← PC + 2 or 3 无 1 / 2 / 3BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s = 1 then PC←PC+k + 1 无 1 / 2 BRBC s, k 状态寄存器位为"0” 则跳过下一条指令 if (SREG(s = 0 then PC← PC+k + 1 无 1 / 2 BREQ k 相等则跳转if (Z = 1 then PC ← PC + k + 1 无 1 / 2BRNE k 不相等则跳转 if (Z = 0 then P C ← PC + k + 1 无 1 / 2BRCS k 进位位为"1” 则跳转if (C = 1 then PC ← PC + k + 1 无 1 / 2BRCC k 进位位为"0” 则跳转if (C = 0 then PC ← PC + k + 1 无 1 / 2BRSH k 大于或等于则跳转if (C = 0 then PC ← PC + k + 1 无 1 / 2BRLO k 小于则跳转if (C = 1 then PC ← PC + k + 1 无 1 / 2BRMI k 负则跳转if (N = 1 then PC ← PC + k + 1 无 1 / 2BRPL k 正则跳转if (N = 0 then PC ← PC + k + 1 无 1 / 2BRGE k 有符号数大于或等于则跳转 if (N ⊕ V= 0 then PC ← PC + k + 1 无 1 / 2 BRLT k 有符号数负则跳转 if (N ⊕ V= 1 then PC ← PC + k + 1 无 1 / 2BRHS k 半进位位为"1” 则跳转if (H = 1 then PC ← PC + k + 1 无 1 / 2BRHC k 半进位位为"0” 则跳转if (H = 0 then PC ← PC + k + 1 无 1 / 2BRTS k T 为"1” 则跳转if (T = 1 then PC ← PC + k + 1 无 1 / 2BRTC k T 为"0” 则跳转if (T = 0 then PC ← PC + k + 1 无 1 / 2BRVS k 溢出标志为"1” 则跳转if (V = 1 then PC ← PC + k + 1 无 1 / 2BRVC k 溢出标志为"0” 则跳转if (V = 0 then PC ← PC + k + 1 无 1 / 2← Z - 1, (Z ← Rr 无 2STD Z+q,Rr 加载带偏移量的间接寻址数据(Z + q ← Rr 无 2STS k, Rr 从 SRAM 加载数据(k ← Rr 无 2LPM 加载程序空间的数据R0 ← (Z 无 3LPM Rd, Z 加载程序空间的数据Rd ← (Z 无 3LPM Rd, Z+ 加载程序空间的数据,然后地址加一Rd ← (Z, Z ← Z+1 无 3SPM 保存程序空间的数据(Z ← R1:R0 无 -IN Rd, P 从 I/O 端口读数据Rd ← P 无 1OUT P, Rr 输出端口P ← Rr 无 1PUSH Rr 将寄存器推入堆栈STACK ← Rr 无 2POP Rd 将寄存器从堆栈中弹出Rd ← STACK 无 2位和位测试指令SBI P,b I/O 寄存器位置位I/O(P,b ← 1 无 2CBI P,b I/O 寄存器位清零I/O(P,b ← 0 无 2LSL Rd 逻辑左移Rd(n+1 ← Rd(n, Rd(0 ← 0 Z,C,N,V 1LSR Rd 逻辑右移Rd(n ← Rd(n+1, Rd(7 ← 0 Z,C,N,V 1ROL Rd 带进位循环左移Rd(0← C,Rd(n+1← Rd(n,C← Rd(7 Z,C,N,V 1 ROR Rd 带进位循环右移Rd(7← C,Rd(n← Rd(n+1,C← Rd(0 Z,C,N,V 1 ASR Rd 算术右移Rd(n ← Rd(n+1, n=0..6 Z,C,N,V 1SWAP Rd 高低半字节交换Rd(3..0← Rd(7..4,Rd(7..4← Rd(3..0 无 1 BSET s 标志置位SREG(s ← 1 SREG(s 1BCLR s 标志清零SREG(s ← 0 SREG(s 1BST Rr, b 从寄存器将位赋给T T ← Rr(b T 1BLD Rd, b 将 T 赋给寄存器位Rd(b ← T 无 1SEC 进位位置位C ← 1 C 1CLC 进位位清零C ← 0 C 1SEN 负标志位置位N ← 1 N 1CLN 负标志位清零N ← 0 N 1SEZ 零标志位置位Z ← 1 Z 1CLZ 零标志位清零Z ← 0 Z 1SEI 全局中断使能I ← 1 I 1CLI 全局中断禁用I ← 0 I 1SES 符号测试标志位置位S ← 1 S 1CLS 符号测试标志位清零S ← 0 S 1SEV 2 的补码溢出标志置位V ← 1 V 1CLV 2 的补码溢出标志清零V ← 0 V 1SET SREG 的 T 置位T ← 1 T 1CLT SREG 的 T 清零T ← 0 T 1SEH SREG 的半进位标志置位H ← 1 H 1CLH SREG 的半进位标志清零H ← 0 H 1MCU 控制指令NOP 空操作无 1SLEEP 休眠 ( 见对睡眠功能的特殊说明无 1WDR 复位看门狗 ( 见对 WDR/timer 的特殊说明无 1。