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

Ilyen témájú kapcsolás úgy nagyjából a 70-es évek élején jelent meg az akkori nagybecsű Ezermester újságban. Aztán jöttek sorra a szebbnél szebb, egyszerűbbnél egyszerűbb, de szinte kivétel nélkül 4093-ra épülő kapcsolások.

Szonda korrózió elleni védelemmel megbolondítva, tovább az akkori minimal fogyasztásosnak számító kapcsolások láttak napvilágot.

Most, ezt az időt, pontosabban ezt a kapcsolást szeretném felidézni az azóta születettek kedvéért, melybe ugye magam is beletartozom.

Az áramkör ismertetése előtt, ám szükség van a mérési elv részletes ismertetésére is.
A mérés nem másból áll, mint az áramkör két szondája közötti vezetőképesség mérése. Ugye ellenállást mérni, messze komplexebb mint egy áramkörben kihasználni az adott közeg vezetőképességét. Mi is ezt tesszük. Az egyenáram a szondákba vezetve azt eredményezné, hogy szép lassan eloxidálódna, ugyanis elektrolízis megy végbe. Ennek kiküszöbölésére négyszögjellel hajtjuk a mérőszondákat.

A mérést egy soros RC tag végzi. C egy fix kapacitás, R pedig a föld és a kapacitás szabad kivezetése között lévő szondák által létrehozott ellenállás. Erre a kapacitásra négyszögjelet vezetve, kis ellenállás esetén (vizes föld) a négyszögjelünk "leharapásra" kerül a kondenzátor által (kimenő jel minimális) száraz növény esetén a kimenet egyre magasabb amplitúdójú négyszögjel. Egy szó mint száz, vizes föld nincs kimenő jel, száraz föld, van.

Energiatakarékosság is fontos szempont ugyanis elemről működünk. Ezt úgy oldjuk meg, hogy megismerkedünk az interruptokkal és a processzor sleep üzemmódjával. Idle üzemmódban a processzor áramfelvétele uA-es nagyságú. Adott időközönként megtörténik a mérés, ami idejére a processzor "felébred" mér, majd visszaalszik. Így egy CR2032-es lítium elem akár fél évig is szolgálhatja áramkörünket.

Az áramkör a következőket teszi. Ha a potméter által beállított szárazsági szintet eléri a föld (amibe a szondákat szúrtuk) akkor adott időközönként az áramkörön lévő kék led felvillan. Természetesen ilyenkor is, eltekintve a uA-es sleep közbeni fogyasztástól, csak a LED világítás és mérés idejére van áramfelvételünk.

A hozzávaló forráskód pedig a következő:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4. #include <avr/sleep.h>
  5.  
  6. #define LED_ON()    PORTB |=  (1<<PB1);
  7. #define LED_OFF()    PORTB &= ~(1<<PB1);
  8.  
  9. //-------------------------------------
  10. void m_delay_10ms(unsigned long val) {
  11. //-------------------------------------
  12.            while(val--) _delay_ms(10);
  13. }
  14.  
  15. void OutputEnable() {
  16.     //Timer0 init - 2KHz-es mérőjel timer, OC0A-n CTC-vel
  17.     TCCR0A = (0<<COM0A1)
  18.            | (1<<COM0A0)    //Toggle on A
  19.            | (1<<WGM01)
  20.            | (0<<WGM00);    //CTC mód
  21.     OCR0A  = 0x02;            //minden második = ~ 2KHz
  22.  
  23.     TCCR0B = (1<<CS02)
  24.            | (0<<CS01)
  25.            | (0<<CS00);        //~3,9KHz
  26.  
  27. }
  28.  
  29. void OutputDisable() {
  30.     //Timert kikapcsoljuk, ne fogyasszon
  31.     TCCR0A = 0x00;
  32.     TCCR0B = 0x00;
  33. }
  34.  
  35. //-------------------------------------
  36. int main() {
  37. //-------------------------------------
  38. uint8_t i;
  39. uint8_t szaraz = 0;
  40.     //init
  41.     DDRB  = (1<<PB1)|(1<<PB0);
  42.     set_sleep_mode(SLEEP_MODE_IDLE);    //idle energiatakarékos mód
  43.     //Timer1 init - Ez az ébresztő "óra"
  44.     TCCR1 = (1<<CS13)
  45.           | (1<<CS12)
  46.           | (1<<CS11)
  47.           | (0<<CS10);    //8192
  48.     GTCCR = 0x00;
  49.     TIMSK = (1<<TOIE1);    //Csak Timer1 Owerflow Interrupt
  50.  
  51.  
  52.     sei();                    //SEt Interrupts (Globál interrupt bekapcs)
  53.  
  54.     for(;;) {
  55.         //indul a mérés
  56.         OutputEnable();
  57.         _delay_us(60);
  58.         i=10;
  59.         szaraz = 0;
  60.         while(i--) {
  61.             szaraz |= (PINB & (1<<PB2));
  62.             if(szaraz) break;
  63.             _delay_ms(0.1);
  64.         }
  65.         OutputDisable();
  66.  
  67.         if(szaraz) LED_ON();//bekapcsoljuk ha száraz
  68.         m_delay_10ms(10);    //100ms villanas
  69.         LED_OFF();            //ki, ha szaraz, 100ms-et villan
  70.  
  71.         sleep_mode();    //Hajrá, menjünk aludni
  72.     }
  73.    
  74. }

Timer1 az a timer ami felébreszti a processzort, úgy nagyjából 2 mp-enként. Pontosan 255/1000000/8192 = 2.08896 másodpercenként

Mivel semmi fizikailag megírt interruptja nem kell, így elég a TCCR1-el bekapcsolni az előosztást és az interruptot a TIMSK-ban engedélyezni. Ez már felébreszti majd a processzort.
Azért kell a kimeneti négyszögjel generátort kikapcsolni, mert az is feleslegesen fogyaszt, 100uA-eket. Továbbá fontos, hogy a Timer0 mérőjel generáló timer már nem fut, mikor a led felvillan. Ez is csökkenti a felesleges fogyasztást.

A program végrehajtás, a sleep_mode() függvény meghívásakor felfüggesztődik, majd mikor az interrupt életbe lép, ami felébreszti a processzort, onnan folytatja a parancs végrehajtást.

Fontos! Programozásnál állítsuk be a CLKDIV8 bitet, és a projekt beállításainál az órajelet vegyük le a 8-al való osztásnak megfelelően, tehát 1 000 000 Hz-re! Előfordul programozásnál, hogy az 1MHz-es órajel már túl alacsony a program beégetéséhez, tehát tegyük a következőt:
- Fordítsuk le a programot, az előbb említett projekt beállításokkal.
- Égessük be a programot
- Majd menjünk a biztosíték bitekre (Fuses) és ekkor, programozás után kapcsoljuk csak be a CLKDIV8-at.
- Újra programozás esetén pedig előbb Fuse kikapcs, majd programoz, és fuse újra bekapcs.

Figyeld meg, hogy a kimenet, tehát amire a potméter van kötve, egy speciális funkcióval bír. Ez az OC0A kimenet, tehát a Timer0 Compare A kimenete. CTC mód esetén, amikor a számláló eléri a OCR0A-ban beállított értéket, a kimenet állapotot vált, a beállításoknak megfelelően, majd nullázódik a timer. Ez a folyamat a CTC mód, melyről egy jól szemléltető ábra található az adatlapban, ami ugye megint megnyitva ott van előtted.

Bővebb leírása az adatlapban található, így nem térek ki rá sokkal bővebben.

Nah... Csak lehet értelmes dolgokat is építeni


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