logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Attiny2313][C] Usypianie Attiny2313 i modułu radiowego RFM12b

adammruk 18 Mar 2011 14:24 1128 0
REKLAMA
  • #1 9291462
    adammruk
    Poziom 16  
    Witam. Próbuję uporać się aktualnie z usypianiem procesora oraz modułu radiowego. Korzystam ze schematu http://loee.jottit.com/rfm12b_and_avr_-_quick_start . Do układu podłączona jest też klawiatura matrycowa, wciśnięcie któregoś klawisza wybudza procesor przez INT0, wysyłana jest paczka, i układ idzie spać. Z odłączonym modułem radiowym wszystko działa idealnie, podczas spania procesor pobiera katalogowe 0,3µA. Jednak z podłączonym modułem sytuacja wygląda tak:

    - wszystko się wybudza
    - wysyłana jest paczka
    - uśpienie procesora i modułu (poleceniem writeCmd(0x8200); )

    I teraz pobór prądu wynosi poniżej 1µA, ale zaczyna rosnąć, i po kilkunastu sekundach utrzymuje się na poziomie 22-26µA. Próbowałem różnych opcji, ale za każdym razem dzieje się to samo, ponadto na ten prąd wpływają też ruchy mojej ręki koło układu, np dotknięcie płytki czasami powoduje znowu rośnięcie prądu od 1µA.
    Jak ustabilizować pobór prądu? W nocie katalogowej RFM12b jest napisane że pobór może wynieść nawet 0,1µA.
    Poniżej fragment kodu (jest troszkę nieogarnięty, bo to jeszcze faza testów) :

    
    ISR(INT0_vect) 
    {
    	cli();
    		flaga_przerwania=1;
    	return;
    	
    } 
    
    void wyslij_klawisz()
    {
    			unsigned char a;
    			a=getkbd();
    			_delay_ms(2);
    			if(a==getkbd())
    			{
    
    				if(a>='1' && a<='9')
    				{
    					portInit();
    					rfSendChar(a);
    				}
    				while(getkbd()!='z');
    			
    				flaga_przerwania=0;
    				portInit();
    				writeCmd(0x8200);
    				writeCmd(0xC8FE);
    				writeCmd(0x0000);
    				port_init_gosleep();
    				set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    
      				 sei();   // wlaczenie przerwan
     			 
    				 sleep_mode();
        		}
    			return;
    }
    int main(void)
    {
    
    	unsigned char a='z';
    	set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
    	sbi(DDRB,3);	// portb.3 jako wyjscie - LED
    	cbi(DDRD,2);	// portd.2 (INT0) jako wejscie
    	
    	cbi(PORTB,3);	// LED OFF
    
    	MCUCR = 0x00;	// INT0 - poziom niski wywołuje przerwanie
    	GIMSK = 0x40; 	// odblokowanie przerwań od INT0 
    	portInit();
    	sei();			// globalne odblokowanie przerwan
    	port_init_gosleep();
    	while(1)
    	{	
    	
    		if(flaga_przerwania==1) wyslij_klawisz();
    
    	}
    
    }
    
    


    EDIT:

    Funkcja port_init_gosleep(); ustawia prawie wszystkie linie jako wejścia, a kilka pinów od klawiatury matrycowej tak, aby wciśnięcie czegokolwiek wywołało przerwanie.
  • REKLAMA
REKLAMA