74HC595 กับ atmega328p ด้วยบอร์ด Arduino Uno


การใช้งานโมดูล SPI กับ IC74HC595

ตัวอย่างนี้แสดงให้เห็นถึงการนำบอร์ด Arduino Uno มาใช้งานโดยเขียนโค้ดด้วย AVR Studio 6.xx ด้วยโค้ดภาษา C ในรูปแบบของ AVR กับไมโครคอนโทรลเลอร์ AVR atmega328p

ทำไมถึงใช้บอร์ด Arduino Uno ไม่ใช่บอร์ดไมโครคอนโทรลเลอร์ atmega328p โดยตรง?

เพราะ ถ้าเป็นบอร์ด Arduino Uno เมื่อเขียนโค้ดเสร็จแล้วสามารถโหลดโปรแกรมได้ทันที และAVR Studio ได้เตรียมช่องทางนี้ไว้ให้ใช้งานแล้ว ซึ่งแตกต่างจากบอร์ดไมโครคอนดทรลเลอร์ atmega328p ที่จะต้องมีเครื่องโปแกรมควบคู่ด้วย วงจรแสดงดังรูป










โค้ดโปรแกรม

/*
 * Course    : AVR C Programming with Atmel Studio IDE
 * Company   : AppSoftTech Co.,Ltd.
 * WWW       : www.appsofttech.com
 *           : https://www.facebook.com/mcu.course
 * File      : LAB0801.c
 * Purpose   : Serial Peripheral Interface (SPI)
*/

#include              // AVR IO definitions
#include   // Use sbi(),cbi() function
#include       // Interrupt Service routine
#define F_CPU 16000000UL        // XTAL 16 MHz
#include          // header file delay loops

//*** Define SPI pins
#define DDR_SPI     DDRB        // DDRB reg
#define PORT_SPI    PORTB       // PORTB reg
#define PIN_DS      PB3         // Serial data input
#define PIN_SH_CP   PB5         // Shift register clock input
#define PIN_ST_CP   PB2         // Storage register clock input

#define nop         asm volatile("nop")

void spi_init(void);
void spi_write(uint8_t d);
void WriteData_IC74HC595(uint8_t dat);
void delay_ms(uint16_t i);     

/*
** AVR ATmega328 SPI PIN Connection **
AVR       :   74HC595
-----------------------------------
PB3/MOSI  :  DS         // Serial data input
PB2       :  ST_CP      // Storage register clock input
PB5/SCK   :  SH_CP      // Shift register clock input
GND       :  /OE        // Output Enable (Active low)
+5V       :  /MR        // Master Reset (Active low)
-----------------------------------

** NOTE 74HC595 ** 
 8-bit serial-in, serial or parallel-out shift
 register with output latches; 3-state  
       -------
 Q1  -|1   16 |- Vcc
 Q2  -|2   15 |- Q0
 Q3  -|3   14 |- DS
 Q4  -|4   13 |- /OE
 Q5  -|5   12 |- ST_CP
 Q6  -|6   11 |- SH_CP
 Q7  -|7   10 |- /MR (Master RESET)
 GND -|8    9 |- Q7'
       -------
*/

//*** Main Functions
int main(void)
{       
  unsigned int i, rl=1;

  sbi(DDRC, 5);
  spi_init();
   
  while (1) {
    cbi(PORTC, 5);
    WriteData_IC74HC595(0xAA);
    delay_ms(500);
   
    sbi(PORTC, 5);
    WriteData_IC74HC595(0x55);
    delay_ms(500);
   
    rl = 1;
    for(i=0; i<8 br="" i="" nbsp="">      WriteData_IC74HC595(~(rl));
      rl = rl<<1 br="">      delay_ms(500);
    }
   
  }

  return 0;
}

//*** SPI Initialize
void spi_init(void)
{
  DDR_SPI = (1<  // SPI Master mode 0
  SPCR = (1<
  // Clear port
  cbi(PORT_SPI, PIN_DS);
  cbi(PORT_SPI, PIN_ST_CP);
  cbi(PORT_SPI, PIN_SH_CP);
}

//*** SPI Write data
void spi_write(uint8_t d)

  // Start transmission
  SPDR = d;
 
  // Wait for transmission complete
  while (!(SPSR & (1<    ;
}

//*** IC74HC595 Write data
void WriteData_IC74HC595(uint8_t dat)
{         
  spi_write(dat);
 
  sbi(PORT_SPI,PIN_ST_CP);
  _delay_us(1); 
  cbi(PORT_SPI,PIN_ST_CP);
  _delay_us(1);
}

//*** delay milliseconds function
void delay_ms(uint16_t i)
{
  for (; i>0; i--)
    _delay_ms(1);
}




ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

สร้างต้นคริสต์มาสด้วย JAVA

ฟังก์ชัน SerialEvent กับ Arduino

การใช้งาน PIC18Fxxxx กับ MPLAB X + XC8 ด้วย Peripheral Libraries (PLIBS)