📄 stk500_isp.lst
字号:
__start:
__text_start:
2F E5CF LDI R28,0x5F
30 E0D8 LDI R29,0x8
31 BFCD OUT 0x3D,R28
32 BFDE OUT 0x3E,R29
33 51CE SUBI R28,0x1E
34 40D0 SBCI R29,0
35 EA0A LDI R16,0xAA
36 8308 STD Y+0,R16
37 2400 CLR R0
38 E6EA LDI R30,0x6A
39 E0F0 LDI R31,0
3A E011 LDI R17,1
3B 3AE1 CPI R30,0xA1
3C 07F1 CPC R31,R17
3D F011 BEQ 0x0040
3E 9201 ST R0,Z+
3F CFFB RJMP 0x003B
40 8300 STD Z+0,R16
41 E5E4 LDI R30,0x54
42 E0F0 LDI R31,0
43 E6A0 LDI R26,0x60
44 E0B0 LDI R27,0
45 E010 LDI R17,0
46 E000 LDI R16,0
47 BF0B OUT 0x3B,R16
48 35EE CPI R30,0x5E
49 07F1 CPC R31,R17
4A F021 BEQ 0x004F
4B 95C8 LPM
4C 9631 ADIW R30,1
4D 920D ST R0,X+
4E CFF9 RJMP 0x0048
4F 940E 01F3 CALL _main
_exit:
51 CFFF RJMP _exit
FILE: E:\单片机\源程序\Snail_mkII\STK500_V2\ICC\interface.c
(0001) /** \file
(0002) <b>USB receive and transmit</b><br>
(0003) Autor: Matthias Wei遝r<br>
(0004) Copyright 2005: Matthias Wei遝r<br>
(0005) License: QPL (see license.txt)
(0006) <hr>
(0007) */
(0008)
(0009) #include <iccioavr.h>
(0010) #include "tools.h"
(0011) #include "interface.h"
(0012)
(0013) #include "config.h"
(0014)
(0015) unsigned char checksum;
(0016)
(0017) #ifdef CONFIG_INTERFACE_USB
(0018)
(0019) //Hardware
(0020) #define USB_TXE (PINB&BIT6_POS)
(0021) #define USB_RXF (PINC&BIT3_POS)
(0022) #define USB_RD_ON PORTC&=BIT1_NEG
(0023) #define USB_RD_OFF PORTC|=BIT1_POS
(0024) #define USB_WR_ON PORTC|=BIT2_POS
(0025) #define USB_WR_OFF PORTC&=BIT2_NEG
(0026)
(0027) /**
(0028) Initializes the usb interface
(0029) */
(0030) void interface_init(void)
(0031) {
(0032) PORTC |= BIT1_POS; //USB_RD inactive
(0033) DDRC |= BIT1_POS|BIT2_POS; //USB_RD, USB_WR as output
(0034) }
(0035)
(0036) /**
(0037) Reads a byte from the USB interface
(0038)
(0039) @return received character or -1 if no character has been received
(0040) */
(0041) signed int interface_getc(void)
(0042) {
(0043) unsigned char t;
(0044)
(0045) if (!USB_RXF)
(0046) {
(0047) USB_RD_ON;
(0048) asm("NOP");
(0049) t = PIND;
(0050) USB_RD_OFF;
(0051)
(0052) return t;
(0053) }
(0054) else return -1;
(0055) }
(0056)
(0057) /**
(0058) Writes a byte to the USB
(0059)
(0060) @param t Byte to be written
(0061) */
(0062) void interface_putc(unsigned char t)
(0063) {
(0064) while (USB_TXE);
(0065)
(0066) //PORTD auf Ausgang
(0067) DDRD = 0xFF;
(0068) //Daten auf den Port
(0069) PORTD = t;
(0070)
(0071) USB_WR_ON;
(0072) USB_WR_OFF;
(0073)
(0074) //PORTC auf Eingang
(0075) DDRD = 0x00;
(0076) //Pull-Ups ein
(0077) PORTD = 0xFF;
(0078)
(0079) checksum ^= t;
(0080) }
(0081)
(0082) #endif
(0083)
(0084) #ifdef CONFIG_INTERFACE_RS232
(0085)
(0086) #define USART_BAUD_RATE 115200
(0087) #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)
(0088)
(0089) /**
(0090) Initializes the rs232 interface
(0091)
(0092) Autor: Lukas Salzburger
(0093) */
(0094) void interface_init(void)
(0095) {
(0096) UCSRB = (1<<RXEN) | (1<<TXEN);
_interface_init:
52 E188 LDI R24,0x18
53 B98A OUT 0x0A,R24
(0097) UBRRL = (unsigned char) USART_BAUD_SELECT;
54 E087 LDI R24,7
55 B989 OUT 0x09,R24
(0098) UBRRH = (unsigned char) (USART_BAUD_SELECT>>8);
56 2422 CLR R2
57 BC20 OUT 0x20,R2
58 9508 RET
(0099) }
(0100)
(0101) /**
(0102) Reads a byte from the UART interface
(0103)
(0104) Autor: Lukas Salzburger
(0105)
(0106) @return received character or -1 if no character has been received
(0107) */
(0108) signed int interface_getc(void)
(0109) {
(0110)
(0111) if (UCSRA & (1<<RXC))
_interface_getc:
59 9B5F SBIS 0x0B,7
5A C003 RJMP 0x005E
(0112) {
(0113) return UDR;
5B B10C IN R16,0x0C
5C 2711 CLR R17
5D C002 RJMP 0x0060
(0114) }
(0115) else return -1;
5E EF0F LDI R16,0xFF
5F EF1F LDI R17,0xFF
60 9508 RET
(0116) }
(0117)
(0118) /**
(0119) Writes a byte to the UART
(0120)
(0121) Autor: Lukas Salzburger
(0122)
(0123) @param t Byte to be written
(0124) */
(0125) void interface_putc(unsigned char t)
(0126) {
(0127)
(0128) while (!(UCSRA & (1<<UDRE)));
_interface_putc:
t --> R16
61 9B5D SBIS 0x0B,5
62 CFFE RJMP _interface_putc
(0129)
(0130) UDR = t;
63 B90C OUT 0x0C,R16
(0131) checksum ^= t;
64 9020 006A LDS R2,checksum
66 2620 EOR R2,R16
67 9220 006A STS checksum,R2
69 9508 RET
_interface_print:
s --> R20
6A 934A ST R20,-Y
6B 935A ST R21,-Y
6C 01A8 MOVW R20,R16
(0132) }
(0133)
(0134) #endif
(0135)
(0136) /**
(0137) Writes a string to USB
(0138)
(0139) @param s The string to be send
(0140) */
(0141) void interface_print(unsigned char *s)
(0142) {
6D C005 RJMP 0x0073
(0143) while (*s)
(0144) {
(0145) interface_putc(*s);
6E 01FA MOVW R30,R20
6F 8100 LDD R16,Z+0
70 DFF0 RCALL _interface_putc
(0146) s++;
71 5F4F SUBI R20,0xFF
72 4F5F SBCI R21,0xFF
73 01FA MOVW R30,R20
74 8020 LDD R2,Z+0
75 2022 TST R2
76 F7B9 BNE 0x006E
77 9159 LD R21,Y+
78 9149 LD R20,Y+
79 9508 RET
_interface_put16:
t --> R20
7A 934A ST R20,-Y
7B 935A ST R21,-Y
7C 01A8 MOVW R20,R16
(0147) }
(0148) }
(0149)
(0150) /**
(0151) Sends a 16 bit value over the USB
(0152) MSB first
(0153)
(0154) @param t Value to be send
(0155) */
(0156) void interface_put16(unsigned int t)
(0157) {
(0158) interface_putc((t>>8)&0xFF);
7D 018A MOVW R16,R20
7E 2F01 MOV R16,R17
7F 2711 CLR R17
80 7010 ANDI R17,0
81 DFDF RCALL _interface_putc
(0159) interface_putc((t>>0)&0xFF);
82 018A MOVW R16,R20
83 7010 ANDI R17,0
84 DFDC RCALL _interface_putc
85 9159 LD R21,Y+
86 9149 LD R20,Y+
87 9508 RET
(0160) }
(0161)
(0162) /**
(0163) Resets the checksum accumulator
(0164) */
(0165) void interface_reset_check(void)
(0166) {
(0167) checksum=0;
_interface_reset_check:
88 2422 CLR R2
89 9220 006A STS checksum,R2
8B 9508 RET
(0168) }
(0169)
(0170) /**
(0171) Sends the accumulated checksum
(0172) */
(0173) void interface_send_check(void)
(0174) {
(0175) interface_putc(checksum);
_interface_send_check:
8C 9100 006A LDS R16,checksum
8E DFD2 RCALL _interface_putc
(0176) checksum=0;
8F 2422 CLR R2
90 9220 006A STS checksum,R2
92 9508 RET
_spi_enable:
i0 --> R20
93 934A ST R20,-Y
FILE: E:\单片机\源程序\Snail_mkII\STK500_V2\ICC\spi.c
(0001) /** \file
(0002) <b>SPI</b><br>
(0003) Autor: Matthias Wei遝r<br>
(0004) Copyright 2005: Matthias Wei遝r<br>
(0005) License: QPL (see license.txt)
(0006) <hr>
(0007) */
(0008) #include <iccioavr.h>
(0009) #include <eeprom.h>
(0010) #include <macros.h>
(0011) #include "spi.h"
(0012) #include "tools.h"
(0013) #include "extern_vars.h"
(0014)
(0015) static unsigned char use_sw_spi = 0;
(0016)
(0017)
(0018) #if defined(ATMega8)
(0019) // HW Normal M8 version
(0020) #define MOSI_SET PORTB|=BIT(3);
(0021) #define MOSI_CLEAR PORTB&=~BIT(3);
(0022)
(0023) #define MISO_IN (PINB & BIT(4))
(0024) #define SCK_SET PORTB |= BIT(5);
(0025) #define SCK_CLEAR PORTB &= ~BIT(5);
(0026)
(0027) #define DDR_MOSI_OUT DDRB |= BIT(3);
(0028) #define DDR_MOSI_IN DDRB &= ~BIT(3);NOP();
(0029) #define DDR_SCK_OUT DDRB |= BIT(5);
(0030) #define DDR_SCK_IN DDRB &= ~BIT(5);NOP();
(0031)
(0032) #elif defined(ATMega16) || defined(ATMega32)
(0033) // HW Snail Emluator Kit
(0034) #define MOSI_SET PORTB |= BIT(5);
(0035) #define MOSI_CLEAR PORTB &= ~BIT(5);
(0036)
(0037) #define MISO_IN (PINB & BIT(6))
(0038) #define SCK_SET PORTB |= BIT(7);
(0039) #define SCK_CLEAR PORTB &= ~BIT(7);
(0040)
(0041) #define DDR_MOSI_OUT DDRB |= BIT(5);
(0042) #define DDR_MOSI_IN DDRB &= ~BIT(5);NOP();
(0043) #define DDR_SCK_OUT DDRB |= BIT(7);
(0044) #define DDR_SCK_IN DDRB &= ~BIT(7);NOP();
(0045) #endif
(0046)
(0047) void spi_enable(void)
(0048) {
(0049) unsigned char i;
(0050)
(0051) R_RES_ON;
94 EE8F LDI R24,0xEF
95 EF9F LDI R25,0xFF
96 B228 IN R2,0x18
97 2228 AND R2,R24
98 BA28 OUT 0x18,R2
(0052) wait_ms(2);
99 E002 LDI R16,2
9A E010 LDI R17,0
9B 940E 01E4 CALL _wait_ms
(0053)
(0054) //PORTB &= BIT3_NEG & BIT5_NEG; //MOSI and SCK low
(0055) //DDRB |= BIT3_POS | BIT5_POS; //MOSI and SCK als Ausgang
(0056) MOSI_CLEAR;SCK_CLEAR;
9D 98C5 CBI 0x18,5
9E 98C7 CBI 0x18,7
(0057) DDR_MOSI_OUT;DDR_SCK_OUT
9F 9ABD SBI 0x17,5
A0 9ABF SBI 0x17,7
(0058)
(0059) if (EEPROMread((int)&eeprom_sck_period) > 64)
A1 E000 LDI R16,0
A2 E010 LDI R17,0
A3 940E 0B52 CALL _EEPROMread
A5 E480 LDI R24,0x40
A6 1780 CP R24,R16
A7 F430 BCC 0x00AE
(0060) {
(0061) use_sw_spi = 1; //使用模拟SPI
A8 E081 LDI R24,1
A9 9380 0060 STS 0x0060,R24
(0062) SPCR=0x00;
AB 2422 CLR R2
AC B82D OUT 0x0D,R2
(0063) }
AD C00A RJMP 0x00B8
(0064) else
(0065) {
(0066) use_sw_spi = 0; //使用硬件SPI
AE 2422 CLR R2
AF 9220 0060 STS 0x0060,R2
(0067) SPCR = 0x51; //SPI Master /16
B1 E581 LDI R24,0x51
B2 B98D OUT 0x0D,R24
(0068) spi_set_speed(EEPROMread((int)&eeprom_sck_period));
B3 E000 LDI R16,0
B4 E010 LDI R17,0
B5 940E 0B52 CALL _EEPROMread
B7 D025 RCALL _spi_set_speed
(0069) }
(0070)
(0071) R_RES_OFF;
B8 9AC4 SBI 0x18,4
(0072) for (i=0;i<200;i++) asm("nop");
B9 2744 CLR R20
BA C002 RJMP 0x00BD
BB 0000 NOP
BC 9543 INC R20
BD 3C48 CPI R20,0xC8
BE F3E0 BCS 0x00BB
(0073) R_RES_ON;
BF EE8F LDI R24,0xEF
C0 EF9F LDI R25,0xFF
C1 B228 IN R2,0x18
C2 2228 AND R2,R24
C3 BA28 OUT 0x18,R2
(0074) wait_ms(2);
C4 E002 LDI R16,2
C5 E010 LDI R17,0
C6 940E 01E4 CALL _wait_ms
C8 9149 LD R20,Y+
C9 9508 RET
(0075)
(0076) }
(0077)
(0078) void spi_disable(void)
(0079) {
(0080) SPCR=0x00; //SPI aus
_spi_disable:
CA 2422 CLR R2
CB B82D OUT 0x0D,R2
(0081) //DDRB &= BIT3_NEG & BIT5_NEG; //MOSI und SCK als Eingang (hochohmig)
(0082) DDR_MOSI_IN;DDR_SCK_IN;
CC 98BD CBI 0x17,5
CD 0000 NOP
CE 98BF CBI 0x17,7
CF 0000 NOP
(0083) R_RES_OFF;
D0 9AC4 SBI 0x18,4
D1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -