📄 atmega16l_uart.lis
字号:
0004 ; d 高位(BOOT区设置):
0004 ;
0004 ; e 常用熔丝设置
0004 ;
0004 ; 打开运行SLISP.exe,首先记住:
0004 ;
0004 ; 1:未编程(配置熔丝检查框未打钩)
0004 ;
0004 ; 0:编程 (配置熔丝检查框打钩)
0004 ;
0004 ; 建议在配置熔丝之前先“读取配置”读出原来的设定,再自己编辑。
0004 ;
0004 ; 先了解一下M16的出厂设置。
0004 ;
0004 ; 默认设置为:内部RC振荡8MHz 6 CK + 65 ms CKSEL="0100" SUT="10"低位(时钟及启动时间设置):
0004 ;
0004 ; 1.BOD(Brown-out Detection) 掉电检测电路
0004 ;
0004 ; BODLEVEL(BOD电平选择): 1: 2.7V电平; 0:4.0V电平
0004 ;
0004 ; BODEN(BOD功能控制): 1:BOD功能禁止;0:BOD功能允许
0004 ;
0004 ; 使用方法:如果BODEN使能(复选框选中)启动掉电检测,则检测电平由BODLEVEL决定。一旦VCC下降到触发电平(2.7v或4.0v)以下,MCU复位;当VCC电平大于触发电平后,经过tTOUT 延时周后重新开始工作。
0004 ;
0004 ; 注:1.复选框选中代表0,0电平有效。
0004 ;
0004 ; 2.因为M16L可以工作在2.7v~5.5v,所以触发电平可选2.7v(BODLEVEL=0)或4.0v(BODLEVEL=1);而M16工作在4.5~5.5V,所以只能选BODLEVEL=0,BODLEVEL=1不适用于ATmega16。
0004 ;
0004 ; 2.复位启动时间选择
0004 ;
0004 ; SUT 1/0: 当选择不同晶振时,SUT有所不同。
0004 ;
0004 ; 如果没有特殊要求推荐SUT 1/0设置复位启动时间稍长,使电源缓慢上升。
0004 ;
0004 ; CKSEL3/0: 时钟源选择(时钟总表)
0004 ;
0004 ;
0004 ;
0004 ; 时钟总表
0004 ;
0004 ; 时钟源 启动延时 熔丝
0004 ;
0004 ; 外部时钟 6 CK + 0 ms CKSEL=0000 SUT="00"
0004 ;
0004 ; 外部时钟 6 CK + 4.1 ms CKSEL=0000 SUT="01"
0004 ;
0004 ; 外部时钟 6 CK + 65 ms CKSEL="0000" SUT="10"
0004 ;
0004 ; 内部RC振荡1MHZ 6 CK + 0 ms CKSEL="0001" SUT="00"
0004 ;
0004 ; 内部RC振荡1MHZ 6 CK + 4.1 ms CKSEL="0001" SUT="01"
0004 ;
0004 ; 内部RC振荡1MHZ1 6 CK + 65 ms CKSEL="0001" SUT="10"
0004 ;
0004 ; 内部RC振荡2MHZ 6 CK + 0 ms CKSEL="0010" SUT="00"
0004 ;
0004 ; 内部RC振荡2MHZ 6 CK + 4.1 ms CKSEL="0010" SUT="01"
0004 ;
0004 ; 内部RC振荡2MHZ 6 CK + 65 ms CKSEL="0010" SUT="10"
0004 ;
0004 ; 内部RC振荡4MHZ 6 CK + 0 ms CKSEL="0011" SUT="00"
0004 ;
0004 ; 内部RC振荡4MHZ 6 CK + 4.1 ms CKSEL="0011" SUT="01"
0004 ;
0004 ; 内部RC振荡4MHZ 6 CK + 65 ms CKSEL="0011" SUT="10"
0004 ;
0004 ; 内部RC振荡8MHZ 6 CK + 0 ms CKSEL="0100" SUT="00"
0004 ;
0004 ; 内部RC振荡8MHZ 6 CK + 4.1 ms CKSEL="0100" SUT="01"
0004 ;
0004 ; 内部RC振荡8MHZ 6 CK + 65 ms CKSEL=0100 SUT="10"
0004 ;
0004 ; 外部RC振荡≤0.9MHZ 18 CK + 0 ms CKSEL="0101" SUT="00"
0004 ;
0004 ; 外部RC振荡≤0.9MHZ 18 CK + 4.1 ms CKSEL="0101" SUT="01"
0004 ;
0004 ; 外部RC振荡≤0.9MHZ 18 CK + 65 ms CKSEL="0101" SUT="10"
0004 ;
0004 ; 外部RC振荡≤0.9MHZ 6 CK + 4.1 ms CKSEL="0101" SUT="11"
0004 ;
0004 ; 外部RC振荡0.9-3.0MHZ 18 CK + 0 ms CKSEL="0110" SUT="00"
0004 ;
0004 ; 外部RC振荡0.9-3.0MHZ 18 CK + 4.1 ms CKSEL="0110" SUT="01"
0004 ;
0004 ; 外部RC振荡0.9-3.0MHZ 18 CK + 65 ms CKSEL="0110" SUT="10"
0004 ;
0004 ; 外部RC振荡0.9-3.0MHZ 6 CK + 4.1 ms CKSEL=0110 SUT="11"
0004 ;
0004 ; 外部RC振荡3.0-8.0MHZ 18 CK + 0 ms CKSEL=0111 SUT="00"
0004 ;
0004 ; 外部RC振荡3.0-8.0MHZ 18 CK + 4.1 ms CKSEL="0111" SUT="01"
0004 ;
0004 ; 外部RC振荡3.0-8.0MHZ 18 CK + 65 ms CKSEL=0111 SUT="10"
0004 ;
0004 ; 外部RC振荡3.0-8.0MHZ 6 CK + 4.1 ms CKSEL="0111" SUT="11"
0004 ;
0004 ; 外部RC振荡8.0-12.0MHZ 18 CK + 0 ms CKSEL=1000 SUT="00"
0004 ;
0004 ; 外部RC振荡8.0-12.0MHZ 18 CK + 4.1 ms CKSEL="1000" SUT="01"
0004 ;
0004 ; 外部RC振荡8.0-12.0MHZ 18 CK + 65 ms CKSEL="1000" SUT="10"
0004 ;
0004 ; 外部RC振荡8.0-12.0MHZ 6 CK + 4.1 ms CKSEL="1000" SUT="11"
0004 ;
0004 ; 低频晶振(32.768KHZ) 1K CK + 4.1 ms CKSEL="1001" SUT="00"
0004 ;
0004 ; 低频晶振(32.768KHZ) 1K CK + 65 ms CKSEL="1001" SUT="01"
0004 ;
0004 ; 低频晶振(32.768KHZ) 32K CK + 65 ms CKSEL="1001" SUT="10"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 258 CK + 4.1 ms CKSEL="1010" SUT="00"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 258 CK + 65 ms CKSEL="1010" SUT="01"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 1K CK + 0 ms CKSEL=1010 SUT="10"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 1K CK + 4.1 ms CKSEL="1010" SUT="11"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 1K CK + 65 ms CKSEL="1011" SUT="00"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 16K CK + 0 ms CKSEL=1011 SUT="01"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 16K CK + 4.1ms CKSEL="1011" SUT="10"
0004 ;
0004 ; 低频石英/陶瓷振荡器(0.4-0.9MHZ) 16K CK + 65ms CKSEL="1011" SUT="11"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 258 CK + 4.1 ms CKSEL="1100" SUT="00"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 258 CK + 65 ms CKSEL="1100" SUT="01"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 1K CK + 0 ms CKSEL=1100 SUT="10"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 1K CK + 4.1 ms CKSEL="1100" SUT="11"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 1K CK + 65 ms CKSEL="1101" SUT="00"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 16K CK + 0 ms CKSEL="1101" SUT="01"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 16K CK + 4.1ms CKSEL="1101" SUT="10"
0004 ;
0004 ; 中频石英/陶瓷振荡器(0.9-3.0MHZ) 16K CK + 65ms CKSEL="1101" SUT="11"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 258 CK + 4.1 ms CKSEL="111"0 SUT="00"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 258 CK + 65 ms CKSEL="111"0 SUT="01"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 1K CK + 0 ms CKSEL="111"0 SUT="10"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 1K CK + 4.1 ms CKSEL="111"0 SUT="11"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 1K CK + 65 ms CKSEL=1111 SUT="00"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 16K CK + 0 ms CKSEL="111"1 SUT="01"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 16K CK + 4.1ms CKSEL="111"1 SUT="10"
0004 ;
0004 ; 高频石英/陶瓷振荡器(3.0-8.0MHZ) 16K CK + 65ms CKSEL="111"1 SUT="11"
0004 ;
0004 ;
0004 ;
0004 ; 高位(BOOT区设置):
0004 ;
0004 ; 1. JTAGEN(JTAG允许): 1:JTAG禁止; 0:JTAG允许
0004 ;
0004 ; OCDEN(OCD功能允许): 1:OCD功能禁止;0:OCD功能允许
0004 ;
0004 ; OCDEN(On-chip Debug):片上调试使能位
0004 ;
0004 ; JTAGEN(JTAG使能): JTAG测试访问端口
0004 ;
0004 ; 使用方法:在JTAG调试时,使能OCDEN JTAGEN两位(复选框打勾),并保持所有的锁定位处于非锁定状态;在实际使用时为降低功耗,不使能OCDEN JTAGEN,大约减少2-3mA的电流。
0004 ;
0004 ; 2. SPIEN(SPI下载允许): 1:SPI下载禁止;0:SPI下载使能
0004 ;
0004 ; 注:在双龙的软件里,SPIEN是不能编辑的,默认为0。
0004 ;
0004 ; 3. CKOPT(选择放大器模式): CKOPT=0:高幅度振荡输出;CKOPT=1:低幅度振荡输出
0004 ;
0004 ; 当CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2 驱动第二个时钟缓冲器的情况,而且这种模式的频率范围比较宽。当保持CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。
0004 ;
0004 ; 其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。(据我测量功耗差别在1mA左右)。
0004 ;
0004 ; 对于谐振器,当CKOPT未编程时的最大频率为8 MHz,CKOPT编程时为16 MHz。内部RC振荡器工作时不对CKOPT编程。
0004 ;
0004 ; 4.EEAVE(烧录时EEPROM数据保留): 1:不保留;0:保留
0004 ;
0004 ; 在一次使用EEProm时没注意EEAVE位的编程,调试程序每次烧flash时,EEProm都没了,后来才知道,EEAVE打了勾(1:不保留)。//(*chenran疑问:打了勾是0,怎么是不保留呢)//
0004 ;
0004 ; 5.BOOTRST(复位入口选择): 1:程序从0x0000地址开始 0:复位后从BOOT区执行(参考BOOTSZ0/1)
0004 ;
0004 ; 6.BOOTSZ 1/0(引导区程序大小及入口):
0004 ;
0004 ; 00: 1024Word/0xc00;
0004 ;
0004 ; 01: 512Word/0xe00;
0004 ;
0004 ; 10: 256Word/0xf00;
0004 ;
0004 ; 11: 128Word/0xf80
0004 ;
0004 ;
0004 ; /*
0004 ; ATMEGA16L 配置为外部16M晶振的方法:
0004 ; 配置环境:SL-ISP V1.4.2.3
0004 ; 熔丝配置:以下仅注明需要打勾的地方
0004 ;
0004 ; BODLEVEL=0 //很关键
0004 ; CKSEL=1111 //很关键
0004 ; SUT=01 //可根据自己需要调整
0004 ; BOOTSZ=00 //可根据自己需要调整
0004 ; CKOPT=0 //很关键
0004 ; SPIEN=0 //特别关键,想不勾也不可能,不过如果显示没勾上就意味着软件出
0004 ; //------------------------------------------------------------------------------
0004 ; /*
0004 ; 引导码: 2 byte = 0xFEFE
0004 ; 系统设备号 1 byte = 0x02
0004 ; 这三个不管他
0004 ; 对这三个固定值后面的数据没个字节进行CRC16效验,
0004 ; 算法:
0004 ; void CRC16(unsigned int *crc,unsigned char chr).{. data unsigned int tmp;.. tmp = *crc;. *crc = (tmp << 8) ^ TableOfCRC16[chr ^ (tmp >> 8)];.}
0004 ; 最后两个字节就是CRC16的值:
0004 ; UDR = CRC >> 8;
0004 ; UDR = CRC;
0004 ; 这个就是发送CRC最后两位数据:
0004 ; 引导码: 2 byte = 0xFEFE
0004 ; 系统设备号 1 byte = 0x02
0004 ; 控制器地址码: 1 byte = 1 - 127(0xFF为广播地址,0x00为系统保留)
0004 ; 数据包长度: 2 byte = 0 - 0x07FF,表示紧跟数据包长度;
0004 ; 数据包: (变长) 长度可变,由数据包长度指定;
0004 ; 校验码: 2 byte = 计算从地址码开始到数据包最后一个字节的CRC16码。
0004 ; */
0004 ; //CCITT CRC16
0004 ; flash unsigned int TableOfCRC16[256] = /*CRC16校验码表*/
0004 ; {
0004 ; 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0004 ; 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0004 ; 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0004 ; 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0004 ; 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0004 ; 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0004 ; 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0004 ; 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0004 ; 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0004 ; 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0004 ; 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0004 ; 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0004 ; 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0004 ; 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0004 ; 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0004 ; 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0004 ; 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0004 ; 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0004 ; 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0004 ; 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0004 ; 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0004 ; 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0004 ; 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0004 ; 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0004 ; 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0004 ; 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0004 ; 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0004 ; 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0004 ; 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0004 ; 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0004 ; 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0004 ; 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
0004 ; };
0004 ;
0004 ; /*计算单字符CRC16代码*/
0004 ; void CRC16(unsigned int *crc,unsigned char chr)
0004 ; {
0004 .dbline 292
0004 ; unsigned int tmp;
0004 ; tmp = *crc;
0004 F801 movw R30,R16
0006 A080 ldd R10,z+0
0008 B180 ldd R11,z+1
000A .dbline 293
000A ; *crc = (tmp << 8) ^ TableOfCRC16[chr ^ (tmp >> 8)];
000A 1501 movw R2,R10
000C 232C mov R2,R3
000E 3324 clr R3
0010 E22F mov R30,R18
0012 FF27 clr R31
0014 E225 eor R30,R2
0016 F325 eor R31,R3
0018 EE0F lsl R30
001A FF1F rol R31
001C 80E0 ldi R24,<_TableOfCRC16
001E 90E0 ldi R25,>_TableOfCRC16
0020 E80F add R30,R24
0022 F91F adc R31,R25
0024 2590 lpm R2,Z+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -