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