📄 cpld_read.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 52C0 SUBI R28,0x20
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0065 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: F:\IccAvr_Pro\Main.c
(0001) //ICC-AVR application builder : 2005-3-27 19:38:48
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include "Cpld_Read.h"
(0007) #include "Display.h"
(0008)
(0009)
(0010) //#define DEBUG
(0011)
(0012)
(0013) //Global varible declare
(0014) //unsigned char TimeFlag=0;
(0015)
(0016)
(0017) void port_init(void)
(0018) {
(0019) PORTA = 0xFF;
_port_init:
004B EF8F LDI R24,0xFF
004C BB8B OUT 0x1B,R24
(0020) DDRA = 0x00;
004D 2422 CLR R2
004E BA2A OUT 0x1A,R2
(0021) PORTB = 0xFF;
004F BB88 OUT 0x18,R24
(0022) DDRB = 0x0F;
0050 E08F LDI R24,0xF
0051 BB87 OUT 0x17,R24
(0023) PORTC = 0xFF; //m103 output only
0052 EF8F LDI R24,0xFF
0053 BB85 OUT 0x15,R24
(0024) DDRC = 0x00;
0054 BA24 OUT 0x14,R2
(0025) PORTD = 0xFF;
0055 BB82 OUT 0x12,R24
(0026) DDRD = 0x00;
0056 BA21 OUT 0x11,R2
0057 9508 RET
(0027) }
(0028)
(0029) //TIMER0 initialisation - prescale:1
(0030) // WGM: Normal
(0031) // desired value: 200Hz
(0032) // actual value: Out of range
(0033) //void timer0_init(void)
(0034) //{
(0035) //TCCR0 = 0x00; //stop
(0036) //TCNT0 = 0x70 ; //set count
(0037) //OCR0 = 0x00 ; //set compare
(0038) //TCCR0 = 0x01; //start timer
(0039) //}
(0040)
(0041) /*#pragma interrupt_handler timer0_ovf_isr:10
(0042) void timer0_ovf_isr(void)
(0043) {
(0044) TCNT0 = 0x70 ; //reload counter value
(0045) TimeFlag=1;
(0046) }*/
(0047)
(0048) //UART0 initialisation
(0049) // desired baud rate: 115200
(0050) // actual: baud rate:115200 (0.0%)
(0051) // char size: 8 bit
(0052) // parity: Disabled
(0053)
(0054) void init_devices(void)
(0055) {
(0056) //stop errant interrupts until set up
(0057) CLI(); //disable all interrupts
_init_devices:
0058 94F8 BCLR 7
(0058) port_init();
0059 DFF1 RCALL _port_init
(0059) //timer0_init();
(0060)
(0061) Cpld_Init();
005A 940E00AE CALL _Cpld_Init
(0062) Disp_Init();
005C 940E010E CALL _Disp_Init
(0063) MCUCR = 0x00;
005E 2422 CLR R2
005F BE25 OUT 0x35,R2
(0064) GICR = 0x00;
0060 BE2B OUT 0x3B,R2
(0065) TIMSK = 0x01; //timer interrupt sources
0061 E081 LDI R24,1
0062 BF89 OUT 0x39,R24
(0066) SEI(); //re-enable interrupts
0063 9478 BSET 7
0064 9508 RET
(0067) //all peripherals are now initialised
(0068) }
(0069)
(0070) void main()
(0071) {
(0072) int CpldResult1;
(0073) int CpldResult2;
(0074)
(0075)
(0076) init_devices();
_main:
CpldResult2 --> R20
CpldResult1 --> R22
0065 DFF2 RCALL _init_devices
(0077) Cpld_Set();
0066 940E00A0 CALL _Cpld_Set
0068 C010 RJMP 0x0079
(0078)
(0079) while(1)
(0080) {
(0081)
(0082) CpldResult1=Cpld_Read(0);
0069 2700 CLR R16
006A 940E007B CALL _Cpld_Read
006C 01B8 MOVW R22,R16
(0083) CpldResult2=Cpld_Read(1);
006D E001 LDI R16,1
006E 940E007B CALL _Cpld_Read
0070 01A8 MOVW R20,R16
(0084)
(0085) #ifdef DEBUG
(0086) Cpld_Set();
(0087) Display(1234,0);
(0088) Display(4321,2);
(0089) #else
(0090) Display(CpldResult1,0);
0071 2722 CLR R18
0072 018B MOVW R16,R22
0073 940E00B3 CALL _Display
(0091) Display(CpldResult2,2);
0075 E022 LDI R18,2
0076 018A MOVW R16,R20
0077 940E00B3 CALL _Display
0079 CFEF RJMP 0x0069
007A 9508 RET
_Cpld_Read:
temp --> R22
Result --> R20
Address --> R16
007B 940E0143 CALL push_gset2
FILE: F:\IccAvr_Pro\Cpld_Read.c
(0001) #include "Cpld_Read.h"
(0002) #include <macros.h>
(0003)
(0004) int Cpld_Read(unsigned char Address)
(0005) {
(0006)
(0007) unsigned char temp;
(0008) int Result;
(0009) CLI();
007D 94F8 BCLR 7
(0010) if(Address) //Address select
007E 2300 TST R16
007F F011 BEQ 0x0082
(0011) PORTB|=BIT(A0);
0080 9AC3 SBI 0x18,3
0081 C001 RJMP 0x0083
(0012) else
(0013) PORTB&=~BIT(A0);
0082 98C3 CBI 0x18,3
(0014) PORTB|=BIT(LoadL); //LoadL set low
0083 9AC1 SBI 0x18,1
(0015) NOP();
0084 0000 NOP
(0016) NOP();
0085 0000 NOP
(0017) PORTB&=~BIT(LoadL);
0086 98C1 CBI 0x18,1
(0018) NOP();
0087 0000 NOP
(0019) NOP();
0088 0000 NOP
(0020) NOP();
0089 0000 NOP
(0021) temp=CpldRead; //Read Data low byte
008A B369 IN R22,0x19
(0022) temp=CpldRead;
008B B369 IN R22,0x19
(0023)
(0024) PORTB|=BIT(LoadL); //Set LoadL high
008C 9AC1 SBI 0x18,1
(0025)
(0026) PORTB|=BIT(LoadH); //LoadH set low
008D 9AC0 SBI 0x18,0
(0027) NOP();
008E 0000 NOP
(0028) NOP();
008F 0000 NOP
(0029) PORTB&=~BIT(LoadH);
0090 98C0 CBI 0x18,0
(0030) NOP();
0091 0000 NOP
(0031) NOP();
0092 0000 NOP
(0032) NOP();
0093 0000 NOP
(0033) Result=CpldRead; //Read Data low byte
0094 B349 IN R20,0x19
0095 2755 CLR R21
(0034) Result=CpldRead;
0096 B349 IN R20,0x19
0097 2755 CLR R21
(0035)
(0036) PORTB|=BIT(LoadH); //LoadH set high
0098 9AC0 SBI 0x18,0
(0037)
(0038) Result=(Result<<8)+temp;
0099 2F54 MOV R21,R20
009A 2F46 MOV R20,R22
(0039) SEI();
009B 9478 BSET 7
(0040)
(0041) return Result;
009C 018A MOVW R16,R20
009D 940E0137 CALL pop_gset2
009F 9508 RET
(0042)
(0043) }
(0044)
(0045) void Cpld_Set(void)
(0046) {
(0047) CLI(); //Set all the counters reset
_Cpld_Set:
00A0 94F8 BCLR 7
(0048) PORTB|=BIT(Set); //Zero
00A1 9AC2 SBI 0x18,2
(0049) NOP();
00A2 0000 NOP
(0050) NOP();
00A3 0000 NOP
(0051) PORTB&=~BIT(Set);
00A4 98C2 CBI 0x18,2
(0052) NOP();
00A5 0000 NOP
(0053) NOP();
00A6 0000 NOP
(0054) NOP();
00A7 0000 NOP
(0055) NOP();
00A8 0000 NOP
(0056) NOP();
00A9 0000 NOP
(0057) NOP();
00AA 0000 NOP
(0058) PORTB|=BIT(Set);
00AB 9AC2 SBI 0x18,2
(0059) SEI();
00AC 9478 BSET 7
00AD 9508 RET
(0060) }
(0061)
(0062) void Cpld_Init(void)
(0063) {
(0064) PORTB|=BIT(Set); //Set All Control signal high
_Cpld_Init:
00AE 9AC2 SBI 0x18,2
(0065) PORTB|=BIT(LoadL);
00AF 9AC1 SBI 0x18,1
(0066) PORTB|=BIT(LoadH);
00B0 9AC0 SBI 0x18,0
(0067) PORTB&=~BIT(LoadL);
00B1 98C1 CBI 0x18,1
00B2 9508 RET
_Display:
i --> R20
DispContent --> R22
gate --> R10
content --> R12
00B3 940E013D CALL push_gset5
00B5 2EA2 MOV R10,R18
00B6 0168 MOVW R12,R16
FILE: F:\IccAvr_Pro\Display.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #include "Display.h"
(0005)
(0006) void Display(unsigned int content,unsigned char gate)
(0007) {
(0008) unsigned int DispContent=0;
00B7 2766 CLR R22
00B8 2777 CLR R23
(0009) unsigned char i;
(0010) for(i=0;i<4;i++) //gain the BCD code of the number
00B9 2744 CLR R20
00BA C016 RJMP 0x00D1
(0011) {
(0012) DispContent<<=4;
00BB 0F66 LSL R22
00BC 1F77 ROL R23
00BD 0F66 LSL R22
00BE 1F77 ROL R23
00BF 0F66 LSL R22
00C0 1F77 ROL R23
00C1 0F66 LSL R22
00C2 1F77 ROL R23
(0013) DispContent=DispContent|(content%10);
00C3 E02A LDI R18,0xA
00C4 E030 LDI R19,0
00C5 0186 MOVW R16,R12
00C6 940E011B CALL mod16u
00C8 2B60 OR R22,R16
00C9 2B71 OR R23,R17
(0014) content=content/10;
00CA E02A LDI R18,0xA
00CB E030 LDI R19,0
00CC 0186 MOVW R16,R12
00CD 940E011D CALL div16u
00CF 0168 MOVW R12,R16
00D0 9543 INC R20
00D1 3044 CPI R20,4
00D2 F340 BCS 0x00BB
(0015) }
(0016)
(0017) switch(gate)
00D3 2CEA MOV R14,R10
00D4 24FF CLR R15
00D5 20EE TST R14
00D6 F411 BNE 0x00D9
00D7 20FF TST R15
00D8 F071 BEQ 0x00E7
00D9 01C7 MOVW R24,R14
00DA 3081 CPI R24,1
00DB E0E0 LDI R30,0
00DC 079E CPC R25,R30
00DD F059 BEQ 0x00E9
00DE 3082 CPI R24,2
00DF E0E0 LDI R30,0
00E0 079E CPC R25,R30
00E1 F049 BEQ 0x00EB
00E2 3083 CPI R24,3
00E3 E0E0 LDI R30,0
00E4 079E CPC R25,R30
00E5 F039 BEQ 0x00ED
00E6 C008 RJMP 0x00EF
(0018) {
(0019) case 0: PORTB&=~BIT(Gate0);break; //Open the gate
00E7 98C4 CBI 0x18,4
00E8 C009 RJMP 0x00F2
(0020) case 1: PORTB&=~BIT(Gate1);break;
00E9 98C5 CBI 0x18,5
00EA C007 RJMP 0x00F2
(0021) case 2: PORTB&=~BIT(Gate2);break;
00EB 98C6 CBI 0x18,6
00EC C005 RJMP 0x00F2
(0022) case 3: PORTB&=~BIT(Gate3);break;
00ED 98C7 CBI 0x18,7
00EE C003 RJMP 0x00F2
(0023) default: PORTB|=0xF0;break;
00EF B388 IN R24,0x18
00F0 6F80 ORI R24,0xF0
00F1 BB88 OUT 0x18,R24
(0024) }
(0025) for (i=0;i<=15;i++) //Send the number by serial
00F2 2744 CLR R20
00F3 C011 RJMP 0x0105
(0026) {
(0027) PORTC|=BIT(DispClk);
00F4 9AAE SBI 0x15,6
(0028) NOP();
00F5 0000 NOP
(0029) NOP();
00F6 0000 NOP
(0030) if(DispContent&0x01)
00F7 FF60 SBRS R22,0
00F8 C002 RJMP 0x00FB
(0031) PORTC|=BIT(DispData);
00F9 9AAF SBI 0x15,7
00FA C001 RJMP 0x00FC
(0032) else
(0033) PORTC&=~BIT(DispData);
00FB 98AF CBI 0x15,7
(0034) NOP();
00FC 0000 NOP
(0035) NOP();
00FD 0000 NOP
(0036) NOP();
00FE 0000 NOP
(0037) NOP();
00FF 0000 NOP
(0038) asm("clc");
0100 9488 BCLR 0
(0039) DispContent>>=1;
0101 9576 LSR R23
0102 9567 ROR R22
(0040) PORTC&=~BIT(DispClk);
0103 98AE CBI 0x15,6
0104 9543 INC R20
0105 E08F LDI R24,0xF
0106 1784 CP R24,R20
0107 F760 BCC 0x00F4
(0041) }
(0042) PORTB|=0xF0;
0108 B388 IN R24,0x18
0109 6F80 ORI R24,0xF0
010A BB88 OUT 0x18,R24
010B 940E013A CALL pop_gset5
010D 9508 RET
(0043) }
(0044)
(0045) void Disp_Init(void) //Set all control signal high
(0046) {
(0047) DDRB|=0xFF;
_Disp_Init:
010E B387 IN R24,0x17
010F 6F8F ORI R24,0xFF
0110 BB87 OUT 0x17,R24
(0048) PORTB|=0xF0;
0111 B388 IN R24,0x18
0112 6F80 ORI R24,0xF0
0113 BB88 OUT 0x18,R24
(0049) PORTC|=BIT(DispData)|BIT(DispClk);
0114 B385 IN R24,0x15
0115 6C80 ORI R24,0xC0
0116 BB85 OUT 0x15,R24
(0050) DDRC|=BIT(DispData)|BIT(DispClk);
FILE: <library>
0117 B384 IN R24,0x14
0118 6C80 ORI R24,0xC0
0119 BB84 OUT 0x14,R24
011A 9508 RET
mod16u:
011B 9468 BSET 6
011C C001 RJMP xdiv16u
div16u:
011D 94E8 BCLR 6
xdiv16u:
011E 92EA ST R14,-Y
011F 92FA ST R15,-Y
0120 938A ST R24,-Y
0121 24EE CLR R14
0122 24FF CLR R15
0123 E180 LDI R24,0x10
0124 0F00 LSL R16
0125 1F11 ROL R17
0126 1CEE ROL R14
0127 1CFF ROL R15
0128 16E2 CP R14,R18
0129 06F3 CPC R15,R19
012A F018 BCS 0x012E
012B 1AE2 SUB R14,R18
012C 0AF3 SBC R15,R19
012D 9503 INC R16
012E 958A DEC R24
012F F7A1 BNE 0x0124
0130 F416 BRTC 0x0133
0131 2D0E MOV R16,R14
0132 2D1F MOV R17,R15
0133 9189 LD R24,Y+
0134 90F9 LD R15,Y+
0135 90E9 LD R14,Y+
0136 9508 RET
pop_gset2:
0137 E0E2 LDI R30,2
0138 940C0149 JMP pop
pop_gset5:
013A 27EE CLR R30
013B 940C0149 JMP pop
push_gset5:
013D 92FA ST R15,-Y
013E 92EA ST R14,-Y
push_gset4:
013F 92DA ST R13,-Y
0140 92CA ST R12,-Y
push_gset3:
0141 92BA ST R11,-Y
0142 92AA ST R10,-Y
push_gset2:
0143 937A ST R23,-Y
0144 936A ST R22,-Y
push_gset1:
0145 935A ST R21,-Y
0146 934A ST R20,-Y
0147 9508 RET
pop_gset1:
0148 E0E1 LDI R30,1
pop:
0149 9149 LD R20,Y+
014A 9159 LD R21,Y+
014B FDE0 SBRC R30,0
014C 9508 RET
014D 9169 LD R22,Y+
014E 9179 LD R23,Y+
014F FDE1 SBRC R30,1
0150 9508 RET
0151 90A9 LD R10,Y+
0152 90B9 LD R11,Y+
0153 FDE2 SBRC R30,2
0154 9508 RET
0155 90C9 LD R12,Y+
0156 90D9 LD R13,Y+
0157 FDE3 SBRC R30,3
0158 9508 RET
0159 90E9 LD R14,Y+
015A 90F9 LD R15,Y+
015B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -