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; /**