Home Programmering RF TX/RX with FS1000A and XY-MK-5V
RF TX/RX with FS1000A and XY-MK-5V PDF Skriv ut E-post
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
 
Kopirett © 2013 nerdegutta.org. Alle rettigheter reservert.
Joomla! er fri programvare utgitt under GNU/GPL License.