Fórum témák

» Több friss téma
Cikkek » SPI használata AVR-rel
SPI használata AVR-rel
Szerző: Fizikus, idő: Jún 13, 2011, Olvasva: 32118, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   5 / 8

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:

  1. A 74HC595 SS lábát alacsonyra kapcsolja (SPI aktiválása)
  2. A küldnedő adatbájtot beírja az SPDR regiszterbe
  3. 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.
  4. 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.

  1. /*****************************************************************
  2. //  Fajlenev : 74HC595.c
  3. //  Verzio   : 1.0
  4. //  Leiras   : SPI hasznalata 74HC595 8-bites shift regiszterrel
  5. //  2011 Majus 14.
  6. ******************************************************************/
  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9.  
  10. #define SPI_PORT PORTB
  11. #define SPI_DDR  DDRB
  12. #define SPI_74HC595_CS  PB2 // 74HC595 SPI-t aktivalo Chip Select lab
  13. #define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
  14.  
  15. void SPI_74HC595_Write(unsigned char adatki)
  16. {
  17.   // 74HC595 SPI bekapcsolasa (CS lab logikai alacsony szint)
  18.   SPI_PORT &= ~(1<<SPI_74HC595_CS);
  19.   _delay_us(1);
  20.   // Adattranszfer elinditasa (MOSI)
  21.   SPDR = adatki;
  22.   // Varakozas amig az adattranszfer befejezodik
  23.   while(!(SPSR & (1<<SPIF)));
  24.   // 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
  25.   SPI_PORT |= (1<<SPI_74HC595_CS);
  26. }
  27.  
  28. int main(void)
  29. {
  30.   unsigned char cnt;
  31.   // AVR ATMega8 SPI periferia beallitasa
  32.   // MOSI es SCK kimenet, a tobbi bemenet
  33.   SPI_DDR = (1<<PB3)|(1<<PB5)|(1<<PB2);
  34.   // SPI engedelyezese, Master mod, SPI orajel beallitasa
  35.   SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  36.   // 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
  37.   SPI_PORT |= (1<<SPI_74HC595_CS);
  38.   // 74HC595 shift regiszter reszetelese
  39.   SPI_74HC595_Write(0);
  40.  
  41.   for(;;)
  42.   {
  43.     cnt=1;
  44.     while(cnt)
  45.     {
  46.       cnt=cnt<<1;
  47.       SPI_74HC595_Write(cnt);
  48.       _delay_ms(500);
  49.     }
  50.     cnt=0x80;
  51.     while(cnt)
  52.     {
  53.       cnt=cnt>>1;
  54.       SPI_74HC595_Write(cnt);
  55.       _delay_ms(500);
  56.     }
  57.   }
  58.   return 0;
  59. }

A képre kattintva megnézhető egy kis videó a végeredményről:


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem