📄 程序.htm
字号:
0;
// Stop timer2 if running<br>
CKCON |=
0x20;
// T2M=1 (/4 timer clock)<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'> RCAP2L =
0x0C;
// 8KHz tick...<br>
RCAP2H =
0xFE;
// ... = 65536-16e6/(4*8e3) = FE0Ch<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'> TF2 =
0;
// Clear any pending timer2 interrupts<br>
TR2 =
1;
// Start timer2<br>
ET2 =
1;
// Enable timer2 interrupts<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'> // PWM:<br>
P0_ALT =
0x80;
// Enable PWM output (P0.7)<br>
PWMCON =
0xC0;
// Enable 8 bit PWM, pre=min<br>
PWMDUTY = 0xFF;<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'> // ADC:<br>
ADCSTATIC &=
0x1C;
// DIFFM=0, SLEEP=0, CLK8=0<br>
ADCSTATIC |=
0x03;
// 12 bit<br>
ADCCON =
0x32;
// Channel 2, NPD=1, ADCRUN=0, EXTREF=1<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'> // RADIO:<br>
PWR_UP = 1;<br>
Delay100us(30);
// Wait > 3ms<br>
<br>
// SPI: <br>
SPICLK =
0x00;
// Max SPICLK (=CLK/8)<br>
SPI_CTRL =
0x02;
// Connect SPI to RADIO CH1<br>
<br>
// RADIO:<br>
CE = 0;<br>
CS =
1;
// RF SPI CS = 1<br>
Delay100us(0);<br>
for(i=0;i<RxTxConf.n;i++)<br>
{<br>
SpiReadWrite(RxTxConf.buf[i]);<br>
}<br>
CS = 0;<br>
EA =
1;
// Enable global interrupts<br>
}<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'>void TxPacket(void)<br>
{<br>
unsigned char i, rp;<br>
<br>
CE = 1;<br>
Delay100us(0);<br>
// All packets start with the address:<br>
for (i=0;i<ADDR_COUNT;i++)<br>
{<br>
SpiReadWrite(RxTxConf.buf[ADDR_INDEX+i]);<br>
}<br>
/*<br>
* Read the packet from the transmit buffer and
write it to the radio with inline<br>
* SPI commands (for increased speed) and update
the buffer write pointer and<br>
* number of bytes in buffer:<br>
*/ <br>
rp = TxRdp;<br>
for (i=0;i<NSLOTS;i++)<br>
{<br>
EXIF &=
~0x20;
// Clear SPI interrupt<br>
SPI_DATA =
TxBuf[rp];
// Move byte to send to SPI data register<br>
rp++;<br>
rp &=
FMASK; <br>
ET2 = 0;<br>
TxNum--;<br>
ET2 = 1;<br>
while((EXIF & 0x20) ==
0x00) // Wait until SPI hs
finished transmitting<br>
; <br>
}<br>
CE = 0;<br>
TxRdp = rp;<br>
}<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'>void RxPacket(void)<br>
{<br>
unsigned char wp;<br>
if(slave)<br>
{<br>
/*<br>
* Tell the interrupt
routine that we have received <br>
* a packet and it's time
to sync to the master:<br>
*/<br>
ET2 = 0;<br>
rec = 1;<br>
nosync = 0;<br>
ET2 = 1;<br>
}<br>
/*<br>
* Read the received packet from the radio with
inline SPI commands (for increased speed)<br>
* and put it in the receive buffer and advance the
buffer write pointer, and number of<br>
* bytes in the buffer:<br>
*/<br>
while(DR1)<br>
{<br>
EXIF &=
~0x20;
// Clear SPI interrupt<br>
SPI_DATA =
0;
// Write dummy byte to SPI data register<br>
wp = RxWrp;<br>
RxWrp++;<br>
RxWrp &= FMASK;<br>
while((EXIF & 0x20) ==
0x00) // Wait until SPI hs
finished receiving<br>
;<br>
RxBuf[wp] = SPI_DATA;<br>
ET2 = 0;<br>
RxNum++;<br>
ET2 = 1;<br>
}<br>
}<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'>void Timer2ISR (void) interrupt
5 using 1<br>
{<br>
unsigned char adc;<br>
<br>
TF2 =
0;
// Clear timer2 interrupt <br>
adc =
ADCDATAH;
// Read ADC and...<br>
ADCCON &=
~0x80;
// ...start new...<br>
ADCCON |=
0x80;
// ...conversion<br>
if(RxNum > 0)<br>
{<br>
/*<br>
* If there are any samples
in receive buffer, write next<br>
* sample to the PWM and
advance the buffer read pointer.<br>
*/<br>
PWMDUTY = RxBuf[RxRdp];<br>
RxRdp++;<br>
RxRdp &= FMASK;<br>
RxNum--;<br>
}<br>
TxBuf[TxWrp] =
adc;
// Write ADC sample to the transmit buffer and..<br>
TxWrp++;
// ..advance buffer..<br>
TxWrp &=
FMASK;
// ..write pointer<br>
TxNum++;<br>
if(rec !=
0)
// Valid packet received by slave?<br>
{<br>
rec =
0;
// Yes, preset time...<br>
slotn =
SYNCSLOT;
// ...slot counter (sync to master)<br>
} else<br>
{<br>
slotn++;
// Increment time slot counter<br>
if(slotn ==
NSLOTS)
// If at beginning of frame....<br>
{<br>
slotn =
0;
// ... reset time slot counter...<br>
if(nosync < 255)
// ...and update nosync counter<br>
nosync++;<br>
}<br>
}<br>
}<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'>void SetRxMode(void)<br>
{<br>
CS = 1;<br>
Delay100us(0);<br>
SpiReadWrite(RxTxConf.buf[RxTxConf.n - 1] | 0x01);<br>
CS = 0;<br>
}<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'>void SetTxMode(void)<br>
{<br>
CS = 1;<br>
Delay100us(0);<br>
SpiReadWrite(RxTxConf.buf[RxTxConf.n - 1]);<br>
CS = 0;<br>
}<o:p></o:p></span></p>
<p style='line-height:150%;word-break:break-all'><span lang=EN-US
style='font-size:9.0pt;line-height:150%'>void WaitRx(void)<br>
{<br>
SetRxMode();<br>
CE =
1;
// Radio CE = 1<br>
while(1)<br>
{<br>
if(DR1)
// If data ready...<br>
{<br>
RxPacket();
// ...receive packet<br>
break;<br>
}<br>
if(slave)<br>
{<br>
if(nosync >
NSYNC)
// If slave has been out of sync for > NSYNC frames...<br>
{<br>
ET2 = 0;<br>
InitBuffers();
// ...initialize buffers and continue waiting<br>
ET2 = 1;<br>
continue;<br>
} <br>
&nbs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -