Releohjaus

Kahden releen ohjaus 9600 baudilla.
Tietoliikenne on valmiina.

Releohjaus.jpg

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.

piirilevyja.JPG

Tässä on ensimmäinen testilaite. Sillä varmistettiin, että softa toimii.

Testilaite.JPG

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.

R2Relay.jpg

Kun selasin piirilevyjäni, löysin sieltä muutamia sopivia.
Sopisikohan nämä ?

PIIRILEVYJA1.JPG

OH3GDO

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License