В общем, вот. Тестировал в Протеусе, работает.
Логика следующая: программа проверяет PD5. Когда на этой ножке появляется лог. 1, программа
для верности ждет, пока оная пропадет, и только тогда включает/выключает основную часть (изначально все выключено). Т.е., у телефона лучше всего
отключить сигнал звонка, а на SMS поставить сигнал покороче. Соответственно, управлять SMS-кой.
Основная часть просто раз в секунду копирует значение из массива effect_data в PORTB до тех пор, пока не встретит конец массива, потом все повторяется с начала. Поскольку PB0 не используется, я оставил значение 0x01 как маркер конца массива. Так что записывайте в массив то, что нравится, и наслаждайтесь (сейчас там простой бегущий огонек).
Можно было бы написать и оптимальнее, но я решил сместить акцент в сторону понятности, чтобы у Вас был шанс самостоятельно разобраться в коде.
Код расчитан на настройки тактирования МК по-умолчанию (1МГц), ибо заставлять Вас разбираться с фьюз-битами было бы бесчеловечно.
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdint.h>
#define SEQ_END 0x01
volatile uint8_t run_allowed=0;
//This array contains effect stages
//modify to your own needs
const uint8_t effect_data[] PROGMEM = {
0x02,0x04,0x08,0x10,0x20,0x40,0x80,SEQ_END
};
ISR (TIMER1_COMPA_vect)
{
static uint8_t i=0;
uint8_t v;
TCNT1=0;
if (run_allowed)
{
v=pgm_read_byte(&(effect_data[i]));
if (v!=SEQ_END)
{
PORTB=v;
i++;
}
else
i=0;
}
else
{
i=0;
PORTB=0;
}
}
void main(void)
{
TCNT1=0; //Initial timer value is zero
OCR1A=0x3D09; //This will give 1Hz interrupt @ 1MHz clock
//(default for ATtiny2313)
TIMSK=(1<<OCIE1A); //Interrupt on compare A match
TCCR1B=(1<<CS11) | (1<<CS10); //Starting timer at F_CPU/64
DDRD&=~(1<<PD5); //PD5 is on/off signal input from phone
DDRB=0xFF; //PORTB drives outputs, so all pins to output mode
sei();
while (1)
{
if (PIND & (1<<PD5)) //Wow, call/SMS!
{
while (PIND & (1<<PD5)); //Waiting for signal end to prevent surprises
run_allowed=!run_allowed; //Switching all thing ON/OFF
}
}
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.