Példa 74HC595-tel
Az alábbi ábrán látható a példakapcsolás vázlata:
Így néz ki próbapanelen összerakva:
Az AVR programja elég egyszerű. Az SPI beállítása után (SPI engedélyezése, Master mód, legmagasabb helyiértékű bit küldése először, órajel alapállapota a logikai alacsony szint, bejövő adatbitek mintavételezése az órajelimpulzus felfutó élénél, 0.45MHz-es SPI frekvencia), létrehozok egy SPI_74HC595_Write() függvényt, ami:
- A 74HC595 SS lábát alacsonyra kapcsolja (SPI aktiválása)
- A küldnedő adatbájtot beírja az SPDR regiszterbe
- Várakozik amíg az adattranszfer befejeződik. Amikor a Master-Slave közötti adatáramlás befejeződött, akkor az SPI állapotregiszterben (SPSR) az SPI megszakításjelző bit (SPIF) értéke logikai 1 lesz, ezért ezen bit értékének a vizsgálatával várakozhatunk addig, amíg a Master és a Slave közötti adatáramlás befejeződik.
- A kiírandó adatbájt elküldése után az74HC595 SS lábát magasra kapcsolja (elküldi a latch jelet), hogy a 8 bites shift regiszterben lévő adatot a kimenetekre kapcsolja.
Ezt a függvényt használom fel arra, hogy a LED-ekre kiírjam a futófényt létrehozó mintázatot, amit úgy állítok elő, hogy létrehozok két 8-as ciklust amiben a cnt változó tartalmát biteltolással mindig egy hellyel először balra, majd jobbra léptetem.
/*****************************************************************
// Fajlenev : 74HC595.c
// Verzio : 1.0
// Leiras : SPI hasznalata 74HC595 8-bites shift regiszterrel
// 2011 Majus 14.
******************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_74HC595_CS PB2 // 74HC595 SPI-t aktivalo Chip Select lab
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
void SPI_74HC595_Write(unsigned char adatki)
{
// 74HC595 SPI bekapcsolasa (CS lab logikai alacsony szint)
SPI_PORT &= ~(1<<SPI_74HC595_CS);
_delay_us(1);
// Adattranszfer elinditasa (MOSI)
SPDR = adatki;
// Varakozas amig az adattranszfer befejezodik
while(!(SPSR & (1<<SPIF)));
// 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
SPI_PORT |= (1<<SPI_74HC595_CS);
}
int main(void)
{
unsigned char cnt;
// AVR ATMega8 SPI periferia beallitasa
// MOSI es SCK kimenet, a tobbi bemenet
SPI_DDR = (1<<PB3)|(1<<PB5)|(1<<PB2);
// SPI engedelyezese, Master mod, SPI orajel beallitasa
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
// 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
SPI_PORT |= (1<<SPI_74HC595_CS);
// 74HC595 shift regiszter reszetelese
SPI_74HC595_Write(0);
for(;;)
{
cnt=1;
while(cnt)
{
cnt=cnt<<1;
SPI_74HC595_Write(cnt);
_delay_ms(500);
}
cnt=0x80;
while(cnt)
{
cnt=cnt>>1;
SPI_74HC595_Write(cnt);
_delay_ms(500);
}
}
return 0;
}
A képre kattintva megnézhető egy kis videó a végeredményről:
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!