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_    595

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

PINL&(1<<4)  

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

Загрузка...

  • Сообщения

    • А это вообще не понятно.. Что может связывать сухопутного поэта с пароходом?

      http://www.tvc.ru/channel/brand/id/2721/show/news/news_id/1478
    • Вот что их может связывать? Вроде разные женщины. Но ведь что-то связывает..?
      https://dni.ru/showbiz/2017/9/20/380686.html
    • Прочитал, но так и не понял..?
      http://www.loveradio.ru/new/94860.htm
    • Как раз там я ( и не только я)  всё подробно расписали, что и зачем, и ссылки приводил на статьи, где расписано, как это работает. Потратьте полчаса времени на теорию, поймите работу схемы и всё получится легко и просто.
    • Я его просто не стер. Конечно я его не ставил. Вообщем я понял. Ну работает ниче так. Но, чисто для кругозора, есть у меня еще 2 вопроса, думаю последних в этой теме) 1. Как по задумке автора должен был тот светодиод загораться, когда типа через фильтр помеха прошла и он ее погасил или наоборот не погасил и она пошла в сеть? Или он должен был гореть все время, а в момент помехи гаснуть, но тоже не понятно, это если ее он погасил, или если не погасил? 2. Вот, я понял насчет частоты, возросшей в 3 раза. Ок. Где-то тот автор писал, что эти 20 мГн расчитаны были на 20 кГц (или он писал, что-то про полосу звуковых частот), я границу отодвинул вверх, допустим до 60 мГн. Окей. Ну как ни странно, мне вообще писали, что реле холодильника дает помеху низкочастотную, до 1 кГц... но он ее успешно гасит... Короче говоря, замерить частоту помехи я не хочу. Но приходит в голову вопрос: что значит вообще эта частота, возросшая в 3 раза, это значит, что он гасит только помехи в пределах 60 кГц или это в какой-то полосе, допустим от 0 до 60 кГц? И одинаково ли он эффективен в этой полосе? Есть ли нижняя граница, по типу от 1 кГц до 60 кГц?   И заодно спрошу, в какой примерно полосе лежат помехи, создаваемые двигателями средней и малой мощности всяких производственных и домашних агрегатов, типа холодильника, токарного станка, фрезера, и др.? Просто я понимаю, у меня все работает, но есть некоторые "но". Допустим я читал, компрессоры дают при запуске низкочастотную сетевую помеху. Источник не помню. Так ли это? И низкочастотную, это сколько, это 1 кГц или 10 кГц чаще всего? Плюс не понимаю, в каком диапазоне гасит этот фильтр. от 0 до 60 кГц или в более узком. Тогда в каком, как это прикинуть. Вдруг понадобится изменить его полосу пропускания.
    • Когда я писал "Сделай его", то это относилось к резонансному индикатору поля ( волномеру). Его делают не на светодиоде, а на головке микроамперметра. А эту схему тебе привёл, как пример наиболее простого получения сигнала на 5ой гармонике. Нужно немного изменить параметры контуров, т.к. я не нашёл  такой же схемы с кварцем 20 мгц и на 100 мгц, т.е. лобового решения твоей проблемы на халяву. Придётся поработать самому, проявляя сообразительность и скрупулёзное отношение к делу (последнее предполагает отказ от использования светодиодного пробника для малых сигналов, создание резонансного волномера  и приобретение частотомера).