Например TDA7294

Форум РадиоКот • Просмотр темы - Формирование случайной импульсной последовательности
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 08:31:40

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 76 ]    , , , 4
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Пн дек 11, 2017 04:29:24 
Открыл глаза

Зарегистрирован: Вс май 28, 2017 19:07:32
Сообщений: 63
Рейтинг сообщения: 0
Так, мужики, давайте разберемся.

Я вот сейчас посмотрел свой код, а именно его часть с кнопками и случайной задержкой.

Ещё посмотрел disassembly listing. Да, возможно, часть со случайной задержкой неоптимизирована, не спорю, НО!

В чем преимущество работы с таймером при опросе кнопок? Я получаю одинаковый результат же!

Вот при случайной задержке да, это неточно - раз и громоздко - два.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Пн дек 11, 2017 04:42:59 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
SpeedFighter писал(а):
...В чем преимущество работы с таймером при опросе кнопок? Я получаю одинаковый результат же!...
Если вас не беспокоит, что когда контроллер "болтается в delay" он больше ничего делать не может - и так сойдёт.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Пн дек 11, 2017 05:06:23 
Открыл глаза

Зарегистрирован: Вс май 28, 2017 19:07:32
Сообщений: 63
Рейтинг сообщения: 0
Не беспокоит, в том ведь и дело.

Я прикинул его работу и подумал, а нужно ли где-то его прерывать, ответ - нет.

Не спорю, если бы я делал что-то сложнее - то так нельзя было бы делать.

Я правильно понял, мой пичок (PIC10F322) не поддерживает внешних прерываний (например, по нажатию кнопки)?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Пн дек 11, 2017 16:08:36 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21784
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Я немного по-другому делаю: Так сложилось что, обычно, системный таймер всегда настраиваю на 1mS и, для дискретных мембранных кнопок, я выставляю время срабатывания 5mS и время отпускания 50mS.
По программе - на каждую кнопку один счётчик + два бита ("кнопка нажата" и "факт нажатия"; последний - для передачи в подпрограмму обработки нажатия кнопок).

А что это дает?
Если нужен системный таймер на 1 мс, то в его обработчике еще делается счетчик-делитель. В чем смысл разделять дребезг нажатия и дребезг отпускания?
И зачем все это делать на каждую кнопку? А если это матрица? :dont_know:

Добавлено after 4 minutes 5 seconds:
Я правильно понял, мой пичок (PIC10F322) не поддерживает внешних прерываний (например, по нажатию кнопки)?

Неправильно. В этом контроллере есть ОДНО внешнее тактируемое прерывание (INT) и ЧЕТЫРЕ входа прерываний по изменению состояния порта (IOC).
Тактируемое не вешают на кнопки. Оно никак не поможет с дребезгом. А IOC применяют для вывода контроллера из сна при нажатии кнопок.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Пн дек 11, 2017 19:05:13 
Открыл глаза

Зарегистрирован: Вс май 28, 2017 19:07:32
Сообщений: 63
Рейтинг сообщения: 0
Вот, пока сделал так, как понял, прерывание для опроса клавиш. Правильно ли? Если нет, то что именно неправильно?

Код:
Спойлер
Код:
// Подключение нужных библиотек
#include <stdio.h>              // Стандартная библиотека ввода-вывода
#include <stdlib.h>             // Стандартная библиотека контроля
#include <xc.h>                 // Специализированная библиотека XC8

// Параметры микроконтроллера
#define _XTAL_FREQ 16000000     // Тактовая частота 4 МГц
#define BOUNCE 15               // Время в мс для обработки дребезга
#define CORRMIN 18              // Число итераций в цикле для задержки в 100 мкс
#define CORRMAX 79998           // Число итераций в цикле для задержки в 400000 мкс
// CORR - Correction factor

// Параметры сигнала
#define SIGNAL 30               // Длительность сигнала в мкс

// Обознаение выводов и кнопок
#define START RA2       // Кнопка ПУСК МК
#define STOP RA3        // Кнопка СТОП МК
#define LED RA0         // Вывод на светодиоды
#define GREEN 1         // Сигнал для зеленого светодиода
#define RED 0           // Сигнал для красного светодиода
#define GENERATOR RA1   // Выход генератора


// Настройка МК
#pragma config FOSC = INTOSC    // Выбор генератора (внешний/внутренний)
#pragma config BOREN = ON       // Сброс при потере напряжения питания
#pragma config WDTE = ON       // Включение/выключение сторожевого таймера
#pragma config PWRTE = OFF      // Бит разрешения работы таймера включения (PWRTE)
#pragma config MCLRE = OFF      // Перезагрузка устройства через MCLR
#pragma config CP = ON          // Бит защиты
#pragma config LVP = OFF        // Низковольтное программирование
#pragma config LPBOR = ON       // Перезагрузка процессора при низкой мощности
#pragma config BORV = LO        // Выбор точки отключения (низкая/высокая)
#pragma config WRT = OFF        // Защита флеш памяти от записи

// Настройка прерываний
[b]INTCON=0b11100000; [/b] //  Настройка прерываний (разрешение глобального прерывания, включение периферийных прерываний, включение прерываня Timer()
[b]OPTION=0b00101000;[/b]  //  Настройка TMR0 (отключен предделитель TMR0), т.е. таймер работает на частоте 16/2 = 8 МГц

int main() // Главная функция
{
   [b] TMR0=0;         //  Обнуление таймера TMR0[/b]
    // Объявление параметров конгруэнтного метода
    g_Random[0] = 1;
    g_Random[2] = 3;
    g_Random[3] = 5;
    Prepare(); // Запуск функции подготовки     
    while(1) // Бесконечный цикл работы
    {
        if(g_bStat) // Проверка режима
        {
            LED = GREEN; // Включение зеленого светодиода (вкл МК)
            RandomDelay(); // Запуск функции случайной задержки
            GENERATOR = 1; // Выставляем лог. 1 на выход генератора
            __delay_us(SIGNAL); // Задерживаем лог. 1 на выходе
            GENERATOR = 0; // Обнуляем выход генератора
        }
        else
        {
            LED = RED; // Включение красного светодиода (выкл МК)
        }
    }
    return 0;   
}

// Функция подготовки
void Prepare()
{
    TRISA = 0b1100; // Направление работы ножек порта А (вход)
    PORTA = 0b0000; // Очистка порта A
    OSCCON = (1<<4)|(1<<5)|(1<<6); // Установка IRCF = '111' для частоты в 16 MHz
    WPUA&=~((1<<0)|(1<<1)|(1<<2)|(1<<3)); // Отключение WEAK PULL-UP
    ANSELA = 0; // Отключение аналоговой части
}

void ButtonInterrupt isr(void) // Прерывание для опроса кнопок
{
    [b]if(TMR0IF)[/b] // Проверка переполнения таймера
    {
       if(!START && STOP && !g_bStat) // Проверка на нажатие клавиши старт
       {
           __delay_ms(BOUNCE); // Обработка дребезга
           if(!START && STOP) // Обработка дребезга
           {
                  g_bStat = 1; // Установка режима МК (вкл)           
           }
           else
           {
                  g_bStat = 0; // Установка режима МК (выкл)
           }
       }
       else if(START && !STOP && g_bStat) // Проверка на нажатие клавиши стоп
       {
           __delay_ms(BOUNCE); // Обработка дребезга
           if(START && !STOP) // Обработка дребезга
           {
                  g_bStat = 0; // Установка режима МК (выкл)
           }
       }
       else if(!START && !STOP && g_bStat) // Защита от дурака
       {
           __delay_ms(BOUNCE); // Обработка дребезга
           if(!START && !STOP) // Обработка дребезга
           {
                  g_bStat = 0; // Установка режима МК (выкл)
           }
       }
       [b]TMR0IF = 0; //  Cбрасываем флаг о переполнении[/b]
    }
}


Вот, НО! Вопрос заключается в том, а как правильно сделать прерывание раз в 10-30 мс?
Как рассуждаю я:

0. Я настроил тактовую частоту генератора на 16 МГц в OSCCON .
1. Таймер TMR0 настроен при этом на 8 МГц
2. При такой частоте, таймер переполнится за 256*(1/8) = 32 мкс
3. Мало, нужно получить 20-30 мс, но я же не смогу получить её, даже с предделителем в 256.
4. Вывод - нужно понижать тактовую частоту в OSCCON до 4х МГц, но не хотелось бы.

Как быть?

Вот скрин из даташита, кому интересно:

СпойлерИзображение


Как сделать случайную задержку, т.е. чтобы таймер считал до числа N, которое было определено ранее?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 04:23:14 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 1
Медали: 5
Получил миской по аватаре (5)
В чем смысл разделять дребезг нажатия и дребезг отпускания?
И зачем все это делать на каждую кнопку? А если это матрица? :dont_know:
Кнопка, для пользователя, должна сработать максимально быстро, но не с "первого пичка" (который может оказаться импульсной помехой), а собственно "дребезг" я убираю на отпускании кнопки.
Для каждой кнопки: Почти во всех моих изделиях есть возможность входа в некоторые функции по нажатию (и удержанию) нескольких кнопок в определённой последовательности (по аналогии с Ctrl+Alt+Del).
Матричная клавиатура отличается от дискретных кнопок только способом опроса кнопок. Подавление "дребезга" остаётся прежним.
Естественно, если по условию, в любой момент времени может быть нажата только одна кнопка - тогда всё намного проще...
----------
SpeedFighter писал(а):
Как быть?
Не забывайте, что на таймеры подаётся FOSC/4.
С Timer0 максимальное время 16,384mS (FOSC/4/256/256) при тактовой 16MHz.
У PIC10F322 есть ещё Timer2, с которого вы можете получить чуть более 65mS (65,536mS) при тактовой 16MHz.
SpeedFighter писал(а):
чтобы таймер считал до числа N
Таймер всегда даст прерывание при переходе на "0". Перефразируйте задачу: "Надо записать в таймер стартовое значение".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 05:17:46 
Открыл глаза

Зарегистрирован: Вс май 28, 2017 19:07:32
Сообщений: 63
Рейтинг сообщения: 0
Хорошо, спасибо.

Но я, честно говоря, не понял, в чем преимущество таймера для опроса кнопок в ДАННОЙ программе.

А вот преимущество задержки через таймеры - я вижу, но как сделать задержку от 100 мкс до 400 мс, если таймер TMR2 может только до 65 мс задерживать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 05:24:57 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
С какой дискретностью (какой шаг) от 100 мкс до 400 мс?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 09:16:01 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21784
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Кнопка, для пользователя, должна сработать максимально быстро

Зачем? Реакция человека на подобные события определяется величиной 0,1...0,2 сек.
Кнопка - типичное устройство НЕ реального времени.
Но я, честно говоря, не понял, в чем преимущество таймера для опроса кнопок в ДАННОЙ программе.
А вот преимущество задержки через таймеры - я вижу, но как сделать задержку от 100 мкс до 400 мс, если таймер TMR2 может только до 65 мс задерживать?

Преимущество в "прозрачности" такого алгоритма для остального кода. И отличной переносимости в практически в ЛЮБОЙ код. Делать нужно сразу правильно.
Про задержки.
Таймер генерирует лишь МИНИМАЛЬНЫЙ ДИСКРЕТ времени, а остальное реализуется ПРОГРАММНЫМ счетчиком ВНУТРИ ОБРАБОТЧИКА прерываний от таймера.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 14:39:50 
Открыл глаза

Зарегистрирован: Вс май 28, 2017 19:07:32
Сообщений: 63
Рейтинг сообщения: 0
С какой дискретностью (какой шаг) от 100 мкс до 400 мс?


Если честно, я не задавался этим вопросом, поэтому встречный вопрос: а какие есть варианты? :)

Кнопка, для пользователя, должна сработать максимально быстро

Зачем? Реакция человека на подобные события определяется величиной 0,1...0,2 сек.
Кнопка - типичное устройство НЕ реального времени.
Но я, честно говоря, не понял, в чем преимущество таймера для опроса кнопок в ДАННОЙ программе.
А вот преимущество задержки через таймеры - я вижу, но как сделать задержку от 100 мкс до 400 мс, если таймер TMR2 может только до 65 мс задерживать?

Преимущество в "прозрачности" такого алгоритма для остального кода. И отличной переносимости в практически в ЛЮБОЙ код. Делать нужно сразу правильно.
Про задержки.
Таймер генерирует лишь МИНИМАЛЬНЫЙ ДИСКРЕТ времени, а остальное реализуется ПРОГРАММНЫМ счетчиком ВНУТРИ ОБРАБОТЧИКА прерываний от таймера.


Насчет опроса кнопок:
1. После выполнения функции прерывания, микроконтроллер вернется на какой этап? С того момента, на котором прервался? Даже если был в цикле?
2. Если сделать глобальную переменную и в обработчике прерываний сделать присваивание этой переменной какого-либо числа, то сохранится ли в ней значение?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 18:52:25 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
SpeedFighter писал(а):
...я не задавался этим вопросом, поэтому встречный вопрос: а какие есть варианты?
Это надо ТЗ смотреть... :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Вт дек 12, 2017 19:07:43 
Открыл глаза

Зарегистрирован: Вс май 28, 2017 19:07:32
Сообщений: 63
Рейтинг сообщения: 0
Ну допустим, что на мое усмотрение.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Ср дек 13, 2017 03:28:27 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21784
Откуда: Московская область, Фрязино
Рейтинг сообщения: 1
Насчет опроса кнопок:
1. После выполнения функции прерывания, микроконтроллер вернется на какой этап? С того момента, на котором прервался? Даже если был в цикле?
2. Если сделать глобальную переменную и в обработчике прерываний сделать присваивание этой переменной какого-либо числа, то сохранится ли в ней значение?

1. При выходе из обработчика программа попадет на следующую после прерванной команду. То есть для основного кода прерывания как бы не существуют, при их исполнении выполнение основного кода замирает, а затем восстанавливается ровно с того места на котором произошла остановка.
2. Глобальная переменная измененная в прерывании останется измененной. Но есть несколько другая опасность. Компилятор может проигнорировать часть исходного кода основного цикла, если увидит, что переменная в основном цикле не модифицируется, а так же может произойти ошибка при чтении переменной в основном цикле, если ее разрядность выше разрядности контроллера (прерывание может произойти между чтениями младшей и старшей частями переменной). Поэтому все глобальные переменные, которые модифицируются в прерывании должны при объявлении иметь квалификатор volatile перед типом, например
volatile int count;
Это позволит компилятору избежать генерации ошибочного кода.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Ср дек 13, 2017 06:54:54 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Какую тему не возьми, все в итоге сведется либо к политике, либо к кнопкам, либо к обсуждению крутости ARM. ведь про случайную последовательность тема же была, при чем тут кнопки, прерывания, DMA?!

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Ср дек 13, 2017 14:14:47 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21784
Откуда: Московская область, Фрязино
Рейтинг сообщения: 1
при чем тут кнопки, прерывания, DMA?!

Про ДМА разговор не идет. По крайней мере тут.
Про прерывания и кнопки разговор идет ровно потому, что автор реализует свое устройство посредством КНОПОК. Про случайную последовательность уже все разобрали.
Правила форума не ограничивают круг обсуждаемых вопросов в топике формулировкой заголовка. Тема обсуждения вольна уходить В ЛЮБУЮ ТЕХНИЧЕСКУЮ СТОРОНУ.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Формирование случайной импульсной последовательности
СообщениеДобавлено: Ср дек 13, 2017 21:28:06 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Какую тему не возьми, все в итоге сведется либо к политике, либо к кнопкам, либо к обсуждению крутости ARM. ведь про случайную последовательность тема же была, при чем тут кнопки, прерывания, DMA?!


Все просто, стареешь вот и брюзжишь.
Делом займись , всяко веселей будет..


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 76 ]    , , , 4

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y