Author: jaguarondi
Date: 2008-08-22 12:10:38 +0200 (Fri, 22 Aug 2008)
New Revision: 1570
Modified:
firmware/rf/trunk/main.c
firmware/rf/trunk/prot.c
firmware/rf/trunk/rf_ctrl.c
firmware/rf/trunk/varis.c
firmware/rf/trunk/varis.h
Log:
* First attempt at adaptative frequency hopping. It's probably buggy and I
need to add some debug functions to trace what's going on.
Modified: firmware/rf/trunk/main.c
===================================================================
--- firmware/rf/trunk/main.c 2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/main.c 2008-08-22 10:10:38 UTC (rev 1570)
@@ -107,10 +107,25 @@
/* Main loop */
for(;;)
{
+ uint8_t i;
if (disconnected_flag)
{
disconnected_flag = false;
system_start_up();
}
+ for (i=0; i<AFH_RANGE; i++)
+ {
+ if (AFH_collision[i] > AFH_COLL_TRSH)
+ {
+ AFH_collision[i] = -AFH_COLL_TRSH;
+ AFH_freq[i] += CHANNEL_JUMP;
+ if (AFH_freq[i] > CHANNEL_MAX)
+ {
+ AFH_freq[i] -= NUMBER_OF_CHANNELS;
+ }
+ }
+ if (AFH_prescaler == 0 && AFH_collision[i] > 0)
+ AFH_collision[i]--;
+ }
}
}
Modified: firmware/rf/trunk/prot.c
===================================================================
--- firmware/rf/trunk/prot.c 2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/prot.c 2008-08-22 10:10:38 UTC (rev 1570)
@@ -68,89 +68,100 @@
* M/S starts in SLAVE mode then switch to MASTER if no masters are found
* within a certain time.
*/
+
+ /* Initialize the frequency table */
+ uint8_t k;
+ for (k=0; k<AFH_RANGE; k++)
+ {
+ AFH_freq[k] = k;
+ }
+
/* SLAVE or M/S */
#ifndef _MASTER
- uint8_t tmp;
- uint16_t j;
+ uint8_t tmp;
+ uint16_t j;
- pwr_dwn_atr2406();
- wait_n_10us(250);//wait
+ pwr_dwn_atr2406();
+ wait_n_10us(250);//wait
- uint8_t i = 0;
+#if defined(HOPPING)
+ uint8_t channel_idx = 0;
+#endif
#ifdef _SLAVE /* SLAVE mode */
- /* We loop until a master is found */
- for(;;){
+ /* We loop until a master is found */
+ for(;;){
#else /* M/S mode */
/* If a master is not found, we skip and become master. */
- for(i=0;i<3;i++){
+ uint8_t i;
+ for(i=0;i<3;i++){
#endif
- /* Disable UART */
- UCSR0A = 0x00;
- UCSR0B = 0x00;
- UCSR0C = 0x00;
+ /* Disable UART */
+ UCSR0A = 0x00;
+ UCSR0B = 0x00;
+ UCSR0C = 0x00;
- pwr_up_atr2406();//apply power to ATR2406
- wait_n_10us(4);//wait for 40us
+ pwr_up_atr2406();//apply power to ATR2406
+ wait_n_10us(4);//wait for 40us
- //scan channel 0 for 89*2*slottime = 200ms
- //scan channel 40 for 89*2*slottime = 200ms
- //scan channel 80 for 89*2*slottime = 200ms
+ //scan channel 0 for 89*2*slottime = 200ms
+ //scan channel 40 for 89*2*slottime = 200ms
+ //scan channel 80 for 89*2*slottime = 200ms
#if defined(NOHOPP)
- channel = TRX_CHANNEL;
+ channel = TRX_CHANNEL;
#elif defined(HOPPING)
- /* Scan different channels in case some are clogged-up */
- i = (i+1) % 3;
- channel = 0x00 + i*40;
+ /* Scan different channels in case some are clogged-up */
+ channel_idx = (cnt+1) % 3;
+ channel = 0x00 + i*40;
#elif defined(AFH)
- /* Scan different channels in case some are clogged-up */
- AFH_index = (AFH_index+1) % AFH_RANGE;
- channel = AFH_freq[AFH_index];
+ /* Scan different channels in case some are clogged-up */
+ AFH_index = (AFH_index+1) % AFH_RANGE;
+ channel = AFH_freq[AFH_index];
#endif
- sof_ary[0] = channel;
- init_atr2406(channel,RXEN);//configure ATR2406 to desired channel
- DDRD &= 0xEF;//XCK PIN set to input!!
- wait_n_10us(37);//wait for 370us
- set_rxon();//power up RF-Chip in receive mode
- wait_n_10us(5);//wait for 50us
- checksum = 0x00;
- UCSR0A = 0x00;
- UCSR0B = 0x90;
- /* Enable RX UART. */
- UCSR0C = 0x46;
- for(tmp=0;tmp<POLL_LOOPS;tmp++){
- start_rf_timer_scanning();
- rf_rx_state = 0;
- do{
- if(rf_rx_state==0xFF){//something received
- if(checksum==0x00){//correct received
- //pwr_dwn_atr2406();
- rf_rx_state = 0x00;
+ sof_ary[0] = channel;
+ init_atr2406(channel,RXEN);//configure ATR2406 to desired channel
+ DDRD &= 0xEF;//XCK PIN set to input!!
+ wait_n_10us(37);//wait for 370us
+ set_rxon();//power up RF-Chip in receive mode
+ wait_n_10us(5);//wait for 50us
+ checksum = 0x00;
+ UCSR0A = 0x00;
+ UCSR0B = 0x90;
+ /* Enable RX UART. */
+ UCSR0C = 0x46;
+ for(tmp=0;tmp<POLL_LOOPS;tmp++){
+ start_rf_timer_scanning();
+ rf_rx_state = 0;
+ do{
+ if(rf_rx_state==0xFF){//something received
+ if(checksum==0x00){//correct received
+ //pwr_dwn_atr2406();
+ rf_rx_state = 0x00;
- j = TCNT1;
- /* XXX have to change this so ts isn't global
anymore */
- j = j - ts;
- /* Changing prescaler!! */
- j = j << 3;
- OCR1A = T_SYNC - j;
- start_rf_timer();
- return;
- }
+ j = TCNT1;
+ /* XXX have to change this so ts isn't global anymore
*/
+ j = j - ts;
+ /* Changing prescaler!! */
+ j = j << 3;
+ OCR1A = T_SYNC - j;
+ start_rf_timer();
+ return;
}
- /* XXX use the overflow interrupt and the same timer
- * settings as in normal mode. */
- } while (TCNT1 < 43201); /* 200ms */
- }
+ }
+ /* XXX use the overflow interrupt and the same timer
+ * settings as in normal mode. */
+ } while (TCNT1 < 43201); /* 200ms */
}
+ }
#endif
- /* MASTER mode. */
- pwr_dwn_atr2406();
- pwr_up_atr2406();
- start_rf_timer();
- UCSR0A = 0x00;
- UCSR0B = 0x00;
- UCSR0C = 0x00;
- /* Enable RX UART */
- OCR1A = 0x0020;
+ /* MASTER mode. */
+ pwr_dwn_atr2406();
+ pwr_up_atr2406();
+ start_rf_timer();
+ UCSR0A = 0x00;
+ UCSR0B = 0x00;
+ UCSR0C = 0x00;
+ /* Enable RX UART */
+ OCR1A = 0x0020;
}
Modified: firmware/rf/trunk/rf_ctrl.c
===================================================================
--- firmware/rf/trunk/rf_ctrl.c 2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/rf_ctrl.c 2008-08-22 10:10:38 UTC (rev 1570)
@@ -67,26 +67,25 @@
/* We shouldn't power down at full rate */
//pwr_dwn_atr2406();
- if (rf_rx_state==0xFF)
+ AFH_prescaler++;
+ if (rf_rx_state==0xFF && checksum==0x00)
{
- set_link();
/* Good frame received. */
+ set_link();
connected = CONNECTED_TIMEOUT;
- if (checksum==0x00)
- {
- /* Switch rx buffer */
- uint8_t volatile *p = rf_buffer_rx;
- rf_buffer_rx = rf_buffer_rx_full;
- rf_buffer_rx_full = p;
- //PORTD ^= 0x08; // XXX DEBUG
- good_frame_received = true;
- }
- else
- good_frame_received = false;
+ good_frame_received = true;
+
+ /* Switch rx buffer */
+ uint8_t volatile *p = rf_buffer_rx;
+ rf_buffer_rx = rf_buffer_rx_full;
+ rf_buffer_rx_full = p;
+ //PORTD ^= 0x08; // XXX DEBUG
}
else
{
- good_frame_received = false; /* or whatever value */
+ /* Didn't receive or wrong checksum */
+ good_frame_received = false;
+ AFH_collision[AFH_index]++;
if (connected)
{
if (!--connected)
@@ -183,7 +182,7 @@
channel = TRX_CHANNEL;
#elif defined(HOPPING)
channel += CHANNEL_JUMP;
- if(channel > CHANNEL_MAX)
+ if (channel > CHANNEL_MAX)
{
channel -= NUMBER_OF_CHANNELS;
}
Modified: firmware/rf/trunk/varis.c
===================================================================
--- firmware/rf/trunk/varis.c 2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/varis.c 2008-08-22 10:10:38 UTC (rev 1570)
@@ -77,9 +77,10 @@
//variable holding the 4 Byte start of frame
/* Frequency hopping frequency table */
-uint8_t AFH_freq[AFH_RANGE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19, 11, 12};
-uint8_t AFH_collision[AFH_RANGE];
+uint8_t AFH_freq[AFH_RANGE];
uint8_t AFH_index;
+int8_t AFH_collision[AFH_RANGE];
+uint8_t AFH_prescaler;
volatile uint8_t channel;
Modified: firmware/rf/trunk/varis.h
===================================================================
--- firmware/rf/trunk/varis.h 2008-08-22 10:03:46 UTC (rev 1569)
+++ firmware/rf/trunk/varis.h 2008-08-22 10:10:38 UTC (rev 1570)
@@ -55,8 +55,10 @@
#define AFH_RANGE 13
extern uint8_t AFH_freq[AFH_RANGE];
-extern uint8_t AFH_collision[AFH_RANGE];
extern uint8_t AFH_index;
+extern int8_t AFH_collision[AFH_RANGE];
+extern uint8_t AFH_prescaler;
+#define AFH_COLL_TRSH 100
extern volatile uint8_t rf_buffer_tx[];
extern uint8_t volatile *rf_buffer_rx;
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn