Test program to send MAX!-Messages with a RFM22-Module
Dependencies: RF22 TextLCD TextLCDScroll mbed RF22Max
Diff: main.cpp
- Revision:
- 1:b71f9a293c54
- Parent:
- 0:94dd393bd9bb
- Child:
- 2:941c46d37d7e
--- a/main.cpp Mon Jan 16 19:06:53 2012 +0000 +++ b/main.cpp Wed Jan 18 20:09:21 2012 +0000 @@ -6,9 +6,19 @@ #include "mbed.h" #include <RF22.h> +#include "TextLCD.h" +#include "mRotaryEncoder.h" Serial pc(USBTX, USBRX); +TextLCD lcd(p30, p29, p28, p27, p26, p25, TextLCD::LCD16x2); // rs, e, d4-d7 + +//mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1500) +mRotaryEncoder wheel(p21, p22, p23, PullUp, 1500); + +volatile bool enc_pressed = false; // Button of rotaryencoder was pressed +volatile bool enc_rotated = false; // rotary encoder was totaded left or right + // mbed LEDs //DigitalOut led1(LED1); //DigitalOut led2(LED2); @@ -20,6 +30,26 @@ //rf22(PinName slaveSelectPin , PinName mosi, PinName miso, PinName sclk, PinName interrupt ); RF22 rf22(p14,p11,p12,p13,p15); +int counter = 1; + +float frequence = 869.50; // frequence for sender +const float f_offset = -0.01; // frequence-offset for receiver + + +//interrup-Handler for button on rotary-encoder - no function +void trigger_sw() { + enc_pressed = true; // just set the flag, rest is done outside isr +} + +//interrup-Handler for rotary-encoder rotation - change frequence +void trigger_rotated() { + frequence = wheel.Get()/1000.0; + lcd.locate(0,1); + lcd.printf("%4.3fMHz ",frequence); + if (!rf22.setFrequency(frequence)) // set the new frequence + pc.printf("setFrequency failed"); +} + void setup() { if (!rf22.init()) @@ -176,7 +206,9 @@ pc.printf("setModemConfig failed"); //uint8_t data[] = "hello"; // 255 octets: - uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345"; + //uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345"; + uint8_t data[32] = ""; + sprintf((char*)data,"Message-Nr: %d",counter); rf22.send(data, sizeof(data)); rf22.waitPacketSent(); pc.printf("Send OK\n\r"); @@ -187,26 +219,27 @@ void test_rx() { pc.printf("Start Receive...\n\r"); //if (!rf22.setFrequency(869.50)) - if (!rf22.setFrequency(869.49)) // sending frequesnce doesn't work!!! Seems to be a problem if combining RFM22B-S1 with -S2 + if (!rf22.setFrequency(869.49)) // sending frequence doesn't work!!! Offset! Seems to be a problem if combining RFM22B-S1 with -S2 pc.printf("setFrequency failed\n\r"); if (!rf22.setModemConfig(RF22::GFSK_Rb2Fd5)) pc.printf("setModemConfig failed\n\r"); //while (1) { - uint8_t buf[RF22_MAX_MESSAGE_LEN]; - uint8_t len = sizeof(buf); - if (rf22.recv(buf, &len)) // Should fail, no message available - pc.printf("recv 1 failed\n\r"); + uint8_t buf[RF22_MAX_MESSAGE_LEN]; + uint8_t len = sizeof(buf); + if (rf22.recv(buf, &len)) // Should fail, no message available + pc.printf("recv 1 failed\n\r"); - //rf22.waitAvailable(); - if (rf22.waitAvailableTimeout(6000)) { - if (rf22.recv(buf, &len)) - pc.printf("got one in user: >%s<\n\r",(char*)buf); - - else - pc.printf("recv 2 failed\n\r"); + //rf22.waitAvailable(); + if (rf22.waitAvailableTimeout(6000)) { + if (rf22.recv(buf, &len)) { + pc.printf("got one in user: >%s<\n\r",(char*)buf); + lcd.locate(0,0); + lcd.printf("%16s",(char*)buf); } else - pc.printf("recv timeout\n\r"); + pc.printf("recv 2 failed\n\r"); + } else + pc.printf("recv timeout\n\r"); //} } @@ -238,6 +271,8 @@ float end = 869.65; float step = 0.02; + + void spec() { rf22.setModeRx(); float freq; @@ -261,16 +296,56 @@ pc.printf("------------------\n\r"); } +void send_loop() { + uint8_t data[32] = ""; + + while (1) { + //uint8_t data[] = "hello"; + // 255 octets: + //uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345"; + + sprintf((char*)data,"Message-Nr: %d",counter++); + rf22.send(data, sizeof(data)); + rf22.waitPacketSent(); + pc.printf("Send OK: %s\n\r",(char*)data); + + wait(2); // Wait 2 Seconds + } +} + +void receive_loop() { + while (1) { + uint8_t buf[RF22_MAX_MESSAGE_LEN]; + uint8_t len = sizeof(buf); + + rf22.waitAvailable(); + if (rf22.recv(buf, &len)) { + pc.printf("got one in user: >%s<\n\r",(char*)buf); + lcd.cls(); + lcd.locate(0,0); + lcd.printf("%16s",(char*)buf); + } else { + lcd.printf("recv failed"); + pc.printf("recv failed\n\r"); + } + } +} int main() { + +//#define sender; // are we sender? + pc.baud(115200); pc.printf("\n\rConnected to mbed\n\r"); + lcd.locate(0,0); // 2nd cls needed, as otherwise it doesn't init correctly!!??? + lcd.printf("RF22-Test-V1.0"); + pc.printf("Pre-setup|"); setup(); pc.printf("Post-setup\n\r"); - + //pc.printf("Pre-test_temp|"); //test_temp(); @@ -285,13 +360,14 @@ test_rssi(); pc.printf("Post-test_rssi\n\r"); } - + while (1) { spec(); } */ - + /* while (1) { + lcd.cls(); test_tx(); rf22.setModeRx(); wait(0.5); @@ -299,7 +375,59 @@ wait(2); spec(); } - + */ + + if (!rf22.setModemConfig(RF22::GFSK_Rb19_2Fd9_6)) + pc.printf("setModemConfig failed"); + + +// Test activation of AFC: not enough for combination -S1/-S2 Modules! + +// RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1d +// RF22_AFC_EN 0x40 + rf22.spiWrite(RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE, RF22_AFC_EN); + + +// Reg RF22_REG_1E_AFC_TIMING_CONTROL 0x1e +// RF22_AFC_TC 0x0a + rf22.spiWrite(RF22_REG_1E_AFC_TIMING_CONTROL, RF22_AFC_TC ); + +// Reg RF22_REG_2A_AFC_LIMITER 0x2a +// RF22_AFC_LIMIT 0x50 + rf22.spiWrite(RF22_REG_2A_AFC_LIMITER, RF22_AFC_LIMIT); + +#ifndef sender + frequence+=f_offset; +#endif + + wheel.Set(frequence*1000); // 3 digits after period + + // call trigger_rot() when the shaft is rotaded left or right - change frequence + wheel.attachROT(&trigger_rotated); + + lcd.locate(0,1); + lcd.printf("%fMHz",frequence); + wait(10); + lcd.cls(); + + if (!rf22.setFrequency(frequence)) + pc.printf("setFrequency failed"); + + +#ifdef sender + // Code for sending + + + send_loop(); // start sending +#endif + +#ifndef sender + // Code for receiving + + receive_loop(); // start receiving + +#endif + //pc.printf("Ready.\n\r"); }