I purchased a Silicon Labs Si4707 weather band radio break out board (BOB) from Sparkfun a couple of months ago and finally did something with it. The Si4707 has a SAME ( Specific Area Message Encoding ) processor that allows alerting for only for a certain kinds of warnings. The weather band radio board receives from 162.40MHz to 162.55MHz; Its outputs is a 1/8″ jack with enough output to power a small speaker with low volume or earphones at a comfortable level of listening.
For my project I used MPLABX 2.0 with the XC8 C compiler. I decide to post this project before I was done programming because I’m about to customize this project for what I want. I thought it was a good time to make it available if a reader was interested in customizing the project without all the work of tearing apart what I had done. The code has all the right nuts and bolts and at most of the hard work done for you. All a person needs to do is a little(?) configuration to make the project meet your needs. You might consider going in another direction; volume up/down (programmable feauture!), tune up/down, and of course working with the SAME information, who knows?
Right now on the bench the PIC powers up, resets and powers up the radio, then tunes the radio via I2C to 162.55MHz. It finishes up by reading back the status and then dumps the Tuned Frequency and RSSI ( Received Signal Strength Indicator ) on to the LCD… then off to infinite loop land. In the next few days I plan on having my seven buttons for “quick tune” to the common frequencies (.40, 425, .45, etc..) and one additional monitor/standby switch. My radio will normally be silent and once it receives a weather alert it will un-mute the speaker and alert the LCD. The Standby/Monitor button will reset my alert.
I’ll throw my finished code up on github and you can download my version in a week or so [I’ll edit this and drop a link in when I’ve actually done this].
Another note of interest: the output of the audio amplifier is kind of weak. I recommend building another amplifier stage if you want the thing to wake you up in a weather emergency.
The attached code this is really rough around the edges.. I lot of hacking went into this and all of the unused functions are totally untested.
The Si4707 WX RX:
Okay, so $30.. not a bad price. And in the end I’m happy with the performance.
HOWEVER! The items I don’t like about it…
1. Sparkfun’s BOB threw pull up resistors on it.. that is annoying. I realize you can cut them out but .. how about some 2mm jumpers or something? I got burnt by them trying to get the I2C working. (RTFM!) 🙂 I noticed lot of people seem to have issues with them being poorly sized according to the feedback I’ve read.
2. Wow it this thing pokey. I was a little confused by the application note for the product to determine worst case tune time, etc… basically I just ended up putting in 1000ms because 300ms was hit and miss for me. If I read it correctly worse case tune time for the AM radio version of the chip is 28 seconds!?
3. I2C! Well it worked fine but I suspect the board is a little noisy? with about 2 inches of wire leads I got enough ringing when the BOB wasn’t loaded by the logic analyzer for comm to fold. I ended up have to enable slew. I also slowed the unit down to 25KHz from 100KHz because I have to wait for it anyways. It’ll probably work fine at 100KHz with slew on.
The circuit in general:
I haven’t included a schematic nor do I have any plans to. The photos show you I really am not using any support components besides LCD 10k pot you normally put on an LCD. I would have had pull up resistors but they were not required because of the BOB having them pre-installed. You should be able to re-create the circuit just by looking at my TRISx/LATx initialization in the code. I commented it my version of adequate-enough… If you’re stumped, just ask!
5.0V input to run the LCD backlight and LCD main power (a standard 2 line 44780 compatible). The five volts also feeds the switching power supply to supply the PIC and 4707 with 3.3V power. I mistakenly thought the 4707 ran on 3.3V because I had been using an I2C product that was 3.3V only then had done a little switching around, oops… no harm, just a waste of the regulator. The 4707 runs 2.7-5.5V. My push button switches are designed to run in a 2×4 matrix. See the //notes in the code. Finally my PIC. I’m using (again!) the Microchip PIC 16F1509 microcontroller with a Tautic 20 pin development board and it’s daughter-board for a little prototyping space. I could maybe stretch this 20 PIN MCU a little more but I probably should have picked a slightly larger PIC for the IO. It’s enough for me though.
So my final thoughts are I still have a lot of work and a lot of clean up work on this project. My temp mounting doesn’t have me totally won over. I also don’t like my “keypad” … I might by a pre-build “shield” and adapt it or maybe design my own PCB. I haven’t even hooked up the buttons because I haven’t decided if I’m happy-enough if the hardware.
The code:
/*
* File: newmain.c
* Author: Charles M Douvier
* Contact at: http://iradan.com
*
* Created on January 26, 2014, 12:00 PM
*
* Target Device:
* 16F1509 on Tautic 20 pin dev board
*
* Project:
* I2C Testing with the TCN75A
*
* Version:
* 0.1 Start Bit, and Control Byte ... check
* 0.2 /ACK NAK and Stop ... check!
* 0.3 works+232
*
*/
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 //4Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif
#include
#include
#include
#include
//config bits
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=ON, MCLRE=ON, CP=OFF, BOREN=OFF, CLKOUTEN=OFF, FCMEN=OFF
#pragma config WRT=OFF, STVREN=OFF, LVP=OFF
#define _XTAL_FREQ 4000000 //defined for delay
#define device_address 0b1001000 // unused for now
unsigned int ACK_bit;
int i, x; //garbage flags
long int tempi, tempn, tempx, tempy, temp10, temp25;
unsigned char byte, tempbyte1, tempbyte2;
unsigned char StatusByte;
unsigned char RESP1Byte, RESP2Byte, RESP3Byte, RESP4Byte, RESP5Byte;
unsigned char RESP6Byte, RESP7Byte, RESP8Byte, RESP9Byte, RESP10Byte;
unsigned char RESP11Byte, RESP12Byte, RESP13Byte, RESP14Byte;
char buf[10];
void init_io(void) {
ANSELA = 0x00; // all port A pins are digital I/O
ANSELB = 0x00; // all port A pins are digital I/O
ANSELC = 0x00; // all port B pins are digital I/O
TRISAbits.TRISA0 = 0; // keypad strobe 1
TRISAbits.TRISA1 = 0; // keypad strobe 2
TRISAbits.TRISA2 = 0; // RADIO /RST
TRISAbits.TRISA3 = 1; // /MCLR
TRISAbits.TRISA4 = 0; // LCD RS
TRISAbits.TRISA5 = 0; // LCD EN
TRISBbits.TRISB4 = 1; // RB4 I2C SDA, has to be set as an input
TRISBbits.TRISB5 = 1; // RB5 NC (RESERVED RS232)
TRISBbits.TRISB6 = 1; // RB6 I2C SCLK, has to be set as an input
TRISBbits.TRISB7 = 0; // RB7 NC (RESERVED RS232)
TRISCbits.TRISC0 = 0; // LCD D4
TRISCbits.TRISC1 = 0; // LCD D5
TRISCbits.TRISC2 = 0; // LCD D6
TRISCbits.TRISC3 = 0; // LCD D7
TRISCbits.TRISC4 = 1; // button col 1
TRISCbits.TRISC5 = 1; // button col 2
TRISCbits.TRISC6 = 1; // button col 3
TRISCbits.TRISC7 = 1; // button col 4
}
/*
* LCD Interface Functions
* standard 44780 format 2 lines
*/
void lcd_strobe (void) //TOGGLE LCD_EN
{
LATAbits.LATA5 = 0;
__delay_ms(20);
LATAbits.LATA5 = 1;
}
/* write a byte to the LCD in 4 bit mode */
void lcd_write(unsigned char c)
{
LATC = c >> 4;
lcd_strobe();
LATC = c;
lcd_strobe();
__delay_us(100);
}
/*
* Clear and home the LCD
*/
void lcd_clear(void)
{
LATAbits.LATA4 = 0;
lcd_write(0x1);
__delay_ms(2);
}
/* write a string of chars to the LCD */
void lcd_puts(const char * s)
{
LATAbits.LATA4 = 1; // write characters
while(*s)
lcd_write(*s++);
}
/*
* Go to the specified position
*/
void lcd_goto(unsigned char pos)
{
LATAbits.LATA4 = 0;
lcd_write(0x80+pos);
}
/*
* Write 16 spaces on LCD 2 to avoid blanking, (ugly CLEAR effect)
* this is slow but work for my needs
*/
void lcd_clrline1(void)
{
lcd_goto(0);
lcd_puts(" ");
lcd_goto(0);
}
void lcd_clrline2(void)
{
lcd_goto(40);
lcd_puts(" ");
lcd_goto(40);
}
/* initialise the LCD - put into 4 bit mode */
void lcd_init(void)
{
LATAbits.LATA4 = 0; // write control bytes
LATC = 0x03;
__delay_ms(150); //power on delay
lcd_strobe();
__delay_ms(5);
lcd_strobe();
__delay_ms(5);
lcd_strobe();
__delay_ms(5);
LATC = 0x02; // set 4 bit mode
__delay_ms(5);
lcd_strobe();
__delay_ms(5);
lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font
lcd_write(0x08); // display off
lcd_write(0x0C); // display on cursor+blink off
lcd_write(0x06); // entry mode
}
/*
* I2C Functions
*
*/
void I2C_ACK(void)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSP1CON2bits.ACKDT=0; // clear the Acknowledge Data Bit - this means we are sending an Acknowledge or 'ACK'
SSP1CON2bits.ACKEN=1; // set the ACK enable bit to initiate transmission of the ACK bit to the serial eeprom
while(!PIR1bits.SSP1IF); // Wait for interrupt flag to go high indicating transmission is complete
}
void Send_I2C_Data(unsigned int databyte)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSPBUF = databyte; // send databyte
while(!PIR1bits.SSP1IF); // Wait for interrupt flag to go high indicating transmission is complete
}
unsigned char RX_I2C_Data (void)
{
RCEN = 1; //
while( RCEN ) continue;
while( !BF ) continue;
byte = SSPBUF;
return byte;
}
void I2C_Control_Write(void)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSP1BUF = 0xC6; // send the control byte 4707 Addr w/ SEN=1
while(!PIR1bits.SSP1IF) // Wait for interrupt flag to go high indicating transmission is complete
{
i = 1;
// place to add a breakpoint if needed
}
PIR1bits.SSP1IF=0;
}
void I2C_Control_Read(void)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSP1BUF = 0xC7; // send the control byte
while(!PIR1bits.SSP1IF) // Wait for interrupt flag to go high indicating transmission is complete
{
i = 1;
// place to add a breakpoint if needed
}
PIR1bits.SSP1IF=0;
}
void I2C_Start_Bit(void)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSPCON2bits.SEN=1; // send start bit
while(!PIR1bits.SSP1IF) // Wait for the SSPIF bit to go back high before we load the data buffer
{
i = 1;
}
PIR1bits.SSP1IF=0;
}
void I2C_check_idle()
{
unsigned char byte1; // R/W status: Is a transfer in progress?
unsigned char byte2; // Lower 5 bits: Acknowledge Sequence, Receive, STOP, Repeated START, START
do
{
byte1 = SSPSTAT & 0x04;
byte2 = SSPCON2 & 0x1F;
} while( byte1 | byte2 );
}
/*
* Send the repeated start message and wait repeated start to finish.
*/
void I2C_restart()
{
I2C_check_idle();
RSEN = 1; // Reinitiate start
while( RSEN ) continue;
}
void I2C_Stop_Bit(void)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSPCON2bits.PEN=1; // send stop bit
while(!PIR1bits.SSP1IF)
{
i = 1;
// Wait for interrupt flag to go high indicating transmission is complete
}
}
void I2C_NAK(void)
{
PIR1bits.SSP1IF=0; // clear SSP interrupt bit
SSP1CON2bits.ACKDT=1; // set the Acknowledge Data Bit- this means we are sending a No-Ack or 'NAK'
SSP1CON2bits.ACKEN=1; // set the ACK enable bit to initiate transmission of the ACK bit to the serial eeprom
while(!PIR1bits.SSP1IF) // Wait for interrupt flag to go high indicating transmission is complete
{
i = 1;
}
}
/*
* Si4707 WB RX Functions
*
*/
void Tune400(void)
{
//162400 64960 FDC0
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xC0); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void Tune425(void)
{
//162425 64970 FDCA
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xCA); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void Tune450(void)
{
//162450 64980 FDD4
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xD4); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void Tune475(void)
{
//162475 64990 FDDE
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xDE); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void Tune500(void)
{
//162500 65000 FDE8
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xE8); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void Tune525(void)
{
//162525 65010 FDF2
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xF2); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void Tune550(void)
{
//162550 65020 FDFC
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //
Send_I2C_Data(0xFC); //...
I2C_Stop_Bit();
__delay_ms(1000); //tune delay
}
void VolumeUp(void)
{
//future use
}
void VolumeDown(void)
{
//future use
}
void VolumeMAX (void)
{
// Reset Volume
}
void VolumeMUTE (void)
{
//Mute Sound
}
void CheckStatus (void)
{
/*
* STATUS BYTE
* [7] CTS Clear to Send.
* 0 = Wait before sending next command.
* 1 = Clear to send next command.
* [6] ERR Error.
* 0 = No error
* 1 = Error
* 5:4 Reserved Values may vary.
* [3] RSQINT Received Signal Quality Interrupt.
* 0 = Received Signal Quality measurement has not been triggered.
* 1 = Received Signal Quality measurement has been triggered.
* [2] SAMEINT SAME Interrupt (Si4707 Only).
* 0 = SAME interrupt has not been triggered.
* 1 = SAME interrupt has been triggered.
* [1] ASQINT Audio Signal Quality Interrupt.
* 0 = Audio Signal Quality measurement has not been triggered.
* 1 = Audio Signal Quality measurement has been triggered.
* [0] STCINT Seek/Tune Complete Interrupt.
* 0 = Tune complete has not been triggered.
* 1 = Tune complete interrupt has been triggered.
*/
//0x52 RX_STATUS
//STATUS, RESP1 (VALID), RESP2 FREQ_H, RESP3 FREQ_L, RESP4 RSSI, RESP5 SNR
I2C_Start_Bit(); // send start bit
I2C_Control_Write();
Send_I2C_Data(0x52); //TUNE STATUS
Send_I2C_Data(0x00); //DONT CLEAR INT
I2C_restart();
I2C_Control_Read();
RX_I2C_Data(); //STATUS
StatusByte = byte;
I2C_ACK();
RX_I2C_Data(); //VALID
RESP1Byte = byte;
I2C_ACK();
RX_I2C_Data(); //FREQ1
RESP2Byte = byte;
I2C_ACK();
RX_I2C_Data(); //FREQ2
RESP3Byte = byte;
I2C_ACK();
RX_I2C_Data(); //RSSI
RESP4Byte = byte;
I2C_ACK();
RX_I2C_Data(); //SNR
RESP5Byte = byte;
I2C_NAK(); //NAK
I2C_Stop_Bit(); // Send Stop Bit
//Update Freq Display
//Update RSSI
}
CheckFlag(unsigned value, unsigned bitindex)
{
//1=0x000000_0
//CheckFlag(BYTE,1);
return (value & (1 << bitindex)) != 0;
}
void CheckSAME(void)
{
//0x54 SAME_STATUS
//STATUS, ARG1, ARG2, STATUS, RESP1-RESP13.
//
//ARG1 0:INTACK 1:CLRBUF
//ARG2 READ_ADDR
//3:RSQINT 2:SAMEINT 1:ASQINT 0:STCINT
I2C_Start_Bit(); // send start bit
I2C_Control_Write();
Send_I2C_Data(0x54); //SAME STATUS
Send_I2C_Data(0x00); //DONT CLEAR INT
Send_I2C_Data(0x00); //Start location
I2C_restart();
I2C_Control_Read();
RX_I2C_Data(); //STATUS
StatusByte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP1Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP2Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP3Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP4Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP5Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP6Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP7Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP8Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP9Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP10Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP11Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP12Byte = byte;
I2C_ACK();
RX_I2C_Data(); //
RESP13Byte = byte;
I2C_NAK(); //NAK
I2C_Stop_Bit(); // Send Stop Bit
if (CheckFlag(StatusByte,2))
i=1; //TODO
}
void ResetSAME(void)
{
//0x54 SAME_STATUS
//STATUS, ARG1, ARG2, STATUS, RESP1-RESP13.
//ARG1 0:INTACK 1:CLRBUF
//ARG2 READ_ADDR
//3:RSQINT 2:SAMEINT 1:ASQINT 0:STCINT
I2C_Start_Bit(); // send start bit
I2C_Control_Write();
Send_I2C_Data(0x54); //SAME STATUS
Send_I2C_Data(0x03); //Dump Buffer and Reset SAME Int.
Send_I2C_Data(0x00); //Start location
I2C_restart();
I2C_Control_Read();
RX_I2C_Data(); //STATUS
StatusByte = byte;
I2C_ACK();
RX_I2C_Data(); //don't care about the rest..
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_ACK();
RX_I2C_Data(); //
I2C_NAK(); //NAK
I2C_Stop_Bit(); // Send Stop Bit
}
void Monitor(void)
{
//TODO
}
void Standby(void)
{
//TODO
}
MultiFunction()
{
LATAbits.LATA0=0; //TODO
LATAbits.LATA1=1;
__delay_ms(2000);
if (LATCbits.LATC3)
Monitor();
else
Standby();
}
poll_buttons() //TODO
{
//check buttons for switch. no need for debounce, polling is long in the case of keydown.
LATAbits.LATA0=1;
LATAbits.LATA1=0;
__delay_ms(5);
if (LATCbits.LATC4)
Tune400();
if (LATCbits.LATC5)
Tune425();
if (LATCbits.LATC6)
Tune450();
if (LATCbits.LATC7)
Tune475();
LATAbits.LATA0=0;
LATAbits.LATA1=1;
__delay_ms(5);
if (LATCbits.LATC4)
Tune500();
if (LATCbits.LATC1)
Tune525();
if (LATCbits.LATC2)
Tune550();
if (LATCbits.LATC3)
MultiFunction();
}
void RST_4707(void)
{
LATAbits.LATA2 = 0;
__delay_ms(50);
LATAbits.LATA2 = 1;
}
void display_missing(void)
{
lcd_clrline1();
lcd_puts("Si4707 missing.");
}
void display_freq(void)
{
lcd_clrline1();
lcd_puts("FREQ: ");
CheckStatus();
//RESP4Byte
temp25 = 25;
temp10 = 10;
tempn = RESP2Byte;
tempy = 256;
tempx = RESP3Byte;
tempi = tempn*tempy;
tempi = tempi+tempx;
tempi = tempi*temp25;
tempi = tempi/temp10;
ltoa(buf,tempi,10); //long conversion to buffer
lcd_puts(buf);
lcd_puts(" KHz");
}
int main(void) {
OSCCONbits.IRCF = 0x0d; //set OSCCON IRCF bits to select OSC frequency 4MHz
OSCCONbits.SCS = 0x02;
OPTION_REGbits.nWPUEN = 0; //enable weak pullups (each pin must be enabled individually)
init_io();
__delay_ms(250); //let the power settle
lcd_init();
__delay_ms(10);
lcd_clear();
//display test message
lcd_puts("iradan.com");
lcd_goto(40);
TRISBbits.TRISB6 = 1;
SSPSTATbits.SMP = 1;
SSPCONbits.SSPM=0x08; // I2C Master mode, clock = Fosc/(4 * (SSPADD+1))
SSPCONbits.SSPEN=1; // enable MSSP port
SSPADD = 0x27; //figure out which one you can ditch sometime (probably either)
SSP1ADD = 0x27; // 100KHz
//0x09 = 100KHz
// **************************************************************************************
RST_4707();
__delay_ms(100); // let everything settle.
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte with read set
x=0; // temp feature, TODO
if (!SSP1CON2bits.ACKSTAT)
x=1; //device there? /ACked?
Send_I2C_Data(0x01); //power up
Send_I2C_Data(0x53); //command per AN332
Send_I2C_Data(0x05);
I2C_Stop_Bit();
__delay_ms(1000); //power up delay...
I2C_Start_Bit(); // send start bit
I2C_Control_Write(); // send control byte
Send_I2C_Data(0x50); //Tune Frequency
Send_I2C_Data(0x00); //0x00
Send_I2C_Data(0xFD); //65020 (162.550)
Send_I2C_Data(0xFC); //... FDFC
I2C_Stop_Bit();
__delay_ms(1000); //tuning delay
if (x==1)
display_freq();
else
display_missing();
lcd_clrline2(); //clear LCD line 2 by writting " " and return
lcd_puts("RSSI: ");
tempi = RESP4Byte;
ltoa(buf,tempi,10); //long conversion to buffer
lcd_puts(buf);
while (1) {
poll_buttons();
i=1; // do nothing for now..
__delay_ms(100); // delay.. just because
}
return;
}