⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi.lst

📁 iic for avr very good
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -