📄 twi.lst
字号:
__start:
__text_start:
0017 E5CF LDI R28,0x5F
0018 E0D4 LDI R29,4
0019 BFCD OUT 0x3D,R28
001A BFDE OUT 0x3E,R29
001B 51C0 SUBI R28,0x10
001C 40D0 SBCI R29,0
001D EA0A LDI R16,0xAA
001E 8308 STD Y+0,R16
001F 2400 CLR R0
0020 E6E8 LDI R30,0x68
0021 E0F0 LDI R31,0
0022 E010 LDI R17,0
0023 37E1 CPI R30,0x71
0024 07F1 CPC R31,R17
0025 F011 BEQ 0x0028
0026 9201 ST R0,Z+
0027 CFFB RJMP 0x0023
0028 8300 STD Z+0,R16
0029 E2E6 LDI R30,0x26
002A E0F0 LDI R31,0
002B E6A0 LDI R26,0x60
002C E0B0 LDI R27,0
002D E010 LDI R17,0
002E 32EE CPI R30,0x2E
002F 07F1 CPC R31,R17
0030 F021 BEQ 0x0035
0031 95C8 LPM
0032 9631 ADIW R30,1
0033 920D ST R0,X+
0034 CFF9 RJMP 0x002E
0035 D015 RCALL _main
_exit:
0036 CFFF RJMP _exit
FILE: D:\myavrproject\icc\twi\main.c
(0001) //ICC-AVR application builder : 2007-1-8 15:26:42
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include <stdio.h>
(0008)
(0009) #include "uart.h"
(0010) #include "function.h"
(0011) #include "port.h"
(0012) #include "twi.h"
(0013)
(0014) //
(0015)
(0016)
(0017) //Watchdog initialize
(0018) // prescale: 2048K
(0019) void watchdog_init(void)
(0020) {
(0021) WDR(); //this prevents a timout on enabling
_watchdog_init:
0037 95A8 WDR
(0022) WDTCR = 0x0f; //WATCHDOG ENABLED - dont forget to issue WDRs
0038 E08F LDI R24,0xF
0039 BD81 OUT 0x21,R24
(0023)
(0024) //close watch dog
(0025) //set WDCE and WDE
(0026) WDTCR |= (1<<WDCE) | (1<<WDE);
003A B581 IN R24,0x21
003B 6188 ORI R24,0x18
003C BD81 OUT 0x21,R24
(0027) //close WDT
(0028) WDTCR = 0x00;
003D 2422 CLR R2
003E BC21 OUT 0x21,R2
003F 9508 RET
(0029)
(0030) }
(0031) //call this routine to initialize all peripherals
(0032) void init_devices(void)
(0033) {
(0034) //stop errant interrupts until set up
(0035) CLI(); //disable all interrupts
_init_devices:
0040 94F8 BCLR 7
(0036) port_init();
0041 D041 RCALL _port_init
(0037) watchdog_init();
0042 DFF4 RCALL _watchdog_init
(0038) twi_init();
0043 D048 RCALL _twi_init
(0039) uart0_init();
0044 D01E RCALL _uart0_init
(0040)
(0041)
(0042) MCUCR = 0x00;
0045 2422 CLR R2
0046 BE25 OUT 0x35,R2
(0043) GICR = 0x00;
0047 BE2B OUT 0x3B,R2
(0044) TIMSK = 0x00; //timer interrupt sources
0048 BE29 OUT 0x39,R2
(0045) SEI(); //re-enable interrupts
0049 9478 BSET 7
004A 9508 RET
_main:
004B 9721 SBIW R28,1
(0046) //all peripherals are now initialized
(0047) }
(0048) //
(0049) void main(void)
(0050) {
(0051) //initial device
(0052) init_devices();
004C DFF3 RCALL _init_devices
004D C012 RJMP 0x0060
(0053) //insert your functional code here...
(0054)
(0055) while(1)
(0056) {
(0057)
(0058) strTWI.STATUS=TW_OK;
004E E081 LDI R24,1
004F 93800068 STS strTWI,R24
(0059) putchar(TWI_RW(0x30+TW_WRITE,&ORGDATA[0],8));
0051 E088 LDI R24,0x8
0052 8388 STD Y+0,R24
0053 E620 LDI R18,0x60
0054 E030 LDI R19,0
0055 E300 LDI R16,0x30
0056 D03F RCALL _TWI_RW
0057 D19B RCALL _putchar
(0060) // while(strTWI.STATUS==TW_BUSY);//wait
(0061) if (strTWI.STATUS==TW_FAIL)
0058 91800068 LDS R24,strTWI
005A 3082 CPI R24,2
005B F411 BNE 0x005E
(0062) {
(0063) //operate faile
(0064) putchar(0xff);
005C EF0F LDI R16,0xFF
005D D195 RCALL _putchar
(0065) }
(0066) delay_100ms(0x10);
005E E100 LDI R16,0x10
005F D011 RCALL _delay_100ms
0060 CFED RJMP 0x004E
0061 9621 ADIW R28,1
0062 9508 RET
FILE: D:\myavrproject\icc\twi\uart.c
(0001) //ICC-AVR application builder : 2007-1-9 14:28:21
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008)
(0009) //UART0 initialize
(0010) // desired baud rate: 9600
(0011) // actual: baud rate:9615 (0.2%)
(0012) // char size: 8 bit
(0013) // parity: Disabled
(0014) void uart0_init(void)
(0015) {
(0016) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
0063 2422 CLR R2
0064 B82A OUT 0x0A,R2
(0017) UCSRA = 0x02;
0065 E082 LDI R24,2
0066 B98B OUT 0x0B,R24
(0018) UCSRC = BIT(URSEL) | 0x06;
0067 E886 LDI R24,0x86
0068 BD80 OUT 0x20,R24
(0019) UBRRL = 0x67; //set baud rate lo
0069 E687 LDI R24,0x67
006A B989 OUT 0x09,R24
(0020) UBRRH = 0x00; //set baud rate hi
006B BC20 OUT 0x20,R2
(0021) UCSRB = 0xF8;
006C EF88 LDI R24,0xF8
006D B98A OUT 0x0A,R24
006E 9508 RET
(0022) }
(0023)
(0024) #pragma interrupt_handler uart0_rx_isr:12
(0025) void uart0_rx_isr(void)
(0026) {
_uart0_rx_isr:
006F 9518 RETI
(0027) //uart has received a character in UDR
(0028)
(0029) }
(0030)
(0031) #pragma interrupt_handler uart0_tx_isr:14
(0032) void uart0_tx_isr(void)
(0033) {
_uart0_tx_isr:
0070 9518 RETI
_delay_100ms:
b --> R20
a --> R16
0071 D13C RCALL push_gset1
FILE: D:\myavrproject\icc\twi\function.c
(0001) //ICC-AVR application builder : 2007-1-8 15:25:18
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include"uart.h"
(0008)
(0009) //毫秒级延时
(0010) void delay_100ms(uchar a)
(0011) {
0072 C009 RJMP 0x007C
(0012) unsigned int b;
(0013) while(a--)
(0014) {
(0015) for(b=0x3333;b>0;b--)
0073 E343 LDI R20,0x33
0074 E353 LDI R21,0x33
0075 C003 RJMP 0x0079
(0016) {
(0017) _NOP();
0076 0000 NOP
0077 5041 SUBI R20,1
0078 4050 SBCI R21,0
0079 3040 CPI R20,0
007A 0745 CPC R20,R21
007B F7D1 BNE 0x0076
007C 2E20 MOV R2,R16
007D 2433 CLR R3
007E 5001 SUBI R16,1
007F 2022 TST R2
0080 F791 BNE 0x0073
0081 D12F RCALL pop_gset1
0082 9508 RET
FILE: D:\myavrproject\icc\twi\port.c
(0001) //ICC-AVR application builder : 2007-1-9 16:27:45
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
0083 2422 CLR R2
0084 BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
0085 BA27 OUT 0x17,R2
(0012) PORTC = 0x30; //m103 output only
0086 E380 LDI R24,0x30
0087 BB85 OUT 0x15,R24
(0013) DDRC = 0x00;
0088 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
0089 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
008A BA21 OUT 0x11,R2
008B 9508 RET
FILE: D:\myavrproject\icc\twi\twi.c
(0001) //ICC-AVR application builder : 2007-1-9 16:35:49
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "twi.h"
(0009)
(0010)
(0011) //TWI的数据结构变量
(0012) struct str_TWI strTWI;
(0013) //定义全局变量
(0014) unsigned char ORGDATA[8]={0xAA,0xA5,0x55,0x5A,0x01,0x02,0x03,0x04}; //原始数据
(0015) //unsigned char CMPDATA[8]; //比较数据
(0016)
(0017)
(0018) //TWI initialize
(0019) // bit rate:72
(0020) //50KHZ
(0021) void twi_init(void)
(0022) {
(0023) TWCR= 0X00; //disable twi
_twi_init:
008C 2422 CLR R2
008D BE26 OUT 0x36,R2
(0024) TWBR= 0x48; //set bit rate
008E E488 LDI R24,0x48
008F B980 OUT 0x00,R24
(0025) TWSR= 0x00; //set prescale
0090 B821 OUT 0x01,R2
(0026) TWAR= 0x21; //set slave address
0091 E281 LDI R24,0x21
0092 B982 OUT 0x02,R24
(0027) //TWAR= 0x31; //set slave address
(0028) TWCR= 0x45; //enable twi
0093 E485 LDI R24,0x45
0094 BF86 OUT 0x36,R24
0095 9508 RET
(0029) }
(0030)
(0031) //
(0032)
(0033) unsigned char TWI_RW(unsigned char sla_rw,unsigned char *ptr,unsigned char len)
(0034) {
(0035) unsigned char i;
(0036) if (strTWI.STATUS==TW_BUSY)
_TWI_RW:
i --> Y+1
len --> Y+0
ptr --> R18
sla_rw --> R16
0096 90200068 LDS R2,strTWI
0098 2022 TST R2
0099 F411 BNE 0x009C
(0037) {
(0038) //TWI忙,不能进行操作
(0039) return OP_BUSY;
009A 2700 CLR R16
009B C014 RJMP 0x00B0
(0040) }
(0041) strTWI.STATUS=TW_BUSY;
009C 2422 CLR R2
009D 92200068 STS strTWI,R2
(0042) strTWI.SLA=sla_rw;
009F 93000069 STS strTWI+1,R16
(0043) strTWI.DATALEN=len;
00A1 8008 LDD R0,Y+0
00A2 9200006C STS 0x6C,R0
(0044) strTWI.pBUF=ptr;
00A4 9330006B STS strTWI+3,R19
00A6 9320006A STS strTWI+2,R18
(0045) strTWI.STATE=ST_START;
00A8 E081 LDI R24,1
00A9 9380006D STS 0x6D,R24
(0046) strTWI.FAILCNT=0;
00AB 9220006E STS 0x6E,R2
(0047) TWCR=(1<<TWSTA)|TW_ACT; //启动start信号
00AD EA85 LDI R24,0xA5
00AE BF86 OUT 0x36,R24
(0048) return OP_RUN;
00AF E001 LDI R16,1
00B0 9508 RET
_twi_isr:
action --> R10
state --> R20
status --> R22
00B1 D113 RCALL push_lset
00B2 D0F5 RCALL push_gset4
(0049) }
(0050)
(0051) #pragma interrupt_handler twi_isr:18
(0052) void twi_isr(void)
(0053) {
(0054) //twi event
(0055) //根据strTWI.SLA的最低位决定
(0056) //bit0=1 TW_READ 读
(0057) //bit0=0 TW_WRITE 写
(0058) unsigned char action,state,status;
(0059) action=strTWI.SLA&TW_READ; //取操作模式
00B3 91800069 LDS R24,strTWI+1
00B5 7081 ANDI R24,1
00B6 2EA8 MOV R10,R24
(0060) state=strTWI.STATE;
00B7 9140006D LDS R20,0x6D
(0061) status=TWSR&0xF8; //屏蔽预分频位
00B9 B161 IN R22,0x01
00BA 7F68 ANDI R22,0xF8
(0062) putchar(0xdd);
00BB ED0D LDI R16,0xDD
00BC E010 LDI R17,0
00BD D135 RCALL _putchar
(0063) if ((status>=0x60)&&(status!=0x00))
00BE 3660 CPI R22,0x60
00BF F028 BCS 0x00C5
00C0 2366 TST R22
00C1 F019 BEQ 0x00C5
(0064) {
(0065) switch(state)
00C2 2EC4 MOV R12,R20
00C3 24DD CLR R13
00C4 C0DC RJMP 0x01A1
(0066) {
(0067) //case ST_START: //START状态检查
(0068)
(0069) }
(0070) }
(0071) else if((status<0x60)&&(status!=0x00))
00C5 3660 CPI R22,0x60
00C6 F008 BCS 0x00C8
00C7 C0D9 RJMP 0x01A1
00C8 2366 TST R22
00C9 F409 BNE 0x00CB
00CA C0D6 RJMP 0x01A1
(0072) {
(0073) switch(state)
00CB 2EC4 MOV R12,R20
00CC 24DD CLR R13
00CD 01C6 MOVW R24,R12
00CE 3081 CPI R24,1
00CF E0E0 LDI R30,0
00D0 079E CPC R25,R30
00D1 F0E9 BEQ 0x00EF
00D2 3082 CPI R24,2
00D3 E0E0 LDI R30,0
00D4 079E CPC R25,R30
00D5 F121 BEQ 0x00FA
00D6 3083 CPI R24,3
00D7 E0E0 LDI R30,0
00D8 079E CPC R25,R30
00D9 F149 BEQ 0x0103
00DA 3084 CPI R24,4
00DB E0E0 LDI R30,0
00DC 079E CPC R25,R30
00DD F409 BNE 0x00DF
00DE C041 RJMP 0x0120
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -