Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.12.2016, 22:00   #1
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1030
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: настенный выключатель (дубль два)

Напаял на плату 5 шт резисторов 1 кОм, по схеме


и встал вопрос: А как выглядит analog.read на чистом С?
Как обычно и полагается в таких случаях - я погуглил...
Так как вопрос мной сформулирован криво, гуглил я долго, но таки нашел:
Код:
    #include <avr/io.h>
    #define PORT_ON(port,pin) port |= (1<<pin) //классные кстати дефайны, надо бы запомнить.
    #define PORT_OFF(port,pin) port &= ~(1<<pin)
    int main(void)
    {
       unsigned int adc_value; // Variable to hold ADC result
       DDRD=0xff; // Set Port D as Output
       PORTD = 0x00;
       ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);
       // ADEN: Set to turn on ADC , by default it is turned off  - тут понятно
       //ADPS2: ADPS2 and ADPS0 set to make division factor 32 - А вот тут непонятно! Что это и зачем?
       ADMUX=0x05; // ADC input channel set to PC5 Опять не очень понятно, а если у меня 2 независимых входа?
       while (1)
       {
          ADCSRA |= (1<<ADSC); // Start conversion
             while (ADCSRA & (1<<ADSC)); // wait for conversion to complete
          adc_value = ADCW; //Store ADC value
                if (adc_value < 512)
                {
                      PORT_OFF(PORTD,7); // Toggle LEDs
                      PORT_ON (PORTD,6);
                } 
                else
                {
                      PORT_ON(PORTD,7); // Toggle LEDs
                      PORT_OFF (PORTD,6);
                }
       }
    }
Если кто-нибудь может мне объяснить на уровне "для альтернативно одаренных" назначения битов ADCW, ADSC, ADPS2, ADPS0 (предполагаю есть еще и ADPS1?), буду благодарен.
Пока пойду попробую маны почитать....
Tohin вне форума   Ответить с цитированием
Старый 28.12.2016, 16:27   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: настенный выключатель (дубль два)

Цитата:
ADPS2, ADPS0 (предполагаю есть еще и ADPS1?)
предделитель частоты семплирования

Цитата:
ADSC
Одиночное преобразование запускается путем записи лог. 1 в бит запуска преобразования ADC ADSC (регистр ADCSRA). Данный бит остается в высоком состоянии в процессе преобразования и сбрасывается по завершении преобразования.

Цитата:
ADCW
- содержит результат преобразования и делится на два 8 битных регистра ADCH и ADCL
Admin вне форума   Ответить с цитированием
Старый 28.12.2016, 19:49   #3
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1030
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: настенный выключатель (дубль два)

Читал я даташит, читал... но ничего не понял...
Вот это предделитель частоты семплирования что такое? Мне показалось, что это как то влияет на длительность замера...
Какое значение предделителя лучше для моей задачи?

А это Одиночное преобразование запускается путем записи лог. 1 в бит запуска преобразования ADC ADSC, то есть есть еще и непрерывное преобразование?

Ну и на сладкое, ADCW- содержит результат преобразования, а если в ADMUX=0xFF, то что я увижу в ADCW? Усредненное для всех портов?

Как долго хранится значение в ADCW? до следующего измерения?
Если янапишу так:
Код:
 
 if (!(ADCSRA & (1<<ADSC))){ // if conversion complete
          adc_value = ADCW; //Store ADC value
          ADCSRA |= (1<<ADSC); // Start new conversion
}
будет ли мега продолжать гонять основной цикл, до окончания измерения? Или в этом нет нужды и проще пропустить такты? Или это вообще приведет к непонятным результатам?
Tohin вне форума   Ответить с цитированием
Старый 02.01.2017, 12:01   #4
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1030
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: настенный выключатель (дубль два)

Цитата:
Сообщение от Tohin Посмотреть сообщение
Напаял на плату 5 шт резисторов 1 кОм.
Это плохая идея. Очень близкие значения для кнопок. в дополнении к некачественным тактовым кнопкам бывают ложные срабатывания (то есть жму кнопку 2, а отрабатывает кнопка 3 или даже 4.)
Вообще, насколько резистивные кнопки надежны? Нужно просчитать номиналы точнее или этот головняк не стоит того?
Tohin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 04:13. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика