asadmasad

ATMEGA2560. Опрос пинов

4 сообщения в этой теме

asadmasad    0

Принесли устройство, попросили написать коротенькую обработку. Устройство контролирует исполнительные устройства (автоматы, контакторы, цифровые датчики). Собрано на atmega 2560. 

Для опроса используется порт L. Он сконфигурирован стандартно:

// Port L initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRL=(0<<DDL7) | (0<<DDL6) | (0<<DDL5) | (0<<DDL4) | (0<<DDL3) | (0<<DDL2) | (0<<DDL1) | (0<<DDL0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTL=(0<<PORTL7) | (0<<PORTL6) | (0<<PORTL5) | (0<<PORTL4) | (0<<PORTL3) | (0<<PORTL2) | (0<<PORTL1) | (0<<PORTL0);  

Подтягивающие резисторы по 10к есть на самой плате.

#define A1 PINL&(1<<0) 
#define A2 PINL&(1<<1) 
#define A3 PINL&(1<<2)
#define A4 PINL&(1<<3) 
#define A5 PINL&(1<<4)  

В коде по прерыванию от таймера (желание заказчика) проверяем состояние пинов.

        if (!A1){printf("1");} // написал просто для проверки, чтобы видеть, что работает 
        if (A1) {printf("2)";}

Всё работает. При опросе следующих пинов появляется непонятная для моего недостаточного опыта фигня.

         if (!A2){printf("3");}
        if (A2) {printf("4");}

Сначала нет ничего при появлении сигнала на А2, появляется 4, а при пропадании сигнала опять ничего.

Пробовал считать состоянии пина в переменную

int c = A2;

printf("%i", c);

Без сигнала идут 0, после появления появляется цифра 2, когда сигнал пропадает 0. Не могу понять, помогите.

Изменено пользователем asadmasad

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
BARS_    530

Как минимум это

PINL&(1<<4)  

надо заключить в скобки. И сделать защиту от дребезга.

Изменено пользователем BARS_

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
asadmasad    0

Спасибо большое. Изменил на

#define A1 (PINL&(1<<0)) 
#define A2 (PINL&(1<<1))
#define A3 (PINL&(1<<2))

и всё заработало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...