📄 atmegal16l.lst
字号:
031A DF0A RCALL _read_byte
031B 01FA MOVW R30,R20
031C 8301 STD Z+1,R16
(0192) temp[2] = read_byte();
031D DF07 RCALL _read_byte
031E 01FA MOVW R30,R20
031F 8302 STD Z+2,R16
(0193) temp[3] = read_byte();
0320 DF04 RCALL _read_byte
0321 01FA MOVW R30,R20
0322 8303 STD Z+3,R16
(0194) temp[4] = read_byte();
0323 DF01 RCALL _read_byte
0324 01FA MOVW R30,R20
0325 8304 STD Z+4,R16
(0195) temp[5] = read_byte();
0326 DEFE RCALL _read_byte
0327 01FA MOVW R30,R20
0328 8305 STD Z+5,R16
(0196) temp[6] = read_byte();
0329 DEFB RCALL _read_byte
032A 01FA MOVW R30,R20
032B 8306 STD Z+6,R16
(0197) temp[7] = read_byte();
032C DEF8 RCALL _read_byte
032D 01FA MOVW R30,R20
032E 8307 STD Z+7,R16
(0198) if(crccheck(temp,8))
032F E028 LDI R18,0x8
0330 018A MOVW R16,R20
0331 DE9F RCALL _crccheck
0332 2300 TST R16
0333 F011 BEQ 0x0336
(0199) return false;
0334 E001 LDI R16,1
0335 C001 RJMP 0x0337
(0200) else
(0201) return true;
0336 2700 CLR R16
0337 940E0415 CALL pop_gset1
0339 9508 RET
_ds1820_match:
i --> R20
p --> R22
033A 940E0429 CALL push_gset2
033C 01B8 MOVW R22,R16
(0202) }
(0203)
(0204) /*===================================================================
(0205) // 函数功能: 匹配DS18B20
(0206) // 形参: *p DS18B20的Rom Code
(0207) // 返回: void
(0208) // 编写: 2004/8/25
(0209) ===================================================================*/
(0210) void ds1820_match(unsigned char *p)
(0211) {
(0212) unsigned char i;
(0213) ds1820_ack();
033D DECA RCALL _ds1820_ack
(0214) write_byte(0x55);
033E E505 LDI R16,0x55
033F DF0B RCALL _write_byte
(0215) for(i=0;i<8;i++)
0340 2744 CLR R20
0341 C007 RJMP 0x0349
(0216) write_byte(p[i]);
0342 2FE4 MOV R30,R20
0343 27FF CLR R31
0344 0FE6 ADD R30,R22
0345 1FF7 ADC R31,R23
0346 8100 LDD R16,Z+0
0347 DF03 RCALL _write_byte
0348 9543 INC R20
0349 3048 CPI R20,0x8
034A F3B8 BCS 0x0342
(0217) }
034B 940E0406 CALL pop_gset2
034D 9508 RET
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\Uart.c
(0001) #include <iom16v.h>
(0002) #include "Uart.h"
(0003) #include "Crc.h"
(0004)
(0005)
(0006)
(0007) //============================================================
(0008) //函 数:void Uart_PutChar(unsigned char Data)
(0009) //功 能:发送一个字符
(0010) //入口参数:发送的字符数据
(0011) //返 回 值:无
(0012) //设 计 者:覃道堂
(0013) //创作时间:2006-03-16
(0014) //修改时间:
(0015) //修改目的:
(0016) //============================================================
(0017) void Uart_PutChar(unsigned char Data)
(0018) {
(0019) //while(!(UCSRA & 0x20));
(0020) while ( !( UCSRA & (1<<UDRE)) );
_Uart_PutChar:
Data --> R16
034E 9B5D SBIS 0x0B,5
034F CFFE RJMP _Uart_PutChar
(0021) UDR = Data;
0350 B90C OUT 0x0C,R16
(0022) }
0351 9508 RET
(0023)
(0024) //============================================================
(0025) //函 数:int Uart_GetChar(void)
(0026) //功 能:接收一个字符
(0027) //入口参数:无
(0028) //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据
(0029) //设 计 者:覃道堂
(0030) //创作时间:2006-03-16
(0031) //修改时间:
(0032) //修改目的:
(0033) //============================================================
(0034) int Uart_GetChar(void)
(0035) {
(0036) unsigned char status,res;
(0037)
(0038) if(!(UCSRA&(1<<RXC)))
_Uart_GetChar:
res --> R16
status --> R18
0352 995F SBIC 0x0B,7
0353 C003 RJMP 0x0357
(0039) return -1;
0354 EF0F LDI R16,0xFF
0355 EF1F LDI R17,0xFF
0356 C00A RJMP 0x0361
(0040) status = UCSRA;
0357 B12B IN R18,0x0B
(0041) res = UDR;
0358 B10C IN R16,0x0C
(0042) if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )//if(status & 0x1c)//数据益处,数据贞错误,校验错误
0359 2F82 MOV R24,R18
035A 7180 ANDI R24,0x10
035B 608C ORI R24,0xC
035C F019 BEQ 0x0360
(0043) return -1;
035D EF0F LDI R16,0xFF
035E EF1F LDI R17,0xFF
035F C001 RJMP 0x0361
(0044) else
(0045) return res;
0360 2711 CLR R17
0361 9508 RET
_Uart_Send_Frame:
Len --> R20
Frame --> R22
0362 940E0429 CALL push_gset2
0364 01A9 MOVW R20,R18
0365 01B8 MOVW R22,R16
(0046) }
(0047)
(0048) //============================================================
(0049) //函 数:void Uart_Send_Frame(unsigned char *Frame, int Len)
(0050) //功 能:发送一个字符串
(0051) //入口参数:*Frame发送一个字符串数据,Len发送的长度
(0052) //返 回 值:无
(0053) //设 计 者:覃道堂
(0054) //创作时间:2006-03-16
(0055) //修改时间:
(0056) //修改目的:
(0057) //============================================================
(0058) void Uart_Send_Frame(unsigned char *Frame, int Len)
(0059) {
0366 C007 RJMP 0x036E
(0060) while(Len > 0)
(0061) {
(0062) Uart_PutChar(*Frame);
0367 01FB MOVW R30,R22
0368 8100 LDD R16,Z+0
0369 DFE4 RCALL _Uart_PutChar
(0063) Frame ++;
036A 5F6F SUBI R22,0xFF
036B 4F7F SBCI R23,0xFF
(0064) Len --;
036C 5041 SUBI R20,1
036D 4050 SBCI R21,0
036E 2422 CLR R2
036F 2433 CLR R3
0370 1624 CP R2,R20
0371 0635 CPC R3,R21
0372 F3A4 BLT 0x0367
(0065) }
(0066) }
0373 940E0406 CALL pop_gset2
0375 9508 RET
_Uart_Receive_Frame:
Len --> R20
ReceiveLen --> R22
TimerCount --> R10
ByteData --> R14
OverTime --> R12
Frame --> Y+10
0376 940E03F1 CALL push_arg4
0378 940E0435 CALL push_gset5
037A 0169 MOVW R12,R18
(0067)
(0068) //============================================================
(0069) //函 数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
(0070) // int OverTime)
(0071) //功 能:接收一个字符串
(0072) //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间
(0073) //返 回 值:无
(0074) //设 计 者:覃道堂
(0075) //创作时间:2006-03-16
(0076) //修改时间:
(0077) //修改目的:
(0078) //============================================================
(0079) unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
(0080) {
(0081) int ByteData;
(0082) int TimerCount = 0;
037B 24AA CLR R10
037C 24BB CLR R11
(0083) int ReceiveLen = 0;
037D 2766 CLR R22
037E 2777 CLR R23
(0084) int Len = 255;
037F EF4F LDI R20,0xFF
0380 E050 LDI R21,0
0381 C029 RJMP 0x03AB
(0085)
(0086) while(ReceiveLen < Len)
(0087) {
(0088) while((ByteData = Uart_GetChar()) == -1)
(0089) {
(0090) if(TIFR& 0x02)
0382 B628 IN R2,0x38
0383 FE21 SBRS R2,1
0384 C00B RJMP 0x0390
(0091) {
(0092) if(++TimerCount > OverTime)
0385 01C5 MOVW R24,R10
0386 9601 ADIW R24,1
0387 015C MOVW R10,R24
0388 14CA CP R12,R10
0389 04DB CPC R13,R11
038A F414 BGE 0x038D
(0093) return 0;//等待超时如果还没接收到数据,则返回数据长度0
038B 2700 CLR R16
038C C022 RJMP 0x03AF
(0094) TIFR=TIFR|0x02;
038D B788 IN R24,0x38
038E 6082 ORI R24,2
038F BF88 OUT 0x38,R24
0390 DFC1 RCALL _Uart_GetChar
0391 0178 MOVW R14,R16
0392 3F0F CPI R16,0xFF
0393 EFEF LDI R30,0xFF
0394 071E CPC R17,R30
0395 F361 BEQ 0x0382
(0095) }
(0096) }
(0097) Frame[ReceiveLen] = (unsigned char)ByteData;
0396 01FB MOVW R30,R22
0397 840A LDD R0,Y+10
0398 841B LDD R1,Y+11
0399 0DE0 ADD R30,R0
039A 1DF1 ADC R31,R1
039B 82E0 STD Z+0,R14
(0098) if(ReceiveLen == 0x04)
039C 3064 CPI R22,4
039D E0E0 LDI R30,0
039E 077E CPC R23,R30
039F F439 BNE 0x03A7
(0099) Len = Frame[ReceiveLen] + 0x02;
03A0 01FB MOVW R30,R22
03A1 0DE0 ADD R30,R0
03A2 1DF1 ADC R31,R1
03A3 8140 LDD R20,Z+0
03A4 2755 CLR R21
03A5 5F4E SUBI R20,0xFE
03A6 4F5F SBCI R21,0xFF
(0100) ReceiveLen ++;
03A7 5F6F SUBI R22,0xFF
03A8 4F7F SBCI R23,0xFF
(0101) TimerCount = 0;
03A9 24AA CLR R10
03AA 24BB CLR R11
03AB 1764 CP R22,R20
03AC 0775 CPC R23,R21
03AD F314 BLT 0x0390
(0102) }
(0103) return ReceiveLen;
03AE 2F06 MOV R16,R22
03AF 940E040F CALL pop_gset5
03B1 9624 ADIW R28,4
03B2 9508 RET
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\init.c
(0001)
(0002)
(0003) #include <iom16v.h>
(0004) #include <macros.h>
(0005) #include "Uart.h"
(0006) #include "init.h"
(0007) //============================================================
(0008) //计算和设置16的特率参数 覃道堂 2007-01-16
(0009) #define BAUD 9600
(0010) #define CRYSTAL 4000000
(0011) #define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
(0012) #define BAUD_H (unsigned char)(BAUD_SETTING>>8)
(0013) #define BAUD_L (unsigned char)BAUD_SETTING
(0014)
(0015) /**************************************
(0016) **芯片类型:ATmega16
(0017) **时钟频率:8M
(0018) **硬件接口说明:
(0019) PD0:串口接收 主要用于232/485的接收
(0020) PD1:串口发送 主要用于232/485的发送
(0021) PD2:主要用于对超声波变送器的收到回波的检测(连到Pin5)
(0022) PD3:主要用于对超声波的开始检测的触发(连到Pin3)
(0023) PD4:主要用于485收发的使能
(0024) PD5:用于超声波范围控制引脚1(置为内部上拉)
(0025) PD6:用于超声波范围控制引脚2(置为内部上拉)
(0026) **************************************/
(0027) void port_init(void) //ATMEGA16口的初始化
(0028) {
(0029) PORTA = 0x20;
_port_init:
03B3 E280 LDI R24,0x20
03B4 BB8B OUT 0x1B,R24
(0030) DDRA |= 0x20;
03B5 9AD5 SBI 0x1A,5
(0031) PORTB = 0x00;
03B6 2422 CLR R2
03B7 BA28 OUT 0x18,R2
(0032) DDRB = 0x00;
03B8 BA27 OUT 0x17,R2
(0033) PORTC = 0x00;
03B9 BA25 OUT 0x15,R2
(0034) DDRC = 0x00;
03BA BA24 OUT 0x14,R2
(0035) PORTD = 0x80;
03BB E880 LDI R24,0x80
03BC BB82 OUT 0x12,R24
(0036) DDRD = 0x80;//口初始化,初始化PD.3口为输出
03BD BB81 OUT 0x11,R24
(0037) }
03BE 9508 RET
(0038) //============================================================
(0039) //函 数:void Init_Com(void)
(0040) //功 能:初始化串口设置
(0041) //入口参数:无
(0042) //返 回 值:无
(0043) //设 计 者:覃道堂
(0044) //创作时间:2007-01-16
(0045) //修改时间:
(0046) //修改目的:
(0047) //============================================================
(0048) void uart0_init(void)
(0049) {
(0050) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
03BF 2422 CLR R2
03C0 B82A OUT 0x0A,R2
(0051) UCSRA = 0x00;
03C1 B82B OUT 0x0B,R2
(0052) UCSRC = BIT(URSEL) | 0x06;
03C2 E886 LDI R24,0x86
03C3 BD80 OUT 0x20,R24
(0053) UBRRL =BAUD_L;//设置波特率为9600
03C4 E189 LDI R24,0x19
03C5 B989 OUT 0x09,R24
(0054) UBRRH =BAUD_H;
03C6 BC20 OUT 0x20,R2
(0055) UCSRB = 0x18;
03C7 E188 LDI R24,0x18
03C8 B98A OUT 0x0A,R24
(0056) }
03C9 9508 RET
(0057) /**************************************
(0058) **芯片类型:ATmega16
(0059) **时钟频率:8M
(0060) **硬件接口说明:无
(0061) **函数功能说明:对定时器0进行初始化,使定时器0的溢出频率为40HZ
(0062) **函数输入参数及说明:无
(0063) **函数返回值:无
(0064) **在本函数以外定义的变量:无
(0065) **调用的函数说明:无
(0066) **修改人:
(0067) **修改日期:
(0068) **修改说明:
(0069) **************************************/
(0070) void timer0_init(void)//定时器初始化
(0071) {
(0072) TCCR0 = 0x00; //stop
_timer0_init:
03CA 2422 CLR R2
03CB BE23 OUT 0x33,R2
(0073) TCNT0 = 0x3D; //set count
03CC E38D LDI R24,0x3D
03CD BF82 OUT 0x32,R24
(0074) OCR0 = 0xC3; //set compare
03CE EC83 LDI R24,0xC3
03CF BF8C OUT 0x3C,R24
(0075) }
03D0 9508 RET
(0076) /**************************************
(0077) **芯片类型:ATmega16
(0078) **时钟频率:4M
(0079) **硬件接口说明:无
(0080) **函数功能说明:对定时器1进行初始化,计数初值为0
(0081) **函数输入参数及说明:无
(0082) **函数返回值:无
(0083) **在本函数以外定义的变量:无
(0084) **调用的函数说明:无
(0085) **修改人:
(0086) **修改日期:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -