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) :
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.
- 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.