Page 252 - Journal451
P. 252

วารสารราชบััณฑิิตยสภา
                                        ปีีที่่� ๔๕ ฉบัับัที่่� ๑ มกราคม-เมษายน ๒๕๖๓
           240                         การแลกเปล่�ยนข้้อมููลแบบอนุกรมูโดยใช้้สายสัญญาณ ๒ เส้นระหว่่างไมูโครคอนโทรลเลอร์


           ๑ บิตัเท่านี้ั�นี้ และเม่�อได้รับข้้อมูลครบ ๘ บิตั (๑ ไบตั์) แล้ว ก็แสดงผลข้้อมูลนี้้�ผ่านี้ช้่องทาง B ข้องวงจร

           รวม 8255 (2) เพี่�อจะได้สังเกตัและแก้จุดบกพีร่อง (debug) ในี้ซึ่อฟตั์แวร์หากปรากฏว่าข้้อมูลท้�ได้รับ

           ไม่ตัรงกับข้้อมูลด้านี้ตั้นี้ทาง

                   //Page 1/4 of Fig. 7               //Page 2/4 of Fig. 7

                   //Serial-data exchange using interrupt    void ShwSnd(unsigned char ch0, unsigned char
                   //between uC PIC16F627A and uC 8088   snd) //display then send a data byte
                   //Program name: PIC16FIT.C         {  PORTA = (ch0 & 0x0F) << 1;
                   //Date: July 8, 2019                  PORTB = ch0 & 0xF0;  //display data
                   //To be used with PIC16F627A at 4 MHz      if (snd !=0) senbyt(ch0);  //send 8-bit data
                   //use MikroC IDE to compile and link      Delay_ms(200);
                   //with _XT_OSC = $3FED in Project configuration      PORTA = 0x00; PORTB = 0x00; //turn off LEDs
                   //put PIC16FIT.HEX into PIC16F627A by using      Delay_ms(200);
                   //WinPic software with Config Word#1 = 3F69 and   } //end ShwSnd
                   //Config Word#2 = 3FFF in "Device Config" pane   //*******************************************
                   //RA7-RA5 = inp; RA4-RA0 = out
                   //RA4-RA1 used for low nibble display via LEDs   void main()
                   //RA4 needs a pull-up resistor.    {
                   //RA0: output INT -> pin IR7 of 8259 on uC 8088   //Config I/O ports
                   //RB0: input INT <- pin PC3 of uC 8088      CMCON = 0x07; //PortA = digital I/O
                   //RB7-RB4 used for high nibble display via LEDs      TRISA = 0xE0; //RA7-RA5=inp; RA4-RA0=out
                   //RB3 used for debugging              TRISB = 0x07; //RB7-RB3=out; RB2-RB0=inp
                   unsigned char ch, ch0, ch1, ch2=0x00;
                   unsigned char IntFlg=0, XmtFlg=0;   //Config RB0/INT pin for interrupt
                   unsigned char buf[16];                INTCON = 0B10010000;
                   int cnt, cnt1, dcnt, ecnt; //data counts      //GIE=1 + INTE=1 => enable INT on RB0
                   int dcnt1, ecnt1;                     OPTION_REG = 0B01000000;
                                                         //INTEDG=1 => rising edge trig.
                   void senbyt(unsigned char); //send a byte
                   //*******************************************   //Display 5 cycles of On-Off lights on RB3
                   void lolev(void)                      for (cnt=0; cnt < 5; cnt++)
                   {  PORTA.F0 = 0; //RA0=lo => zero level      {
                      Delay_ms(1);                         PORTB.F3 = 1; Delay_ms(200);
                   } //end lolev                           PORTB.F3 = 0; Delay_ms(200);
                   //*******************************************      } //end for
                   void hilev(void)
                   {  PORTA.F0 = 1; //RA0=hi => one level   //reset counters
                      Delay_ms(1);                       dcnt = 0; ecnt = 0; ecnt1 = 0;
                   } //end hilev                         IntFlg = 0; XmtFlg = 0; //reset flags
                   //*******************************************
                   void zrobit(void) //Send "0" (1-0-0) bit   //Send "0" bit to 8088, asking it to download
                   {                                     zrobit(); Delay_ms(50);
                      lolev();     //start from lo level
                      hilev();     //"1" => sync pulse      cnt1 = 0; //clear counter of wait time
                      lolev();     //"0"                 while(ecnt1 < 5) //before end of receive
                      Delay_ms(2); //"0" + delay         { Delay_ms(10);
                   } //end zrobit                          cnt1++; //count time
                   //*******************************************        if (cnt1==1000) break; //quit after 10 sec
                   void onebit(void) //Send "1" (1-1-0) bit      } //end while
                   {                                     Delay_ms(500);
                      lolev();     //start from lo level
                      hilev();     //"1"  => sync pulse   //Display all previously stored data
                      Delay_ms(1); //"1"                 if (ecnt1 == 5)
                      lolev();     //"0"                 for (cnt=0; cnt < dcnt1; cnt++)
                      Delay_ms(1); //delay               {  ch = buf[cnt];
                   } //end onebit                           ShwSnd(ch, 0);
                   //*******************************************         Delay_ms(250);
                   void senstrt (void) //send start bit         PORTB.F3 = 1; //pin RB3 LED on
                   {  lolev();                              Delay_ms(250); //wait 0.5 sec
                      hilev(); Delay_ms(2); //"1"+"1"+"1" pulses      }; //end for
                      lolev(); Delay_ms(1);
                   } //end senstrt                       IntFlg = 0; XmtFlg = 0;
                   //*******************************************      PORTB.F3 = 0; //pin RB3 LED off
                   void senstop (void) //send stop bit      Delay_ms(1000); //wait 1 sec
                   {  lolev();
                      hilev();     //”1” => sync pulse   //Send "1" bit to 8088, asking it to receive
                      lolev();     //”0”                 onebit(); Delay_ms(50);
                      hilev();     //”1”
                      lolev(); Delay_ms(1); //”0”+“0”
                   } //end senstop
                   //*******************************************

             ภาพท่� ๗  ซึ่อฟตั์แวร์การแลกเปล้�ยนี้ข้้อมูลแบบข้ัดจังหวะข้องไมโครคอนี้โทรลเลอร์ PIC16F627A
   247   248   249   250   251   252   253   254   255   256   257