Książkę zakupiłem niedawno i nie doczytałem wszystkiego. Co do wymienionych punktów:
1. nie wyświetlam niczego na lcd to jest komenda do wyłączenia lcd, która jak się okazało jest zbędna.
2. do odczytu eeproma w przerwaniu się przyznaję, nie wiem dlaczego to tam umieściłem. Co do funkcji odczytu to korzystam z wbudowanych plus makro:
Kod:
#define eeprom_rb(addr) eeprom_read_byte ((const unsigned char *)(addr))
#define eeprom_wb(addr, val) eeprom_write_byte ((unsigned char *)(addr), (unsigned char)(val))
w zasadzie zbędne i dobrze że zwrócił kolega na to uwagę. Część obecnego kodu pochodzi sprzed roku i ten fragment akurat jest zaczerpnięty gdzieś z sieci.
3. też się zgodzę.
Reasumując - dlatego właśnie kupiłem tą książkę. Jak się okazało problem nie tkwił w ustawieniach przerwań od int0 a w samej funkcji wyłączającej/załączającej LCD (korzystam z bibliotek radzia). Co do funkcji SuperDebounce to na pewno skorzystam i przeanalizuje przy okazji realizacji nowego projektu.
Teraz jest ok poza jedną rzeczą. Przy pierwszym wciśnięciu klawisza onoff usypia się od razu, natomiast po wybudzeniu i kolejnym wciśnięciu trzeba przycisk trzymać już znaczny czas, nie wiem skąd to się bierze.
Kod:
void after_stby(void)
{
GICR|=(0<<INT0);//wyłączenie zezwolenia na przerwanie od int0
pwm=eeprom_read_byte( (uint8_t *) 0x09);
}
ISR(INT0_vect)
{
after_stby();
}
Kod:
if(onoff_p)
{
_delay_ms(30);
if(onoff_p)
{
GICR|=(1<<INT0);//zezwolenie na przerwanie od int0
LCD_Clear();
sbi(buz_port,buz_bit);
_delay_ms(20);
cbi(buz_port,buz_bit);
pwm=0;//wylączenie podświetlenia lcd
_delay_ms(20);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);//
sleep_mode();
}
}