Morroc писал(а):Можно библиотеку еще взять
«CyberLib», работает быстро, пробовал в ней работать. Но все же медленней чем прямая команда.
С прерываниями работал мало, но проблем не было, даже Attiny13 все заработало. Код тоже можно сделать небольшого объема. Пример кода на Attiny13 (готовый инфракрасный пульт). Сравните с кодом на pic12 (прикреплен внизу.
)
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include <avr/wdt.h> // здесь организована работа с ватчдогом
ISR (WDT_vect) // что выполнить после прерывания
{
WDTCR =0b01000000;// разрешаем прерывания по ватчдогу. Иначе будет резет.
}
//____________________________________
void p()// подпрограмма разрешение прерывания сторожевым таймером WDTCR
{
wdt_reset();
wdt_enable(WDTO_1S);
WDTCR =0b01000000;
sei();
}
void slip()// подпрограмма сон
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
//sleep_disable()
}
//_____________________________________
int main( )
{
DDRB=0B010000;
while(1)
{
if (PINB==0B0001111){p(); }// будет прерывание сна
//после прерывания выполнится проверка клавиш, если клавиша нажата выполнится подпрограмма в это время
// прерывания отключены
if (PINB==0B001110){k1();}
if (PINB==0B001101){k2();}
if (PINB==0B001011){k3();}
if (PINB==0B000111){k4();}
if (PINB==0B001100){k5();}
if (PINB==0B001010){k6();}
if (PINB==0B000110){k7();}
if (PINB==0B001001){k8();}
if (PINB==0B000101){k9();}
slip();// подпрограмма сон
}
return 0;
}
//____________________________________________
void bt1()// генерация 1
{
delayMicroseconds(1000);
for(int n=0; n<=31;n++){gen();}
}
void bt0()// генерация 0
{
for(int n=0; n<=31;n++){gen();}
delayMicroseconds(1000);
}
void gen()//генерация импульсов, время подбирается повторением
{
PORTB=0B010000; PORTB=0B010000; PORTB=0B010000; PORTB=0B010000;
PORTB=0B010000; PORTB=0B010000; PORTB=0B010000; PORTB=0B010000;
PORTB=0B010000;PORTB=0B010000;
PORTB=0B000000;PORTB=0B000000; PORTB=0B000000;PORTB=0B000000;
PORTB=0B000000;PORTB=0B000000; PORTB=0B000000;PORTB=0B000000;
PORTB=0B000000;PORTB=0B000000;
}
void k1(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt0();bt0();bt0();bt0();bt0();bt1(); delay(500);}
void k2(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt0();bt0();bt0();bt0();bt1();bt0(); delay(500);}
void k3(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt0();bt0();bt0();bt1();bt0();bt0(); delay(500);}
void k4(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt0();bt0();bt1();bt0();bt0();bt0(); delay(500);}
void k5(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt0();bt1();bt0();bt0();bt0();bt0(); delay(500);}
void k6(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt1();bt0();bt0();bt0();bt0();bt0(); delay(500);}
void k7(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt1();bt0();bt0();bt0();bt0();bt1(); delay(500);}
void k8(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt1();bt0();bt0();bt0();bt1();bt0(); delay(500);}
void k9(){ bt1();bt1();bt0();bt0();bt0();bt0();bt0();bt1();
bt1();bt0();bt0();bt1();bt0();bt0(); delay(500);}