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
#include
#include
#define F_CPU 16000000UL // XTAL 16 MHz
#include
//*** 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<
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);
}
ความคิดเห็น
แสดงความคิดเห็น