?? fjv14.s
字號:
.module fjv14.c
.area text(rom, con, rel)
.dbfile D:\采集卡項目\單片機程序\fjv14\fjv14.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 37
; //m8L,4M晶振,波特率2400
; #include "iom8v.h"
; #include"macros.h"
; #include"stdio.h"
; //控制DA的cs位
; #define set_cs PORTB |= (1<<PB2)
; #define clr_cs PORTB &= 0b11111011
;
; #define IO_PB0 0x00
; #define IO_PB1 0x01
; #define IO_PB4 0x04
; #define IO_PD5 0x05
; #define IO_PD6 0x06
; #define IO_PD7 0x07
;
; //定義全局變量-------------------------------
; unsigned int AD_value10;//ad采集值10位。
;
;
; //------------------------------------------
; unsigned int ADC_filter(void);
; void init_devices(void);
; unsigned char USART_Recive(void);
; void USART_Transmit(unsigned char tdata);
; void ADC_Start(void);
; unsigned int ADC_Value (unsigned char adc_channel);
; void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel);
; void SPI_Transmit(unsigned char dac_data);
; unsigned char SPI_Compare(unsigned char data,unsigned char mark);
; void delay_1ms(void);
; unsigned char Strcat(unsigned char s1,unsigned char s2);
; void IO_out(unsigned char IO_data,unsigned char IO_channel);
; unsigned char IO_in (unsigned char IO_channel);
;
; /**************************************************************************/
; void port_init(void)
; {
.dbline 38
; PORTB = 0xFF;//確保復位電平是確定的,輸入、上拉
ldi R24,255
out 0x18,R24
.dbline 39
; DDRB = 0x00;
clr R2
out 0x17,R2
.dbline 40
; PORTC = 0xFF;
out 0x15,R24
.dbline 41
; DDRC = 0x00;
out 0x14,R2
.dbline 42
; PORTD = 0xFF;
out 0x12,R24
.dbline 43
; DDRD=0x00;
out 0x11,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 49
; }
; /********************************************************************/
; //Watchdog initialize
; // prescale: 512K 0.52s
; void watchdog_init(void)
; {
.dbline 50
; WDR(); //this prevents a timout on enabling
wdr
.dbline 51
; WDTCR = 0x0D; //WATCHDOG ENABLED - dont forget to issue WDRs
ldi R24,13
out 0x21,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e WDT_off _WDT_off fV
.even
_WDT_off::
.dbline -1
.dbline 56
; }
; /*********************************************************************/
; //關閉看門狗
; void WDT_off(void)
; {
.dbline 57
; _WDR();
wdr
.dbline 58
; WDTCR |= (1<<WDCE)|(1<<WDE);
in R24,0x21
ori R24,24
out 0x21,R24
.dbline 59
; WDTCR = 0x00;
clr R2
out 0x21,R2
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 63
; }
; /**************************************************************************/
; void uart0_init(void)
; {
.dbline 64
; UCSRB=(1<<RXEN)|(1<<TXEN);//發送接收使能
ldi R24,24
out 0xa,R24
.dbline 65
; UCSRC=(1<<UMSEL);//選擇異步發送模式
ldi R24,64
out 0x20,R24
.dbline 66
; UBRRL = 0x33;//設置波特率低位4m4800
ldi R24,51
out 0x9,R24
.dbline 67
clr R2
out 0x20,R2
.dbline 68
; UCSRA = 0x18; //接收、發送數據
ldi R24,24
out 0xb,R24
.dbline 69
; UCSRC =(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位數據+1位STOP位
ldi R24,134
out 0x20,R24
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spi_init _spi_init fV
.even
_spi_init::
.dbline -1
.dbline 74
; }
;
; /************************************************************************/
; void spi_init(void)
; {
.dbline 77
; //PB2為CS端。PB3為MOSI端。PB5為SCK端。
; // PORTB=(1<<PB2)|(1<<PB3)|(1<<PB5);//SPI端口初始化.慎用<<置1。將會影響其他位。
; DDRB= (1<<DDB2)|(1<<DDB3)|(1<<DDB5);//SPI端口初始化
ldi R24,44
out 0x17,R24
.dbline 78
; SPSR=0x01;//SPI狀態寄存器初始化
ldi R24,1
out 0xe,R24
.dbline 79
; SPCR=0x58; //SPI使能
ldi R24,88
out 0xd,R24
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 86
; }
; /*************************************************************************/
; //ADC initialize
; // Conversion time: 52uS
;
; void adc_init(void)
; {
.dbline 87
; PORTC =(0<<PC0)|(0<<PC1)|(0<<PC2)|(0<<PC3) ;//關閉上拉電阻
clr R2
out 0x15,R2
.dbline 88
; ACSR = 0x00;//與模擬比較器控制
out 0x8,R2
.dbline 90
; //ACSR =(1<<ACD);//關閉模擬比較器
; ADMUX=0x00;//設定AD選擇寄存器,片外基準。ch1通道(對應芯片ADC0)。數據右對齊。
out 0x7,R2
.dbline 91
; ADCSRA = 0x00; //disable adc
out 0x6,R2
.dbline 92
; ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1) ;//16分頻,使能AD,開啟中斷。還沒開始轉換。
ldi R24,140
out 0x6,R24
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 28
rjmp _adc_isr
.area text(rom, con, rel)
.dbfile D:\采集卡項目\單片機程序\fjv14\fjv14.c
.dbfunc e adc_isr _adc_isr fV
.even
_adc_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
in R2,0x3f
st -y,R2
.dbline -1
.dbline 99
;
;
; }
; /*************************************************************************/
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
.dbline 101
; //conversion complete, read value (int) using...
; AD_value10 = ADCL; //Read 8 low bits first (important)
in R2,0x4
clr R3
sts _AD_value10+1,R3
sts _AD_value10,R2
.dbline 102
; AD_value10|=(unsigned int)ADCH << 8; //read 2 high bits and shift into top byte
in R2,0x5
clr R3
mov R3,R2
clr R2
lds R4,_AD_value10
lds R5,_AD_value10+1
or R4,R2
or R5,R3
sts _AD_value10+1,R5
sts _AD_value10,R4
.dbline -2
L7:
ld R2,y+
out 0x3f,R2
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 107
;
; }
; /*************************************************************************/
; void init_devices(void)
; {
.dbline 108
; CLI(); //關閉所有中斷
cli
.dbline 109
; port_init();//端口初始化
rcall _port_init
.dbline 110
; watchdog_init();
rcall _watchdog_init
.dbline 111
; uart0_init();//串行通信初始化
rcall _uart0_init
.dbline 112
; adc_init();//AD初始化
rcall _adc_init
.dbline 113
; spi_init();//SPI初始化
rcall _spi_init
.dbline 114
; MCUCR = 0x10;//ADC噪聲抑制模式。
ldi R24,16
out 0x35,R24
.dbline 115
; GICR = 0x00;//關外部中斷
clr R2
out 0x3b,R2
.dbline 116
; SEI();
sei
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; m -> R22,R23
; temp10 -> y+6
; temp8 -> R12
; charry -> y+1
; y -> R14
; i -> R10,R11
.even
_main::
sbiw R28,8
.dbline -1
.dbline 121
; }
; /**************************************************************************/
; /**************************************************************************/
; void main( )
; {
.dbline 129
;
; unsigned char charry[5];
; unsigned char y;
; unsigned char temp8;
; unsigned int temp10;//接收10位的數據,如AD等。
; unsigned int i;
; unsigned int m;
; init_devices();//初始化
rcall _init_devices
rjmp L11
L10:
.dbline 131
; while(1)
; {
.dbline 132
; charry[0]=0;//初始化
clr R2
std y+1,R2
.dbline 133
; charry[1]=0;
std y+2,R2
.dbline 134
; charry[2]=0;
std y+3,R2
.dbline 135
; charry[3]=0;
std y+4,R2
.dbline 136
; charry[4]=0;
std y+5,R2
.dbline 137
; y=0;
clr R14
.dbline 138
; temp8=0;
clr R12
.dbline 139
; temp10=0;
clr R0
clr R1
std y+7,R1
std y+6,R0
.dbline 140
; m=0;
clr R22
clr R23
.dbline 142
;
; WDT_off();//等待第一個接收數據。
rcall _WDT_off
.dbline 143
; y=USART_Recive();
rcall _USART_Recive
mov R14,R16
.dbline 144
; charry[0]=y;//接收數據
std y+1,R14
.dbline 145
; watchdog_init();//打開看門狗,防止串行數據中斷而無限等待。
rcall _watchdog_init
.dbline 146
; for(i=1;i<5;i++)
ldi R24,1
ldi R25,0
movw R10,R24
rjmp L20
L17:
.dbline 147
.dbline 148
rcall _USART_Recive
mov R14,R16
.dbline 149
movw R24,R28
adiw R24,1
movw R30,R10
add R30,R24
adc R31,R25
std z+0,R14
.dbline 150
L18:
.dbline 146
movw R24,R10
adiw R24,1
movw R10,R24
L20:
.dbline 146
movw R24,R10
cpi R24,5
ldi R30,0
cpc R25,R30
brlo L17
.dbline 152
; {
; y=USART_Recive();
; charry[i]=y;//接收數據
; }
;
; if (charry[0]==0x55)
ldd R24,y+1
cpi R24,85
breq X2
rjmp L21
X2:
.dbline 153
; {
.dbline 156
;
; //功能選擇判斷
; switch (charry[1])
ldd R20,y+2
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L32
cpi R20,2
ldi R30,0
cpc R21,R30
breq L30
cpi R20,3
ldi R30,0
cpc R21,R30
breq L27
cpi R20,1
ldi R30,0
cpc R21,R30
brge X3
rjmp L24
X3:
L41:
cpi R20,16
ldi R30,0
cpc R21,R30
breq L34
cpi R20,17
ldi R30,0
cpc R21,R30
breq L38
rjmp L24
X0:
.dbline 157
; {
L27:
.dbline 159
; case 0x03: //如果為00則啟動IO輸出
; IO_out(charry[3],charry[2]); //確定輸出數據和端口
ldd R18,y+3
ldd R16,y+4
rcall _IO_out
.dbline 160
; break;
rjmp L24
L30:
.dbline 162
; case 0x02: //如果為00則啟動IO輸入
; temp8=IO_in(charry[2]);//啟動IO轉換,確定通道數。
ldd R16,y+3
rcall _IO_in
mov R12,R16
.dbline 163
; USART_Transmit(temp8);//啟動串口發送IO數據(第四位)
rcall _USART_Transmit
.dbline 165
; //USART_Transmit(0x00);//啟動串口發送IO數據(第五位)
; break;
rjmp L24
L32:
.dbline 167
; case 0x01://如果為01則啟動AD轉換
; temp10=ADC_Value(charry[2]);//啟動AD轉換,確定通道數。
ldd R16,y+3
rcall _ADC_Value
std y+7,R17
std y+6,R16
.dbline 168
; m=temp10;
movw R22,R16
.dbline 169
; temp8=(unsigned char)(m>>8);
movw R12,R22
mov R12,R13
clr R13
.dbline 170
; USART_Transmit(temp8);//啟動串口發送數據(高8位)
mov R16,R12
rcall _USART_Transmit
.dbline 171
; temp8=(unsigned char)temp10;
ldd R12,y+6
ldd R13,y+7
.dbline 172
; USART_Transmit(temp8);//啟動串口發送數據(低8位)
mov R16,R12
rcall _USART_Transmit
.dbline 173
; break;
rjmp L24
L34:
.dbline 175
; case 0x10://如果為10則啟動DA轉換
; DAC_5617_10(charry[3],charry[4],charry[2]); //啟動DA5716
ldd R2,y+3
std y+0,R2
ldd R18,y+5
ldd R16,y+4
rcall _DAC_5617_10
.dbline 176
; break;
rjmp L24
L38:
.dbline 178
; case 0x11://如果為11則先啟動DA再啟動AD轉換
; DAC_5617_10(charry[3],charry[4],0x01); //啟動DA5716
ldi R24,1
std y+0,R24
ldd R18,y+5
ldd R16,y+4
rcall _DAC_5617_10
.dbline 179
; asm("NOP");
NOP
.dbline 180
; temp10=ADC_Value(0x01); //啟動AD轉換,AD/DA使用相同通道1。
ldi R16,1
rcall _ADC_Value
std y+7,R17
std y+6,R16
.dbline 181
; m=temp10;
movw R22,R16
.dbline 182
; temp8=(unsigned char)(m>>8);
movw R12,R22
mov R12,R13
clr R13
.dbline 183
; USART_Transmit(temp8);//啟動串口發送數據(高8位)
mov R16,R12
rcall _USART_Transmit
.dbline 184
; temp8=(unsigned char)temp10;
ldd R12,y+6
ldd R13,y+7
.dbline 185
; USART_Transmit(temp8);//啟動串口發送數據(低8位)
mov R16,R12
rcall _USART_Transmit
.dbline 186
; break;
.dbline 187
; default:break;
L24:
.dbline 189
; }
; }
L21:
.dbline 191
L11:
.dbline 130
rjmp L10
X1:
.dbline -2
L9:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym r m 22 i
.dbsym l temp10 6 i
.dbsym r temp8 12 c
.dbsym l charry 1 A[5:5]c
.dbsym r y 14 c
.dbsym r i 10 i
.dbend
.dbfunc e USART_Recive _USART_Recive fc
; y -> R20
.even
_USART_Recive::
rcall push_gset1
.dbline -1
.dbline 196
;
; }
; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -