|
Skrevet av nerdegutta
|
|
tirsdag 11. desember 2012 17:34 |
|
Denne vesle artikkelen tar for seg RF signaler med FS1000A og XY-MK-5V. Det er en liten sender og mottaker, kjøpt på ebay.com.
Den sender på 433MHz.
Sender:

Mottaker:

Dette programmet sender:
// Program : tx_v1_main.c
// Description : Transfers a char through RB2/TX/CK = PIN8
// MCU : PIC 16F628
// Compiler : Hi Tech C V9.80
// IDE : MPLAB 8.83
// Date : July 2012
// Author : nerdegutta
// WEB : www.nerdegutta.org
// Includes and definitions
#include "" // Remove the "-signs
#include "usart.h"
#define _XTAL_FREQ 4000000
#define btn_reset RA4
#define btn_air RA3
#define btn_heat RA2
#define btn_gps RA1
#define reset_led RB3
// Configuration
__CONFIG(FOSC_XT & // Crystal/Resonator
WDTE_OFF & // Watchdog timer off
PWRTE_OFF & // Power up timer off
MCLRE_OFF & // MCLR function
BOREN_ON & // Brown out on
LVP_OFF & // Low voltage programming off
CP_OFF); // Code protection off
// Global variables
unsigned char no;
unsigned char stateLed1, stateLed2, stateLed3, stateLed4;
int HEADER=0xAA;
int SYNC_DATA=0x00;
// Prototype functions
void send_packet(unsigned char data);
void uart_send(unsigned char data);
// Functions
void send_packet(unsigned char data)
{
unsigned char i;
unsigned char buffer[3]; // Buffer for the data in one package
buffer[0] = HEADER; // Byte 0 is the header
buffer[1] = data; // Byte 1 is the data
buffer[2] = (unsigned char) (HEADER + data); // Byte 2 is the checksum
for (i=0;i<7;i++) uart_send(SYNC_DATA); // Clocking for a while before sending the data to sync
for (i=0;i<3;i++) uart_send(buffer[i]); // Transmit the data using the uart
} // End send_packet
void uart_send(unsigned char data)
{
while (TXIF==0);
TXREG=data;
} // End uart_send
// Main
void main()
{
INTCON = 0; // Trun off interrupts
CMCON = 0x07; // Turn comparators off
TRISA = 0b00011110; // I/O config.
// --0 // RA7 output
// ---0 // RA6 output
// ----0 // RA5 output
// -----1 // RA4 = btn_reset
// ------1 // RA3 = btn_air
// -------1 // RA2 = btn_heat
// --------1 // RA1 = btn_gps
// ---------0 // RA0 = avail
TRISB = 0b00000110; // I/O config
// --0 // RB7 = PGD
// ---0 // RB6 = PGC
// ----0 // RB5 = led_heat
// -----0 // RB4 = led_air
// ------0 // RB3 = avail
// -------1 // RB2 = TX
// --------1 // RB1 = RX
// ---------0 // RB0 = reset_led
PORTA = 0b00000000; // All bit LOW
PORTB = 0b00000000; // Setting all bits on port to LOW
stateLed1 = 0;
stateLed2 = 0;
stateLed3 = 0;
stateLed4 = 0;
no=0;
PORTB = 0;
init_comms();
while (1)
{
if (btn_reset) // Reset
{
__delay_ms(200);
no=1;
send_packet(no);
__delay_ms(20);
send_packet(no);
reset_led = 1;
__delay_ms(2000);
#asm
GOTO 0x0000;
#endasm
} // End btn_reset
if (btn_gps) // Air relay
{
__delay_ms(200);
if (stateLed2 == 0)
{
no=3;
PORTB = PORTB + 64;
stateLed2 = 1;
__delay_ms(20);
send_packet(no);
}
else if (stateLed2 == 1)
{
no=4;
PORTB = PORTB - 64;
stateLed2 = 0;
__delay_ms(20);
send_packet(no);
}
} // End btn_gps
if (btn_heat) // Heat element
{
__delay_ms(200);
if (stateLed3 == 0)
{
no=5;
PORTB = PORTB + 32;
stateLed3 = 1;
__delay_ms(20);
send_packet(no);
}
else if (stateLed3 == 1)
{
no=6;
PORTB = PORTB - 32;
stateLed3 = 0;
__delay_ms(20);
send_packet(no);
}
} // End btn_heat
if (btn_air) // GPS relay
{
__delay_ms(200);
if (stateLed4 == 0)
{
no=7;
PORTB = PORTB + 16;
stateLed4 = 1;
__delay_ms(20);
send_packet(no);
}
else if (stateLed4 == 1)
{
no=8;
PORTB = PORTB - 16;
stateLed4 = 0;
__delay_ms(20);
send_packet(no);
}
} // End btn_air
} // End while
} // End main
Dette er mottaker programmet:
// Program : RX_v1_main.c
// Description : Receive RF signal
// MCU : PIC 16F688
// Compiler : Hi Tech C v 9.80
// IDE : MPLAB 8.83
// Date : July 2012
// Author : nerdegutta
// WEB : www.nerdegutta.org
// Includes and definitions
#include "" // remove the "-signs
#include "usart.h"
#define _XTAL_FREQ 4000000
#define reset_led_delay 500
#define reset_led RA2
#define gps_led RC2
#define heat_led RC1
#define air_led RC0
// Configuration
__CONFIG(FOSC_XT & // Crystal/resonator on RA4 & RA5
WDTE_OFF & // Watchdog timer off
PWRTE_OFF& // Power up timer enable off
MCLRE_OFF & // MCLR pin function is digital input, MCLR internally tied to VDD
CP_OFF & // Code protection off
CPD_OFF & // Data code protection off
BOREN_OFF & // Brown out off
IESO_OFF & // Internat switchover off
FCMEN_ON); // Fail-Safe clock monitor on
// Global variables
unsigned char no, num;
unsigned char gps_status, air_status, heat_status;
float adc_raw;
int HEADER=0xAA;
int SYNC_DATA=0x00;
unsigned int result;
// Prototype functions
unsigned char read_packet(void);
unsigned char uart_rec(void);
void init_adc(void);
void adc_read(void);
// Functions
unsigned char read_packet(void)
{
unsigned received_byte;
static unsigned char counter = 0;
unsigned char data;
unsigned char checksum;
do {
while (uart_rec() != HEADER);
data = uart_rec();
checksum = uart_rec();
} while (checksum != (unsigned char) (HEADER + data));
return data;
} // End readpacket
unsigned char uart_rec(void)
{
unsigned char rec_data;
while(RCIF==0);
rec_data = RCREG;
return rec_data;
} // End uart_rec
void init_leds(void)
{
reset_led = 0;
gps_led = 0;
heat_led = 0;
air_led = 0;
gps_status = 0;
air_status = 0;
heat_status = 0;
} // End init_leds
// Main function
void main(void)
{
CMCON0 = 0x07; // Turn off comparators
ANSEL = 0b00001000; // Analog input on RC3/AN7
TRISA = 0b00000000;
// --0 //
// ---0 //
// ----0 // RA5 Crystal/Resonator
// -----0 // RA4 Crystal/Resonator
// ------0 // RA3 MCLR/Vpp
// -------0 // RA2 Reset_led
// --------0 // RA1 ICSP Clock
// ---------0 // RA0 ICSP Data
TRISC = 0b00111000;
// --0 //
// ---0 //
// ----1 // RC5 RX
// -----1 // RC4 TX
// ------1 // RC3 ADC Input
// -------0 // RC2 gps_led
// --------0 // RC1 heat_led
// ---------0 // RC0 ait_led
PORTA = 0b00000000;
PORTC = 0b00000000;
init_comms();
init_adc();
init_leds();
while (1)
{
/*
For future use
adc_read();
adc_raw = (unsigned int) ADRESH;
adc_raw = adc_raw*256;
adc_raw += (unsigned int) ADRESL;
if (adc_raw<=840)
{
low_battery();
}
else
{
*/
CREN = 1;
if(OERR==0) no=read_packet();
else CREN = 0;
switch(no)
{
case 1:
{
reset_led = 1;
__delay_ms(1000);
reset_led = 0;
#asm
goto 0x0000;
#endasm
}
case 3:
{
air_status = 1;
if (air_status == 1)
{
air_led = 1;
break;
} // End if
} // End case
case 4:
{
air_led = 0;
break;
}
case 5:
{
heat_led = 1;
break;
}
case 6:
{
heat_led = 0;
break;
}
case 7:
{
gps_status = 1;
if (gps_status == 1)
{
gps_led = 1;
break;
} // End if
} // End case
case 8:
{
gps_status = 0;
if (gps_status == 0)
{
gps_led = 0;
break;
} // End if
} // End case
default:
break;
} // End switch
// } // End else - For futire use
} // End while
} // End main
|
|
Sist oppdatert tirsdag 11. desember 2012 17:41 |