Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR III. rész
Nyolc lábbal AVR III. rész
Szerző: Topi, ZsirosDani, idő: Nov 29, 2008, Olvasva: 44130, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   3 / 5

Egyik barátomat, most őrjítem be éppen az AVR-ekre. Nagyon tetszik neki, a kezdethez képest, már határozott a javulás, és pozitív a tendencia is.

Mikor úgy gondoltam, hogy ideje komolyabb feladatot is "adni", rábíztam, hogy elkészítse a következő áramkört. Ezen az oldalon, az Ő leírását, és szoftverét találod.

Beköszöntött a tél. Íme, egy kapcsolás, ami segítségével megnézhetjük, hogy hány fok van a műhelyünkben:

A hőmérsékletmérést egy NTC végzi, mely karakterisztikája a mi mérési tartományunkban szinte lineáris, így egy feszültségosztóba építve már mérhetjük is a rajta eső feszültséget, mikrokontrollerünk A/D konverterének segítségével. Fontos, hogy a potmétert első használat esetén úgy állítsuk be, hogy az adott hőmérsékletnél a kijelzőn is ennek megfelelő érték jelenjen meg. A potméter egyik lábát egy ellenálláson keresztül kötöm a földre biztonsági okokból. A kijelzésről 2db 10-es LED BAR gondoskodik, ami a két soros latch kimenetére van kötve. A latcheket szoftveres "SPI" buszon tápláljuk adattal.

A kapcsoláson látható, hogy az output enable (/OE) a földön van. Nem szükséges processzorral kapcsolgatni, hisz soha nincs Tri-state-ben a latch, a kimenet mindig össze van kötve a LED-ekkel. A két latch sorba van kötve, tehát tetszés szerint bővíthetjük kapcsolásunkat további latchel (kaszkádolás). Ez hasznos lehet, ha spórolnunk kell processzorunk lábaival.

Következzék a forráskód, amiben használjuk a már korábbról jól ismert A/D konvertert. Letöltés: homero.zip

  1. #include <avr/io.h>
  2. #include "m_delay_10ms.h"
  3. #include "spiout.h"
  4. #include "admeasure.h"
  5.  
  6. //-------------------------------------
  7. void Init() {
  8. //-------------------------------------
  9.     DDRB   =  0b11111011;       //ADC PB2 bemenet, tobbi kimenet!
  10.     DIDR0 |=  (1<<ADC1D);        // ADC1D enable
  11. }
  12.  
  13. //-------------------------------------
  14. unsigned short CreateBar(unsigned char v) {
  15. //-------------------------------------
  16.  unsigned char i;
  17.  unsigned short val;
  18.  
  19.   val = 0;
  20.   for(i=0;i<v;i++) {
  21.         val |= 1;
  22.         val <<= 1;
  23.   }
  24.   return val;
  25. }
  26.  
  27.  
  28. //-------------------------------------
  29. int main(void) {
  30. //-------------------------------------
  31.     unsigned long adc = 0;
  32.     unsigned short tmp = 0;
  33.  
  34.     Init();
  35.     ADInit();
  36.  
  37.     for(;;)  {                        //végtelen ciklus
  38.         SPIReset();        
  39.         adc = MeasureADC(1);        //mérés ADC1-en
  40.         if(adc>=512) {
  41.             adc -= 512;    
  42.         }
  43.         else {
  44.             adc = 0;
  45.         }
  46.        
  47.         tmp = CreateBar(adc/32);     // 512/32 => 16 szegmens
  48.         SPIOut(tmp>>8);
  49.         SPIOut(tmp);
  50.         LatchOut();
  51.         m_delay_10ms(2);
  52.     }
  53.  }

A forráskódban 3 saját headert használtam, ezzel is átláthatóbbá téve a kódot.
A program az initek után 3 folyamatból áll:
1. Az analóg digitál mérésnél értékkel töltünk fel egy 2 bájtos változót.
Ha jobban megvizsgáljuk az ADCInitet láthatjuk, hogy a tápfeszültséget vesszük referencia feszültségként, ezáltal is szabaddá téve egy lábat. Látható még, hogy teljes tápfeszültség esetén a változónk 1024-es értéket fog felvenni, fél tápfeszültség esetén 512-t.
2. A kapott változó tartalma még nem elégséges, hiszen ezt kiírva a latch-ekre, csak bináris számokat látnánk, ezért ezt még át kell alakítanunk olyan értékké amit kiküldve sorba tölti fel a LED BAR-unkat. Erre  hivatott a CreateBar függvény, ami egyszerű shift műveletekből áll, és ennek visszatérési értéke már az amit kapni szeretnénk.
3. Ezt az adatot küldjük ki a software-s SPI buszunkon két részletbe, ugye a két latch miatt (először a felső 8, majd az alsó 8 bit).
Az spiout.h több függvényt is tartalmaz, ajánlom használatát mindenkinek, hiszen csak a #define-okban a megfelelő lábra kell állítani, és máris használható rengeteg AVR esetén.

Fontos, hogy mielőtt új adatot küldenénk a regiszterünknek reseteljük a regiszterét.
Miután kiküldtük SPIOut()-unk segítségével a változónk értékét még nem jelenik meg a latch kimenetén, hisz még csak a regisztereinkben várakozik az adat. Ezért szükséges meghívnunk az LatchOut() függvényünket.

Remélem, elnyeri tetszésedet a kapcsolás! Sikeres utánépítést kívánok! Ha bármi kérdés van, nyugodtan keress meg, igyekszem segíteni.

ZsírosDani


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