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: 32108, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   7 / 8

Példa: SPI + MCP3202 + 74HC595

Az alábbi ábrán látható az MCP3202-es, 12 bites ADC IC-vel és egy potenciométerrel kiegészített kapcsolás vázlata:

A próbapanelen összerakott előző kapcsolást csak kismértékben kell kiegészíteni:

Az MCP3202-es IC olyan pici, hogy elbújik a potenciométer mögé. Ezen a képen jobban látható:

Az AVR programban az előző példánál használt SPI beállításokat használtam. Az SPI-t  kezelő utasításokat kiegészítem egy SPI_MCP3202_WriteRead() nevű  függvénnyel,  ami:

  1. Az MCP3202 IC SS lábát alacsonyra kapcsolja (SPI aktiválása)
  2. Az IC beállításához és a mérési adatok kiolvasásához szükséges 3 adatbájtot egymás után beírja az SPDR regiszterbe. Ezzel egy időben kiolvassa az SPDR regiszterből az MCP3202-ről érkező adatokat.
  3. A beérkezett adatokból előállítja az ADC  eredményt (a 2. fogadott adatbájtból kimaszkolja a felső 4 bitet majd a 2. és 3. fogadott adatbájtból összerakja az eredményt). Mivel az eredményt csak 8 db LED-del jelenítem meg, a 12 bites eredményt átkonvertálja 8 bit-esre (elosztja 16-al).
  4. Végül az MCP3202-es SS lábát magasra kapcsolja (SPI kikapcsolása).

Ezt a függvényt használom fel arra, hogy beolvassam a potenciométeren lévő feszültséget. A mért értéktől függően az előző példában használt SPI_74HC595_Write() függvénnyel különböző számú LED-et kapcsolok be.

  1. /*****************************************************************
  2. //  Fajlenev   : MCP3202.c
  3. //  Verzio     : 1.0
  4. //  Ismerteto  : SPI hasznalata MCP3202 ADC IC-vel
  5. //                  es 74HC595 shift regiszterrel
  6. //  2011 Majus 14.
  7. ******************************************************************/
  8. #include <avr/io.h>
  9. #include <util/delay.h>
  10.  
  11. #define SPI_PORT PORTB
  12. #define SPI_DDR  DDRB
  13. #define SPI_74HC595_CS   PB2 // 74HC595 SPI-t aktivalo Chip Select lab
  14. #define SPI_MCP3202_CS   PB1 // MCP3202 SPI-t aktivalo Chip Select lab
  15. #define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
  16.  
  17. void SPI_74HC595_Write(unsigned char adatki)
  18. {
  19.   // 74HC595 SPI bekapcsolasa (CS lab logikai alacsony szint)
  20.   SPI_PORT &= ~(1<<SPI_74HC595_CS);
  21.   _delay_us(1);
  22.   // Adattranszfer elinditasa (MOSI)
  23.   SPDR = adatki;
  24.   // Varakozas amig az adattranszfer befejezodik
  25.   while(!(SPSR & (1<<SPIF)));
  26.   // 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
  27.   SPI_PORT |= (1<<SPI_74HC595_CS);
  28. }
  29.  
  30. unsigned char SPI_MCP3202_WriteRead()
  31. {
  32.   unsigned char adatbe_h;
  33.   unsigned char adatbe_l;
  34.  
  35.   // MCP3202 SPI bekapcsolasa (CS logikai alacsony szint)
  36.   SPI_PORT &= ~(1<<SPI_MCP3202_CS);
  37.   _delay_us(1);
  38.   // Adattranszfer elinditasa (MOSI)
  39.   SPDR = 0b00000001;
  40.   // Varakozas amig az adattranszfer befejezodik
  41.   while(!(SPSR & (1<<SPIF)));
  42.  // Adattranszfer elinditasa (MOSI)
  43.   SPDR = 0b10100000;
  44.   // Varakozas amig az adattranszfer befejezodik
  45.   while(!(SPSR & (1<<SPIF)));
  46.   // Beerkezett adat;
  47.   adatbe_h = SPDR;
  48.  // Adattranszfer elinditasa (MOSI)
  49.   SPDR = 0b00000000;
  50.   // Varakozas amig az adattranszfer befejezodik
  51.   while(!(SPSR & (1<<SPIF)));
  52.   // Beerkezett adat;
  53.   adatbe_l = SPDR;
  54.   // MCP3202 SPI kikapcsolasa (CS logikai magas szint)
  55.   SPI_PORT |= (1<<SPI_MCP3202_CS);
  56.   // A beerkezett adatokbol az ADC eredmeny eloallitasa
  57.   // A 12 bites eredmeny atkonvertalasa 8 bit-esre(osztas 16-al)
  58.   return (adatbe_l | (adatbe_h &= 0b00001111)<<8 ) / 16;
  59. }
  60.  
  61. int main(void)
  62. {
  63.   unsigned char kijelzo;
  64.   unsigned char adc;
  65.  
  66.   // AVR ATMega8 SPI periferia beallitasa
  67.   // MOSI es SCK kimenet, a tobbi bemenet
  68.   SPI_DDR = (1<<PB3)|(1<<PB5)|(1<<PB2)|(1<<PB1);
  69.   // MCP3202 SPI kikapcsolasa (CS logikai magas szint)
  70.   SPI_PORT |= (1<<SPI_MCP3202_CS);
  71.    // 74HC595 SPI kikapcsolasa (CS logikai magas szint)
  72.   SPI_PORT |= (1<<SPI_74HC595_CS);
  73.   // SPI engedelyezese, Master mod, SPI orajel beallitasa
  74.   SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  75.   // 74HC595 shift regiszter reszetelese
  76.   SPI_74HC595_Write(0);
  77.  
  78.     while(1)
  79.     {
  80.     // Az MCP3202-vel mert ADC ertek lekerdezese SPI-n keresztul
  81.       adc = SPI_MCP3202_WriteRead();
  82.     // A mert ertektol fuggoen kulonbozo szamu LED bekapcsolasa
  83.     if(adc<28)
  84.     { kijelzo = 0b00000000; }
  85.         else if(adc<56)
  86.         { kijelzo = 0b00000001; }
  87.         else if(adc<85)
  88.         { kijelzo = 0b00000011; }
  89.         else if(adc<113)
  90.         { kijelzo = 0b00000111; }
  91.         else if(adc<142)
  92.         { kijelzo = 0b00001111; }
  93.         else if(adc<170)
  94.         { kijelzo = 0b00011111; }
  95.         else if(adc<199)
  96.         { kijelzo = 0b00111111; }
  97.         else if(adc<227)
  98.         { kijelzo = 0b001111111; }
  99.         else
  100.         { kijelzo = 0b11111111; }
  101.     // A kivant mintazat kijelzese az 74HC595 shift regiszter-rel
  102.     SPI_74HC595_Write(kijelzo);
  103.       _delay_ms(100);
  104.   }
  105.   return 0;
  106. }

Erről is készítettem egy kis videót:


A cikk még nem ért véget, lapozz!
Következő: »»   7 / 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