- Mon Feb 18, 2008 4:49 am
#43001
Hi guys,
Can you please help me with a few problems below:
1. I am using mplab to program the microcontroller 18LF242 with a 3V button battery. Is it alright as I found out that sometimes the PIC doesnt run and the Vdd is actually between 2.6 - 2.9V ?
2. I dont receive any signals from the transmitter... ? I am not sure if is because of the programming codes? Below are the receiver and transmitter codes:
#include <p18f242.h>
#include <delays.h>
#define DATA PORTCbits.RC2
#define CLK1 PORTCbits.RC1
#define CS PORTBbits.RB1
#define CE PORTBbits.RB5
#define act_addr 0b10101010 //Addr
#define data_w 16
#define addr_w 8
#define crc 0b01 // CRC enable
#define mode 0b01001111 // Rx2En = 0, Shockburst Mode, 250kbps,16 MHz module crystal, 0db Power
#define rf_ch 0x00 // 2400 MHz frequency channel
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
void main()
{
TRISCbits.TRISC3 = 0; // ON PWR_UP
PORTCbits.RC3 = 1;
Init_RF();
while(1){
initInterrupt();
Rx_En();
}
}
void Init_RF (void)
{
char addr_w_crc = ( addr_w << 2 )| crc;
char config[15] = {0,data_w, 0, 0, 0, 0, 0, 0, 0, 0, 0, act_addr, addr_w_crc, mode, 1};
int i, j;
TRISCbits.TRISC2 = 0;
TRISCbits.TRISC1 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB5 = 0;
Delay10KTCYx(2); // 5 msec (tpd2sby)
CE = 0; // Set configuration mode
CS = 1; // Select configuration register
Delay10TCYx(4); // 10 usec (tcs2data)
for ( i = 0; i < 15; i++)
{
for ( j = 7; j >= 0; j--) // send the configuration
{
DATA = config >> j;
CLK(); // Clock in the data
}
}
CS = 0;
}
void Rx_En(void)
{
int i;
char Rx_2400MHz = (rf_ch << 1) | 1; // configuration word
TRISCbits.TRISC2 = 0; // Set Outputs
TRISCbits.TRISC1 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB5 = 0;
CE = 0; // Set configuration mode
CS = 1; // Select configuration register
Delay10TCYx(4); // 10 usec (tcs2data)
for ( i = 7; i >= 0; i--)
{
DATA = Rx_2400MHz >> i; // Shift out Rx address
CLK(); // Clock in the data
}
CS = 0; // shift the configuration word
TRISCbits.TRISC2 = 1; // Set Data as Input
Delay100TCYx(10); // 250 usec (tsettling)
initInterrupt(); // Allow DR1 to interrupt MCU
CE = 1; // Turn on ACTIVE RX Mode
Delay10TCYx(4); // 10 usec (tce2data)
}
void Receive (void)
{
int i;
payload = 0;
//CE = 0;
for ( i = 15; i >= 0; i--)
{
CLK1 = 1; // Clock in the data
Delay10TCYx(10); // 500 nsec (tsetup)
Delay10TCYx(10); // 500 nsec (tsetup)
payload |= DATA << i; // Shift in payload
CLK1 = 0;
Delay10TCYx(10); // 500 nsec (tsetup)
Delay10TCYx(10); // 500 nsec (tsetup)
}
}
//Initialisation of Interrupt subroutines
void initInterrupt (void) {
INTCONbits.INT0IE = 1; //enable INT1
RCONbits.IPEN = 1; //enable priority interrupts
INTCONbits.GIEH = 1; //enable all high priority interrupts
}
void HI_isr_handler (void);
#pragma code high_vector_section = 0x08
void high_vector (void){
_asm
GOTO HI_isr_handler
_endasm
}
#pragma code
#pragma interrupt HI_isr_handler
void HI_isr_handler (void){
if (INTCONbits.INT0IF ==1) {
Receive();
INTCONbits.INT0IF = 0;
}
}
void Off_interrupt (void){
INTCONbits.INT0IE = 0; //enable INT1
RCONbits.IPEN = 0; //enable priority interrupts
INTCONbits.GIEH = 0; //enable all high priority interrupts return;
INTCONbits.INT0IF = 0;
}
void CLK(void)
{
Delay1TCY(); // 500 nsec (tsetup)
Delay1TCY(); // 500 nsec (tsetup)
CLK1 = 1; // clock in the value
Delay1TCY(); // 500 nsec (tsetup)
Delay1TCY(); // 500 nsec (tsetup)
CLK1 = 0;
}
///////////Transmiter part//////////////////////
void main()
{
Init_RF();
while(1){
TRISCbits.TRISC3 = 0; // ON PWR_UP
PORTCbits.RC3 = 1;
Delay1KTCYx(12);
Transmit(170);
Delay10KTCYx(100); // 250 msec
}
} // End void main()
void Transmit (int tx_payload)
{
int i;
Tx_En();
for ( i = 7; i >= 0; i--)
{
DATA = act_addr >> i; // Shift out Rx address
CLK(); // Clock in the data
}
for ( i = 15; i >= 0; i--)
{
DATA = tx_payload >> i; // Shift out payload CLK(); // Clock in the data
}
CE = 0;
}
void Tx_En(void)
{
int i;
char Tx_2400MHz = (rf_ch << 1);
TRISCbits.TRISC2 = 0; //Set as outputs
TRISCbits.TRISC1 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB5 = 0;
CE = 0;
CS = 1;
Delay10TCYx(4); // 10 usec (tcs2data)
for ( i = 7; i >= 0; i--)
{
DATA = Tx_2400MHz >> i; // Shift out Rx address
CLK(); // Clock in the data
}
CS = 0; // shift the configuration word
Off_interrupt();// Disallow RD1 to interrupt MCU
Delay100TCYx(10); // 250 usec (tsettling)
CE = 1;
Delay10TCYx(4); // 10 usec (tce2data)
}
Can you please help me with a few problems below:
1. I am using mplab to program the microcontroller 18LF242 with a 3V button battery. Is it alright as I found out that sometimes the PIC doesnt run and the Vdd is actually between 2.6 - 2.9V ?
2. I dont receive any signals from the transmitter... ? I am not sure if is because of the programming codes? Below are the receiver and transmitter codes:
#include <p18f242.h>
#include <delays.h>
#define DATA PORTCbits.RC2
#define CLK1 PORTCbits.RC1
#define CS PORTBbits.RB1
#define CE PORTBbits.RB5
#define act_addr 0b10101010 //Addr
#define data_w 16
#define addr_w 8
#define crc 0b01 // CRC enable
#define mode 0b01001111 // Rx2En = 0, Shockburst Mode, 250kbps,16 MHz module crystal, 0db Power
#define rf_ch 0x00 // 2400 MHz frequency channel
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
void main()
{
TRISCbits.TRISC3 = 0; // ON PWR_UP
PORTCbits.RC3 = 1;
Init_RF();
while(1){
initInterrupt();
Rx_En();
}
}
void Init_RF (void)
{
char addr_w_crc = ( addr_w << 2 )| crc;
char config[15] = {0,data_w, 0, 0, 0, 0, 0, 0, 0, 0, 0, act_addr, addr_w_crc, mode, 1};
int i, j;
TRISCbits.TRISC2 = 0;
TRISCbits.TRISC1 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB5 = 0;
Delay10KTCYx(2); // 5 msec (tpd2sby)
CE = 0; // Set configuration mode
CS = 1; // Select configuration register
Delay10TCYx(4); // 10 usec (tcs2data)
for ( i = 0; i < 15; i++)
{
for ( j = 7; j >= 0; j--) // send the configuration
{
DATA = config >> j;
CLK(); // Clock in the data
}
}
CS = 0;
}
void Rx_En(void)
{
int i;
char Rx_2400MHz = (rf_ch << 1) | 1; // configuration word
TRISCbits.TRISC2 = 0; // Set Outputs
TRISCbits.TRISC1 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB5 = 0;
CE = 0; // Set configuration mode
CS = 1; // Select configuration register
Delay10TCYx(4); // 10 usec (tcs2data)
for ( i = 7; i >= 0; i--)
{
DATA = Rx_2400MHz >> i; // Shift out Rx address
CLK(); // Clock in the data
}
CS = 0; // shift the configuration word
TRISCbits.TRISC2 = 1; // Set Data as Input
Delay100TCYx(10); // 250 usec (tsettling)
initInterrupt(); // Allow DR1 to interrupt MCU
CE = 1; // Turn on ACTIVE RX Mode
Delay10TCYx(4); // 10 usec (tce2data)
}
void Receive (void)
{
int i;
payload = 0;
//CE = 0;
for ( i = 15; i >= 0; i--)
{
CLK1 = 1; // Clock in the data
Delay10TCYx(10); // 500 nsec (tsetup)
Delay10TCYx(10); // 500 nsec (tsetup)
payload |= DATA << i; // Shift in payload
CLK1 = 0;
Delay10TCYx(10); // 500 nsec (tsetup)
Delay10TCYx(10); // 500 nsec (tsetup)
}
}
//Initialisation of Interrupt subroutines
void initInterrupt (void) {
INTCONbits.INT0IE = 1; //enable INT1
RCONbits.IPEN = 1; //enable priority interrupts
INTCONbits.GIEH = 1; //enable all high priority interrupts
}
void HI_isr_handler (void);
#pragma code high_vector_section = 0x08
void high_vector (void){
_asm
GOTO HI_isr_handler
_endasm
}
#pragma code
#pragma interrupt HI_isr_handler
void HI_isr_handler (void){
if (INTCONbits.INT0IF ==1) {
Receive();
INTCONbits.INT0IF = 0;
}
}
void Off_interrupt (void){
INTCONbits.INT0IE = 0; //enable INT1
RCONbits.IPEN = 0; //enable priority interrupts
INTCONbits.GIEH = 0; //enable all high priority interrupts return;
INTCONbits.INT0IF = 0;
}
void CLK(void)
{
Delay1TCY(); // 500 nsec (tsetup)
Delay1TCY(); // 500 nsec (tsetup)
CLK1 = 1; // clock in the value
Delay1TCY(); // 500 nsec (tsetup)
Delay1TCY(); // 500 nsec (tsetup)
CLK1 = 0;
}
///////////Transmiter part//////////////////////
void main()
{
Init_RF();
while(1){
TRISCbits.TRISC3 = 0; // ON PWR_UP
PORTCbits.RC3 = 1;
Delay1KTCYx(12);
Transmit(170);
Delay10KTCYx(100); // 250 msec
}
} // End void main()
void Transmit (int tx_payload)
{
int i;
Tx_En();
for ( i = 7; i >= 0; i--)
{
DATA = act_addr >> i; // Shift out Rx address
CLK(); // Clock in the data
}
for ( i = 15; i >= 0; i--)
{
DATA = tx_payload >> i; // Shift out payload CLK(); // Clock in the data
}
CE = 0;
}
void Tx_En(void)
{
int i;
char Tx_2400MHz = (rf_ch << 1);
TRISCbits.TRISC2 = 0; //Set as outputs
TRISCbits.TRISC1 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB5 = 0;
CE = 0;
CS = 1;
Delay10TCYx(4); // 10 usec (tcs2data)
for ( i = 7; i >= 0; i--)
{
DATA = Tx_2400MHz >> i; // Shift out Rx address
CLK(); // Clock in the data
}
CS = 0; // shift the configuration word
Off_interrupt();// Disallow RD1 to interrupt MCU
Delay100TCYx(10); // 250 usec (tsettling)
CE = 1;
Delay10TCYx(4); // 10 usec (tce2data)
}