07-12-2014, 06:52 PM
(Сообщение последний раз редактировалось: 07-12-2014, 06:56 PM БендеровецЪ.)
Ну наверное самое время попытатся считывать какой-нить пин.
Для этих дел у AVR микроконтроллеров есть регистры под названием PINx (PINA, PINB etc). Впринципе читать этот регистр можно в независимости от того сконфигурирован пин как вход или выход, но мы ж хотим таки вход.
Вобщем все те пины, для которых мы записали нули в DDRA регистр отсаются входами. Напомню:
#define DDRA_RESET_VALUE ( (1 << REL) + (1 << LED0) + (1 << LED1) + (0 << ADC_IN3) + (0 << ADC_IN2) + (0 << FAULT) + (0 << DC))
...
DDRA = DDRA_RESET_VALUE;
Далее, для каждого пина сконфигурированого как вход можно включить "слабую подтяжку", записав единице в соотв бит порта PORTA. Например возьмем пин под псевдонимом FAULT (он будет нашим входом на сегодня):
PORTA |= 1<<FAULT //так мы устанавливаем единственный бит в восьмибитно регистре.
Чтение из регистра PINA входа FAULT будет выглядить приблизитено вот так:
Что-то там = PINA & (1 << FAULT) // так мы наложили маску, и нам будет виден только интересующий нас бит
Для удобства делаем заготовку в .h фале:
#define READ_PIN_FAULT PINA & (1 << FAULT)
Читать пин можно по разному, "по полингу", по таймеру, по прирыванию.
В данном случае будет довольно просто вложить это в нашу обработку таймера таким образом:
int main(void)
{
DDRA = DDRA_RESET_VALUE;
PORTA |= (1 << REL) + (1 << LED0) + (1 << FAULT);
TCCR0A = TCCR0A_RESET_VALUE;
TCCR0B = TCCR0B_RESET_VALUE;
TIMSK0 = TIMSK0_RESET_VALUE;
while(1)
{
if (TIMER0_OF())
{
TIMER0_OF_RESET();
if (READ_PIN_FAULT)
PINA |= (1 << REL) + (1 << LED0);
}
}
}
Для этих дел у AVR микроконтроллеров есть регистры под названием PINx (PINA, PINB etc). Впринципе читать этот регистр можно в независимости от того сконфигурирован пин как вход или выход, но мы ж хотим таки вход.
Вобщем все те пины, для которых мы записали нули в DDRA регистр отсаются входами. Напомню:
#define DDRA_RESET_VALUE ( (1 << REL) + (1 << LED0) + (1 << LED1) + (0 << ADC_IN3) + (0 << ADC_IN2) + (0 << FAULT) + (0 << DC))
...
DDRA = DDRA_RESET_VALUE;
Далее, для каждого пина сконфигурированого как вход можно включить "слабую подтяжку", записав единице в соотв бит порта PORTA. Например возьмем пин под псевдонимом FAULT (он будет нашим входом на сегодня):
PORTA |= 1<<FAULT //так мы устанавливаем единственный бит в восьмибитно регистре.
Чтение из регистра PINA входа FAULT будет выглядить приблизитено вот так:
Что-то там = PINA & (1 << FAULT) // так мы наложили маску, и нам будет виден только интересующий нас бит
Для удобства делаем заготовку в .h фале:
#define READ_PIN_FAULT PINA & (1 << FAULT)
Читать пин можно по разному, "по полингу", по таймеру, по прирыванию.
В данном случае будет довольно просто вложить это в нашу обработку таймера таким образом:
int main(void)
{
DDRA = DDRA_RESET_VALUE;
PORTA |= (1 << REL) + (1 << LED0) + (1 << FAULT);
TCCR0A = TCCR0A_RESET_VALUE;
TCCR0B = TCCR0B_RESET_VALUE;
TIMSK0 = TIMSK0_RESET_VALUE;
while(1)
{
if (TIMER0_OF())
{
TIMER0_OF_RESET();
if (READ_PIN_FAULT)
PINA |= (1 << REL) + (1 << LED0);
}
}
}
"Найкраще сало то ковбаса." (с)