Releohjaus
Kahden releen ohjaus 9600 baudilla.
Tietoliikenne on valmiina.
Ohjelma
Ensin lähetysohjelma
/*******************************************************
File: d:\pic\2016\amateur\releohjaus\relelähetys.c
Date 21.12.2016
Projekti: Releohjaus lähetys 9600 buadia
Sanoma #11$ on molemmat releet päälle
Sanoma #01$ on esnimmäinen rele pois päältä, toinen päällä
Sanoma #10$ on ensimmäinen rele päällä, toinen pois
Sanoma #00$ on molemmat releet pois
********/
#include <16F886.H>
#use delay(clock=8M,restart_wdt)
#define ON 0
#define OFF 1
#BYTE OPTION_REG = 0x81
#BYTE WPUB = 0x95
#BIT PULLUPSBIT = OPTION_REG.7
#BIT PULLUPB0 = WPUB.0
#BIT PULLUPB1 = WPUB.1
#fuses INTRC_IO,PROTECT,NOWDT,PUT,CPD,NOLVP, NOWRT,BORV21
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
#define STARTCHAR '#'
#define ENDCHAR '$'
#define MAX_BUFF 4
#BYTE SSPSTAT =0x94
#BYTE SSPCON =0x14
#bit SSPEN = SSPCON.5
#BYTE SSPCON2 =0x91
#BIT SSPENABLE = SSPCON2.5
#BYTE CM2CON0 = 0x108
#BIT C2ON = CM2CON0.7
#byte UART = 0xc
#bit RI = UART.5
#byte TXSTA =0x98
#bit SYNC = TXSTA.4
#BYTE TIMER0 =1
#BYTE PIR1 = 0xc
#BYTE PIE1 = 0x8c
#bit RCIF = PIR1.5
#BYTE RCREG = 0x1A
#BYTE PORTA = 5
#BYTE PORTB = 6
#BYTE PORTC = 7
#bit RB1 = PORTB.1
#bit RB0 = PORTB.0
void logo ( void) {
printf("\n");
delay_ms(100);
printf("\n\r\nOH3GDO Releohjaus " );
printf(__DATE__);
printf("\r\nOhjaussanoma #11$ molemmata päälle ");
printf("\r\nOhjaussanoma #00$ molemmat pois ");
}
/*********************************
pura sanoma #11$
*****************************/
void decode_data (void ) {
BYTE rele1, rele2;
if(input(PIN_B0) )
rele1='1';
else
rele1 ='0';
if(input(PIN_B1))
rele2='1';
else
rele2 ='0';
printf("%c%c%c%c",STARTCHAR, rele1,rele2,ENDCHAR);
}
//*********************
// alusta PIC hardware
//***********************
void PIC_init ( void) {
setup_ccp1 ( CCP_OFF);
setup_ccp2 ( CCP_OFF);
setup_adc_ports(NO_ANALOGS);
setup_timer_0 (WDT_2304MS| RTCC_INTERNAL);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
setup_spi (SPI_SS_DISABLED);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
set_tris_a ( 0xFF); // analog RA.0
set_tris_b (0xFF); //
set_tris_c ( 0x80); //
C2ON=0;
SSPEN =0;
setup_comparator (NC_NC_NC_NC);
PULLUPSBIT =0; // global Pullupp
PULLUPB0 =1;
PULLUPB1 =1;
}
//==========================
// pääohjelma alkaa tästä
// =================
void main ( void)
{
logo();
PIC_init(); // alusta PIC hardware
while (1)
{
restart_wdt();
decode_data();
delay_ms(1000);
} // while end
}
[[code]]
:1000000001308A007E2900008A068A27C819472203
:100010004F1020296536E5376835E13A7310200026
:10002000B2192D35EF3AEC3AAD1836000D340A34DA
:100030004F3468346A3461347534733473346134E2
:100040006E346F346D3461342034233431343134C0
:10005000243420346D346F346C3465346D346D3435
:1000600061347434613420347034E434E4346C34F6
:100070006C346534203420342034203400340D05B1
:100080004F34EA30F539F330EE37ED30A011301847
:100090002410ED37EC32ED36613A2038EF3473102E
:1000A00020100000253084008313000803196928FC
:1000B0000230F800BF30F7006400F70B5C28F80B43
:1000C0005A289630F700F70B632866286400800BE7
:1000D000582808000B08A4008B13831603178C17ED
:1000E0000C140000000083120313A41B8B170317CA
:1000F0000C087F390319C0280313A40003170D0847
:100100000313A50003170F080313A60024080C1EF1
:1001100087289900250803178D0003132608031765
:100120008F0003130B08A7008B13831603178C177C
:100130000C140000000083120313A71B8B17031776
:100140000C0D0E0D7F390319C0280313A4000317EB
:100150000D080313A50003170F080313A6002408B6
:100160000C1EB0289900250803178D0003132608DC
:1001700003178F008D0A03198F0A03136A280317C8
:10018000031308000A300C1EC32899006430A50030
:100190005220043003178D0000308F0003136A20B3
:1001A000103003178D0000308F0003136A201630C3
:1001B00003178D0000308F0003130B08A4008B136E
:1001C000831603178C170C1400000000831203130E
:1001D000A41B8B1703178C08031906290D0803139A
:1001E000A40003170F080313A50003170C0803133B
:1001F0000C1EF8289900240803178D000313250806
:1002000003178F008D0A03198F0ADC283F308D00F9
:1002100000308F0003136A208A110A12A329F030DC
:1002200097059D05831603170908C0398900031334
:100230001F129F1200300317880003130108C739EB
:100240000F3881003530831290009412A3122308D6
:1002500083168700831223162308831687008312D0
:10026000A311230883168700013083129400003005
:1002700083169400F030831297059D05FF30831696
:1002800085008600803087008312A300031788133F
:10029000031394120317870188018901831603133E
:1002A00081131514951483128A110A12A429831636
:1002B00006148312061C5F293130A40061293030F6
:1002C000A400831686148312861C69293130A50088
:1002D0006B293030A50023300C1E6C2999002408AE
:1002E0000C1E7029990025080C1E742999002430D1
:1002F0000C1E782999008A110A12A62903081F39B1
:100300008300A00183160317871119300313990086
:10031000A6309800903083129800A201A101FF300E
:10032000A300831603170908C039890003131F129D
:100330009F1200300317880083128701880189010A
:1003400083130313C2280F29640057290430A40023
:0E035000FA30A5005220A40BA829A4296300AE
:04400E00242F000655
:00000001FF
;PIC16F886
;CRC=E400 CREATED="23-joulu-16 00:36"
[[/code]]
Sitten vastaanotto-ohjelma
[[code]]
/*******************************************************
File: d:\pic\2016\amateur\releohjaus\relevastaanotin.c
Date 21.12.2016
Projekti: Releohjaus vastaanotin 9600 buadia
Sanoma #11$ on molemmata releet päälle
Sanoma #01$ on esnimmäine rele pois päältä, toinen päällä
Sanoma #10$ on ensimmäinen rele päällä, toinen pois
Sanoma #00$ on molemmat releet pois
********/
#include <16F886.H>
//#device ADC=10
#use delay(internal,restart_wdt)
#define ON 0
#define OFF 1
#fuses INTRC_IO,WDT,PROTECT,PUT,NOBROWNOUT,NOLVP,NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
short int message_ready=0,message_start =0;
#define STARTCHAR '#'
#define ENDCHAR '$'
#use FIXED_IO( B_outputs=PIN_B0 ,PIN_B1, PIN_B2)
#define MAX_BUFF 4
#BYTE SSPSTAT =0x94
#BYTE SSPCON =0x14
#bit SSPEN = SSPCON.5
#BYTE SSPCON2 =0x91
#BIT SSPENABLE = SSPCON2.5
#BYTE CM2CON0 = 0x108
#BIT C2ON = CM2CON0.7
#byte UART = 0xc
#bit RI = UART.5
#byte TXSTA =0x98
#bit SYNC = TXSTA.4
#BYTE TIMER0 =1
#BYTE PIR1 = 0xc
#BYTE PIE1 = 0x8c
#bit RCIF = PIR1.5
#BYTE RCREG = 0x1A
#BYTE PORTA = 5
#BYTE PORTB = 6
#BYTE PORTC = 7
#bit RB1 = PORTB.1
#bit RB0 = PORTB.0
BYTE buff[MAX_BUFF+1], pos ;
/***********************
sarjaliikennekeskeytysessä puretaan sanoma buff puskuriin, message_ready =1 kun sanoma on valmis
Konennot voivat olla vain 4 merkkiä pitkä
esim #11$
*******************************************************************************************/
#int_rda
void rda_isr(void ) { // merkit UARTilta puskuriin
BYTE ser_ch;
ser_ch= getch();
if( !message_ready) {
if( message_start) { // sanoma on alkanut
buff[pos++] = ser_ch; // merkki talteen puskuriin
if ( pos > MAX_BUFF) { // nollaa
message_start =0; // nollaa sanoman alku
pos =0;
}
if( ser_ch==ENDCHAR){ // loppumerkki $
message_ready =1;
buff[pos] =0; // lopeta merkkijono
}
} // messager start end
else if (ser_ch==STARTCHAR ) { // alkumerkki
message_start =1; // startti mode
pos =0; // aseta pointerin alkukohta */
buff[pos++]= ser_ch;
}
} // message ready
}
/***********************************************
Aseta sarjaliikennekeskeytysrutiinin samoman alku- ja loppumerkit
ja käynnistä sanoma luku message_ready=0 ja message_start=0
tämä pitäsi vielä laittaa käynnistymään, jos ei ole tullut mitään
5 minuuttiin
*****************/
void set_receive_task( void ) {
message_ready=0; // nollaa valmis-merkki
message_start=0; // nollaa startti-merkki
pos=0; // nollaa myös saapuvien merkkien määrä
enable_interrupts(INT_RDA); // salli taas sarjaliikenne keskeytykset
RI=0;
}
void logo ( void) {
printf("\n");
delay_ms(100);
printf("\n\r\nOH3GDO Relevastaanotin " );
printf(__DATE__);
printf("\r\nOhjaussanoma #11$ molemmat päälle ");
printf("\r\nOhjaussanoma #00$ molemmat pois ");
}
/*********************************
pura sanoma #11$
*****************************/
void decode_data (void ) {
BYTE rele1, rele2;
printf("\rData=%s", buff);
if(buff[0] !=STARTCHAR) return; // jos ei tule oikea sanoma
rele1 = buff[1] - 0x30;
rele2 = buff[2] - 0x30;
if (buff[3]!= ENDCHAR) return ; // jos ei tule oikea sanoma
if(rele1)
output_low(PIN_B0); // vedä rele1 alas
else
output_high(PIN_B0); // vedä rele1 ylös
if(rele2)
output_low(PIN_B1); // vedä rele2 alas
else
output_high(PIN_B1); // vedä rele2 ylös
printf("\rrele1=%d rele2=%d ",rele1,rele2);
}
//*********************
// alusta PIC hardware
//***********************
void PIC_init ( void) {
setup_adc_ports(NO_ANALOGS);
setup_timer_0 (WDT_2304MS| RTCC_INTERNAL);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
setup_spi (SPI_SS_DISABLED); // SPI pois päältä
setup_ccp1(CCP_OFF); // PWM1 pois
setup_ccp2(CCP_OFF); // PWM2 pois
set_tris_b ( 0x0); // laita suuntarekisterit releitä varten oikein
C2ON=0;
SSPEN =0;
setup_comparator (NC_NC_NC_NC);
enable_interrupts(INT_RDA); // vastaan otto keskeytys päälle
enable_interrupts(GLOBAL) ; // Yleiskeskeytys päälle
output_high (PIN_B0); // releet pois päältä aluksi
output_high (PIN_B1); // releet pois päältä aluksi
}
void test( void)
{
output_high (PIN_B0); // releet pois päältä aluksi
output_high (PIN_B1); // releet pois päältä aluksi
output_high (PIN_B2); // releet pois päältä aluksi
delay_ms(1000);
output_low (PIN_B0); // releet pois päältä aluksi
output_low (PIN_B1); // releet pois päältä aluksi
output_low (PIN_B2); // releet pois päältä aluksi
delay_ms(1000);
}
//==========================
// pääohjelma alkaa tästä
// =================
void main ( void)
{
logo();
PIC_init(); // alusta PIC hardware
while (1)
{
restart_wdt();
if( message_ready)
{
decode_data();
set_receive_task(); // käynnistä keskeytysohjela
}
} // while end
}
[[/code]]
ja vastaanottimen hex-tiedosto
[[code]]
:1000000003308A00372B0000FF00030E8301A1009C
:100010000A08A0008A010408A2007708A300780853
:10002000A4007908A5007A08A60003170D08031399
:10003000A70003170F080313A80003170C080313E6
:10004000A90003170E080313AA00831383128C3030
:100050008400801E2D288C1A4E2822088400230834
:10006000F7002408F8002508F9002608FA002708F8
:1000700003178D000313280803178F0003132908A3
:1000800003178C0003132A0803178E00031320089C
:100090008A00210E8300FF0E7F0E09008A110A12CA
:1000A00051288C1E51281808AB001A08F800AB1C08
:1000B0005B28181218167808C1002C188628AC1C6A
:1000C00079283208B20A2D3E84008313410880004B
:1000D0003208043C03186E28AC10B2014108243CDD
:1000E000031D78282C142D303207840083138001DF
:1000F00086284108233C031D8628AC14B20132082F
:10010000B20A2D3E84008313410880008C128A11AC
:100110000A122D288A068A27C81947224F10D23280
:10012000EC32F630733AE130EE37F4346E102000E2
:10013000B2192D35EF3AEC3AAD1836000D340A34C9
:100140004F3468346A3461347534733473346134D1
:100150006E346F346D3461342034233431343134AF
:10016000243420346D346F346C3465346D346D3424
:100170006134743420347034E434E4346C346C34DA
:100180006534203420342034203400340D054F34BD
:10019000EA30F539F330EE37ED30A0113018241085
:1001A000ED37EC32ED36613A2038EF347310201021
:1001B00000000D22613AE11EA53900000D396536B7
:1001C000E518BD126410F232EC32B21E2532201056
:1001D00000110B08B6008B13831603178C170C1431
:1001E0000000000083120313B61B8B1703170C08C3
:1001F0007F3903193F290313B60003170D080313B2
:10020000B70003170F080313B80036080C1E0629A1
:100210009900370803178D000313380803178F0060
:1002200003130B08B9008B13831603178C170C14D8
:100230000000000083120313B91B8B1703170C0D6A
:100240000E0D7F3903193F290313B60003170D085C
:100250000313B70003170F080313B80036080C1E6A
:100260002F299900370803178D0003133808031747
:100270008F008D0A03198F0A0313E928031703134C
:1002800008000A300C1E422999006430B60036304E
:1002900084008313000803195E290230F800BF3080
:1002A000F7006400F70B5129F80B4F299630F7003F
:1002B000F70B58295B296400800B4D298A300317FE
:1002C0008D0000308F000313E920983003178D0054
:1002D00000308F000313E9209E3003178D0000309B
:1002E0008F0003130B08B6008B13831603178C17AC
:1002F0000C140000000083120313B61B8B170317A6
:100300008C0803199B290D080313B60003170F0867
:100310000313B70003170C0803130C1E8D29990053
:10032000360803178D000313370803178F008D0A53
:1003300003198F0A7129C6308D0000308F00031316
:10034000E9208A110A12642B831603170908C039A1
:10035000890003131F129F12003003178800031334
:100360000108C7390F38810035308312900094128C
:10037000B5123508831687008312351635088316A3
:1003800087008312B5113508831687000130831268
:100390009400003083169400F030831297059D0579
:1003A00000308316860083120317881303139412F8
:1003B0000317870188018901831603138C16C03047
:1003C00083128B04F830831686008312061483167A
:1003D0008600831286148A110A12652B0B08B90055
:1003E0008B13831603178C170C1400000000831264
:1003F0000313B91B8B170318262A03170C087F3920
:100400000313B90003170D080313BA0003170F08ED
:100410000313BB0039080C1E0B2A99003A08031776
:100420008D0003133B0803178F0003130B08BC0058
:100430008B13831603178C170C1400000000831213
:100440000313BC1B8B17B80B262A462A03170C0D67
:100450000E0D7F390313B90003170D080313BA00FB
:1004600003170F080313BB0039080C1E352A990027
:100470003A0803178D0003133B0803178F008D0AFA
:1004800003198F0A03100313B80BEE2908003F0865
:10049000F8013E0203184F2A3E08F7005B2AF701D5
:1004A0000830C000BE0DF70D3F0877020318F700B3
:1004B000F80DC00B522A08002030391E3030BA0027
:1004C0003808F700B81F6C2AF709F70A7708B80050
:1004D0002D30BA00B91739143808BE006430BF0097
:1004E00047227708B80030307807BB003808BE00D4
:1004F0000A30BF00472230307707BD003030780720
:10050000BC003A08F70030303B0203198B2AB914BB
:10051000B91B39159F2A3A08BB002030BA00303089
:100520003C020319972A3914B91BB9149F2A031DD9
:100530003914031D9F2A3B08BC002030BB00391929
:10054000A62AB918AA2A3918AE2AB22A3A080C1EC5
:10055000A72A99003B080C1EAB2A99003C080C1EE8
:10056000AF2A99003D080C1EB32A99000800D93023
:1005700003178D0000308F00031006300313B800FE
:10058000EE212D308400831380080319DA2AB90183
:100590000408B8003910831B391400080C1ECE2A39
:1005A000990038088400831339188317840A0319C3
:1005B000850AC42A2D08233C031D2A2B30302E0225
:1005C000B60030302F02B7003008243C031D2A2B20
:1005D000B6080319F12AF830831686008312061034
:1005E000F62AF8308316860083120614B70803191A
:1005F000FF2AF8308316860083128610042BF83009
:100600008316860083128614DE3003178D000030B7
:100610008F00031007300313B800EE213608B8002E
:100620001830B9005C22E23003178D0000308F00D3
:10063000031407300313B800EE213708B800183050
:10064000B9005C2220300C1E232B990020300C1E98
:10065000272B99008A110A12692B2C10AC10B201B9
:1006600083168C1683128C128A110A126A2B0308C5
:100670001F398300713083168F0090010F08831299
:10068000AB018316031787110C3003139900A230B6
:1006900098009030831298002C10AC10B401B30174
:1006A000FF30B500831603170908C039890003130A
:1006B0001F129F12003003178800831287018801E0
:1006C0008901831303134129A42964002C1C6A2B7C
:0806D000B72A2D2B652B6300F6
:04400E00AC2C0007CF
:00000001FF
;PIC16F886
;CRC=DF8C CREATED="23-joulu-16 00:14"
Joku kysyi onko PIC:lle valmiita piirilevyjä.
En tiedä muista mitään, mutta minulla on ainakin.
Tässä kuvassa on muutama.
Tässä on ensimmäinen testilaite. Sillä varmistettiin, että softa toimii.
Tässä on 5 voltin rele Rayex R1-1A0500 10VA. Näitä releitä on diodilla tai ilman, siksi prosessorin nastoihin on laitettu diodit. Tosin PICeissä on joka nastassa diodit jo valmiina käyttöjännitteeseen, joten diodeita ei oikeastaan tarvita.
Kun selasin piirilevyjäni, löysin sieltä muutamia sopivia.
Sopisikohan nämä ?
OH3GDO
page revision: 30, last edited: 23 Dec 2016 19:09