开始的时候我是用中断产生定时间隔来做的. 也是用9454. 这种方法不是很准确, 330us的高电平,有时候只有300us, 现在换成,发射编码时,先关中断, 再调用延时函数,处理产生时序.
楼主的DelayMs(1) 好像延时不是1ms, 你的晶振是多少?
void DelayMs(uchar ms) { uchar i,j; for(i = 0; i < ms; i++) { for(j = 0; j < 250; j++) NOP; } }
IAR的汇编如下, 代码中级优化.
DelayMs: 0111 B0CE CLR R14 0113 8B0B JR T, 0x0120 NOP; 0115 FF NOP for(j = 0; j < 250; j++) 0116 DE INC R13 for(j = 0; j < 250; j++) 0117 56DFFC AND 0xDF, #0xFC 011A A6CDFA CP R13, #0xFA 011D 7BF6 JR C, 0x0115 for(i = 0; i < ms; i++) 011F EE INC R14 for(i = 0; i < ms; i++) 0120 A2EF CP R14, R15 0122 FB04 JR NC, 0x0128 for(j = 0; j < 250; j++) 0124 B0CD CLR R13 0126 8BEF JR T, 0x0117 } 0128 AF RET 0129 FF NOP ?C_EXIT: exit: 012A FF NOP
看我的RF 编码. /******************************************************************/ // RF send data start // 12ms idle time,333us start bit,(333+666)us*16 data bit, // __ __ // | | | | // __| |__| |__ di(); RF_out0(); i = 12; // RF idle 12ms while(i>0) { delay_330us(); delay_330us(); delay_330us(); i--; }
RF_out1(); // RF start bit 330us delay_330us(); // RF_out1 do { j = RF_code[RF_byte]; for(i=0; i<8; i++) { if(j & 0x80) { RF_out0(); delay_330us(); // 0 RF_out1(); delay_330us(); // 1 delay_330us(); // 1 } else { RF_out0(); delay_330us(); // 0 delay_330us(); // 0 RF_out1(); delay_330us(); // 1 } j = j << 1; } RF_byte++; }while(RF_byte < 2); RF_out0(); RF_flag.bit.BIT_RF_EN = 0; RF_frame_num++; ei();
/******************************************************************/
延时函数
void delay_330us(void) { uchar i; // i = 64; i = 93; while(i > 0) { i--; } }
IAR的汇编如下, i = 93; delay_330us: 0B74 FC5D LD R15, #0x5D 0B76 8B02 JR T, 0x0B7A i--; 0B78 00CF DEC R15 while(i > 0) 0B7A 42FF OR R15, R15 0B7C EBFA JR NZ, 0x0B78 } 0B7E AF RET 0B7F FF NOP
4M晶振,延时为: 1+1.5+ 93*3.5 -1 + 2 + 3.5= 332.5us |