diff --git a/avrrfm.c b/avrrfm.c
index 93c5093..3fb3b7a 100644
--- a/avrrfm.c
+++ b/avrrfm.c
@@ -35,8 +35,9 @@
#include "dejavu.h"
#include "unifont.h"
-#define TRANSMIT_FAST 4 // 4 ~ 32 seconds
-#define TRANSMIT_SLOW 38 // 38 ~ 5 minutes
+#define TRANSMIT_FAST 1 // 4 ~ 32 seconds
+#define TRANSMIT_SLOW 9 // 38 ~ 5 minutes
+#define MAX_TIMEOUTS 9 // slow down tx attempts after so many timeouts
#define LABEL_OFFSET 10
#define BLACK 0x0000
@@ -63,24 +64,24 @@
static width_t width = 0;
/**
- * Called when the watchdog barks to wake up the transmitter.
+ * Wakes up the controller and increments the watchdog bark counter.
*/
ISR(WDT_vect) {
watchdogInts++;
}
/**
- * Called while the controller isn't in power down sleep mode.
+ * Wakes up the controller and notifies of an interrupt on DIO.
*/
-ISR(TIMER0_COMPA_vect) {
- rfmTimer();
+ISR(INT0_vect) {
+ rfmIrq();
}
/**
- * Called when an INT0 interrupt occurs.
+ * Wakes up the controller and notifies of an interrupt on DIO4.
*/
-ISR(INT0_vect) {
- rfmInt();
+ISR(INT1_vect) {
+ rfmIrq();
}
/**
@@ -137,13 +138,19 @@
}
/**
- * Enables radio interrupt.
+ * Enables radio interrupts.
*/
static void initRadioInt(void) {
EIMSK |= (1 << INT0);
- // EICRA |= (1 << ISC00); // interrupt on any logical change
- // EICRA |= (1 << ISC01); // interrupt on falling edge
- EICRA |= (1 << ISC01) | (1 << ISC00); // interrupt on rising edge
+ // interrupt on rising edge
+ EICRA |= (1 << ISC01) | (1 << ISC00);
+
+ // irq from DIO4 only used for transmitter (timeout waiting for response)
+ if (!RECEIVER) {
+ EIMSK |= (1 << INT1);
+ // interrupt on rising edge
+ EICRA |= (1 << ISC11) | (1 << ISC10);
+ }
}
/**
@@ -159,20 +166,6 @@
}
/**
- * Sets up the timer.
- */
-static void initTimer(void) {
- // timer0 clear timer on compare match mode, TOP OCR0A
- TCCR0A |= (1 << WGM01);
- // timer0 clock prescaler/1024/255 ~ 46 Hz @ 12 MHz ~ 61 Hz @ 16 MHz
- TCCR0B |= (1 << CS02) | (1 << CS00);
- OCR0A = 255;
-
- // enable timer0 compare match A interrupt
- TIMSK0 |= (1 << OCIE0A);
-}
-
-/**
* Enables SPI.
*/
static void enableSPI(void) {
@@ -196,7 +189,6 @@
uint8_t power = rfmGetOutputPower();
uint8_t payload[] = {(temp >> 8), temp & 0x00ff, power};
rfmTransmitPayload(payload, sizeof (payload), node);
- // printString("Transmitted\r\n");
}
/**
@@ -215,7 +207,7 @@
// display some info (receiver RSSI + CRC, transmitter output power)
snprintf(buf, sizeof (buf), "RSSI: %4d dBm, CRC: %d, PA: %+3d dBm",
- -_rssi, crc, -18 + (temp->power & 0x1f));
+ -_rssi, crc, temp->power);
const __flash Font *unifont = &unifontFont;
writeString(0, 0, unifont, buf, BLACK, WHITE);
@@ -256,14 +248,13 @@
* @param flags
*/
static void handlePayload(PayloadFlags flags) {
- uint8_t rssi = rfmGetRssi();
Temperature temp = readTemp();
// communicate RSSI back to transmitter
- uint8_t payload[] = {rssi};
+ uint8_t payload[] = {flags.rssi};
rfmTransmitPayload(payload, sizeof (payload), NODE2);
- displayTemp(rssi, flags.crc, &temp);
+ displayTemp(flags.rssi, flags.crc, &temp);
rfmStartReceive();
}
@@ -276,9 +267,10 @@
uint8_t response[1];
int8_t len = rfmReceivePayload(response, sizeof (response), true);
if (len > 0) {
- // receiver RSSI
+ // request more output power starting from -95 dBm
+ // TODO needs some hysteresis/something more elaborate
int8_t rssi = divRoundNearest(response[0], 2);
- rfmSetOutputPower(rssi);
+ rfmSetOutputPower(rssi - 97);
return false;
}
@@ -337,7 +329,6 @@
if (!RECEIVER) {
// used only for tx
initWatchdog();
- initTimer();
sdcard = sdcInit();
}
diff --git a/librfm.a b/librfm.a
index b241fb2..15715ed 100644
--- a/librfm.a
+++ b/librfm.a
Binary files differ
diff --git a/librfm.h b/librfm.h
index 949cc86..f8d598f 100644
--- a/librfm.h
+++ b/librfm.h
@@ -34,8 +34,8 @@
#define DIO_MAP2 0x26
#define IRQ_FLAGS1 0x27
#define RSSI_THRESH 0x29
-#define RX_TIMEOUT1 0x2a
-#define RX_TIMEOUT2 0x2b
+#define RX_TO_RSSI 0x2a
+#define RX_TO_PRDY 0x2b
#define PREAMB_MSB 0x2c
#define PREAMB_LSB 0x2d
#define IRQ_FLAGS2 0x28
@@ -69,6 +69,7 @@
#define MODE_TX 0x0c
#define MODE_RX 0x10
+#define PA_OFF 18
#define PA_MIN 16
#define PA_MAX 31
@@ -76,15 +77,13 @@
#define F_STEP 6103515625ULL
#define CAST_ADDRESS 0x84
-#define TIMEOUT_INTS 3 // about 100 milliseconds @ 30 Hz
-#define MAX_TIMEOUTS 9 // slow down tx attempts after so many timeouts
-
/**
* Flags for "payload ready" event.
*/
typedef struct {
bool ready;
bool crc;
+ uint8_t rssi;
} PayloadFlags;
/**
@@ -128,17 +127,10 @@
void rfmInit(uint64_t freq, uint8_t node);
/**
- * Should be called when a radio interrupt occurred, i.e. 'PayloadReady'.
+ * Reads interrupt flags. Should be called when any interrupt occurs
+ * on DIO0 or DIO4.
*/
-void rfmInt(void);
-
-/**
- * Gives a timer pulse to the radio. Used to time-out blocking functions,
- * i.e. transmitter waiting for a response from the receiver.
- * TIMEOUT_INTS must be adjusted according to the frequency with that
- * this function is called.
- */
-void rfmTimer(void);
+void rfmIrq(void);
/**
* Shuts down the radio.
@@ -158,25 +150,19 @@
void rfmSetNodeAddress(uint8_t address);
/**
- * Returns the current RSSI value.
+ * Sets the output power to -2 to +13 dBm.
+ * Values outside that range are ignored.
*
- * @return rssi value
+ * @param dBm ouput power
*/
-uint8_t rfmGetRssi(void);
+void rfmSetOutputPower(int8_t dBm);
/**
- * Sets the output power based on the given receiver RSSI.
- *
- * @param rssi
- */
-void rfmSetOutputPower(uint8_t rssi);
-
-/**
- * Returns the current output power setting.
+ * Returns the current output power setting in dBm.
*
* @return ouput power
*/
-uint8_t rfmGetOutputPower(void);
+int8_t rfmGetOutputPower(void);
/**
* Sets the radio to receive mode and maps "PayloadReady" to DIO0.
diff --git a/nbproject/Makefile-Custom.mk b/nbproject/Makefile-Custom.mk
index 54aaa32..1c5a827 100644
--- a/nbproject/Makefile-Custom.mk
+++ b/nbproject/Makefile-Custom.mk
@@ -42,6 +42,7 @@
${OBJECTDIR}/_ext/48b9ad18/display.o \
${OBJECTDIR}/_ext/48b9ad18/font.o \
${OBJECTDIR}/_ext/48b9ad18/i2c.o \
+ ${OBJECTDIR}/_ext/48b9ad18/librfm.o \
${OBJECTDIR}/_ext/48b9ad18/mcp9808.o \
${OBJECTDIR}/_ext/48b9ad18/rfm.o \
${OBJECTDIR}/_ext/48b9ad18/sdc.o \
@@ -103,6 +104,10 @@
${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18
$(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/i2c.o /home/dode/dev/avrrfm/i2c.c
+${OBJECTDIR}/_ext/48b9ad18/librfm.o: /home/dode/dev/avrrfm/librfm.c
+ ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18
+ $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/librfm.o /home/dode/dev/avrrfm/librfm.c
+
${OBJECTDIR}/_ext/48b9ad18/mcp9808.o: /home/dode/dev/avrrfm/mcp9808.c
${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18
$(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/mcp9808.o /home/dode/dev/avrrfm/mcp9808.c
diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml
index 4b51237..5464725 100644
--- a/nbproject/configurations.xml
+++ b/nbproject/configurations.xml
@@ -9,6 +9,7 @@
display.c
font.c
i2c.c
+ librfm.c
mcp9808.c
mcp9808.h
rfm.c
@@ -66,6 +67,8 @@
-
+ -
+
-
-
diff --git a/types.h b/types.h
index 507847d..dfb7952 100644
--- a/types.h
+++ b/types.h
@@ -43,7 +43,7 @@
*/
typedef struct {
uint16_t raw;
- uint8_t power;
+ int8_t power;
} Temperature;
/**