ThaiEmbedded Search หาอะไรไม่เจอ Search ที่นี่

AVR

เทคนิคการขยาย 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;

Tags: , ,

Monday, October 20th, 2008 AVR, MCS-51, MCU, PIC No Comments

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

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

Tags: ,

Wednesday, October 15th, 2008 AVR No Comments

ATMEGA8 Oscilloscope

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

Tags:

Wednesday, October 15th, 2008 AVR No Comments
ข้อมูลในเวบนี้สงวนลิขสิทธิ์ตามพระราชบัญญัติคอมพิวเตอร์ ไม่อนุญาตให้ Copy ข้อมูลไปใช้เพื่อประโยชน์ส่วนตัว หากต้องการนำข้อมูลไปอ้างอิงกรุณาทำ Link กลับมายังบทความด้วย

Syndicate

เว็บไซต์อิเล็กทรอนิกส์-นานาสาระ AVRportal.com Mechatronics Blog