เทคนิคการขยาย Port Output ด้วย Shift Register

สำหรับ MCU เบอร์เล็กๆ ที่มีขา I/O ไม่มากนัก เช่น 89C2051 ถ้าเราต้องการขยาย Port แบบ Output ให้ได้เยอะๆ เช่นต้องการจะต่อ 7 Segment ซัก 30 ตัว ถึงจะใช้วิธี Scan Display ก็เถอะ ลองคำนวนดู ใช้ 8 bit สำหรับ data 7 segment และในแต่ละตัวก็ต้อง มีขา Common อีก สรุปว่าคงไม่พอครับ

เทคนิคหนึ่งที่นิยมใช้ก็คือใช้ Shift register ในการขยาย Port โดยเราจะใช้ขา data เพียง 3 ขาเท่านั้น Clock, Data,Strobe IC แต่ละผู้ผลิตอาจจะตั้งชื่อขาสัญญาณแตกต่างกันไปบ้างแต่หลักการเดียวกัน โดย Data จะส่งไปพร้อมกับ Clock หรือที่เรียกการส่งข้อมูลแบบนี้ว่า Synchronous

การต่อสาย 74HC595 แบบอนุกรมหลายตัว

IC ที่นิยมนำมาใช้จะเป็นเบอร์ที่ลงท้ายด้วย 595 เช่น 74HC595, 74LS595, TPIC6B595(Open Collector) การต่อใช้งานขา Data จาก MCU จะต่อเข้ากับ Data in ของตัวที่ 1 และ Data Out ของตัวที่ 1 จะต่อเข้ากับ Data in ของตัวที่ 2 เป็นอย่างนี้ไปเรื่อยๆจนถึงตัวสุดท้าย Data Out ของตัวสุดท้ายจะไม่ถูกต่อ

IC Shift register ตระกูล 595

สำหรับ Code ตัวอย่างนี้ สามารถนำไปประยุกต์ใช้ได้ทุกตระกูล MCS51, AVR, PIC หรือตระูกูลอื่นๆ

อธิบายฟังก์ชัน

Code นี้ต่อ 74HC595 ไว้ 4 ตัวอนุกรมกัน ใน 1 ตัว ตัวแปร Hc595[0] แทน 74HC595 ตัวที่ 1 ไปเรื่อยๆ จนถึง Hc595[3] แทน 74HC595 ตัวที่ 4 การเขียนข้อมูลในแต่ละ byte จะใช้ฟังก์ชัน void wrport8 (unsigned char dat) การส่งข้อมูลไปยัง 74HC595 ทั้ง 4 ตัวใช้ฟังก์ชัน void wrport() เริ่มจาก ให้ OE595 และ STR เป็น “0″ จากนั้นก็ส่งข้อมูล Hc595[0]…Hc595[3] ตอนนี้ข้อมูลจะถูกเก็บไว้ใน D-flipflop ใน 74HC595 แล้ว แต่ยังไม่ถูกส่งออกมายัง Port ข้อมูลจะถูกส่งออกมายัง Port หลังจากส่ง Pulse ไปยัง STR

Code Example

#define SCK_DDR ??DDRB.3??//????????????
#define SDO_DDR ??DDRB.2??//
#define STR_DDR ??DDRB.1??//??
#define OE595_DDR ??DDRB.0??//??#define SCK ???PORTB.3??//
#define SDO ???PORTB.2??//??
#define STR ???PORTB.1??//?????
#define OE595 ???PORTB.0??//??

//—————————————————————————
// Write serial data
//—————————————————————————
void wrport8 (unsigned char dat)
{
?unsigned char cnt,a;
?for (cnt = 0;cnt < 8;cnt++){
??if (dat & 0×80)
???SDO = 1;
??else
???SDO = 0;
??dat <<= 1;
??a = 5;?while(a)?a–;
??SCK = 1;
??a = 5;?while(a)?a–;
??SCK = 0;
?}
}
//—————————————————————————
// Write serial data
//—————————————————————————
void wrport()
{???????????
//?unsigned char a;
?OE595 = 0;
?STR = 0;

? ?wrport8(Hc595[0]);
?wrport8(Hc595[1]);
? ?wrport8(Hc595[2]);
?wrport8(Hc595[3]);?

?STR = 1;????
?STR = 1;?
?STR = 1;?
//?a = 10;?while(a)?a–;
?STR = 0;
}?

ใครมีพัดลมเหลือๆ สนใจเอามาทำป้ายไฟ LED ไหมครับ

ฝรั่งคนนี้ไม่ธรรมดาครับเอาพัดลมบ้านๆ มาประยุกต์ทำป้ายไฟ LED จากการใช้ Microcontroller ATMEGA8 สแกนแทนด้วยใบพัดพัดลมสแกน ใครสนใจทำ ลองดูเป็นไอเดียครับ

ATMEGA8 Oscilloscope

ATMEGA8 Oscilloscope ไอเดียดีครับจับเอา ATMEGA8 Microcontroller ราคาถูกตัวละไม่ถึงร้อย เขียนโปรแกรมส่งค่าออกทาง RS232 เป็น Oscilloscope แสดงผลที่จอคอมพิวเตอร์ สำหรับความถี่ต่ำๆ