Формирование случайной импульсной последовательности

Поклонники продукции Microchip Technology Inc тусуются тут.
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Re: Формирование случайной импульсной последовательности

Сообщение SpeedFighter »

Так, мужики, давайте разберемся.

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

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

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

Вот при случайной задержке да, это неточно - раз и громоздко - два.
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Формирование случайной импульсной последовательности

Сообщение Albert_V »

SpeedFighter писал(а):...В чем преимущество работы с таймером при опросе кнопок? Я получаю одинаковый результат же!...
Если вас не беспокоит, что когда контроллер "болтается в delay" он больше ничего делать не может - и так сойдёт.
Реклама
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Re: Формирование случайной импульсной последовательности

Сообщение SpeedFighter »

Не беспокоит, в том ведь и дело.

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

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

Я правильно понял, мой пичок (PIC10F322) не поддерживает внешних прерываний (например, по нажатию кнопки)?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25259
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Формирование случайной импульсной последовательности

Сообщение КРАМ »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3256353#p3256353"]Я немного по-другому делаю: Так сложилось что, обычно, системный таймер всегда настраиваю на 1mS и, для дискретных мембранных кнопок, я выставляю время срабатывания 5mS и время отпускания 50mS.
По программе - на каждую кнопку один счётчик + два бита ("кнопка нажата" и "факт нажатия"; последний - для передачи в подпрограмму обработки нажатия кнопок).[/uquote]
А что это дает?
Если нужен системный таймер на 1 мс, то в его обработчике еще делается счетчик-делитель. В чем смысл разделять дребезг нажатия и дребезг отпускания?
И зачем все это делать на каждую кнопку? А если это матрица? :dont_know:

Добавлено after 4 minutes 5 seconds:
[uquote="SpeedFighter",url="/forum/viewtopic.php?p=3256379#p3256379"]Я правильно понял, мой пичок (PIC10F322) не поддерживает внешних прерываний (например, по нажатию кнопки)?[/uquote]
Неправильно. В этом контроллере есть ОДНО внешнее тактируемое прерывание (INT) и ЧЕТЫРЕ входа прерываний по изменению состояния порта (IOC).
Тактируемое не вешают на кнопки. Оно никак не поможет с дребезгом. А IOC применяют для вывода контроллера из сна при нажатии кнопок.
Реклама
Эиком - электронные компоненты и радиодетали
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Re: Формирование случайной импульсной последовательности

Сообщение SpeedFighter »

Вот, пока сделал так, как понял, прерывание для опроса клавиш. Правильно ли? Если нет, то что именно неправильно?

Код:
Спойлер

Код: Выделить всё

// Подключение нужных библиотек
#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, которое было определено ранее?
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Формирование случайной импульсной последовательности

Сообщение Albert_V »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3256832#p3256832"]В чем смысл разделять дребезг нажатия и дребезг отпускания?
И зачем все это делать на каждую кнопку? А если это матрица? :dont_know:[/uquote]Кнопка, для пользователя, должна сработать максимально быстро, но не с "первого пичка" (который может оказаться импульсной помехой), а собственно "дребезг" я убираю на отпускании кнопки.
Для каждой кнопки: Почти во всех моих изделиях есть возможность входа в некоторые функции по нажатию (и удержанию) нескольких кнопок в определённой последовательности (по аналогии с Ctrl+Alt+Del).
Матричная клавиатура отличается от дискретных кнопок только способом опроса кнопок. Подавление "дребезга" остаётся прежним.
Естественно, если по условию, в любой момент времени может быть нажата только одна кнопка - тогда всё намного проще...
-------------------
SpeedFighter писал(а):Как быть?
Не забывайте, что на таймеры подаётся FOSC/4.
С Timer0 максимальное время 16,384mS (FOSC/4/256/256) при тактовой 16MHz.
У PIC10F322 есть ещё Timer2, с которого вы можете получить чуть более 65mS (65,536mS) при тактовой 16MHz.
SpeedFighter писал(а):чтобы таймер считал до числа N
Таймер всегда даст прерывание при переходе на "0". Перефразируйте задачу: "Надо записать в таймер стартовое значение".
Реклама
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Re: Формирование случайной импульсной последовательности

Сообщение SpeedFighter »

Хорошо, спасибо.

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

А вот преимущество задержки через таймеры - я вижу, но как сделать задержку от 100 мкс до 400 мс, если таймер TMR2 может только до 65 мс задерживать?
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Формирование случайной импульсной последовательности

Сообщение Albert_V »

С какой дискретностью (какой шаг) от 100 мкс до 400 мс?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25259
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Формирование случайной импульсной последовательности

Сообщение КРАМ »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3257383#p3257383"]Кнопка, для пользователя, должна сработать максимально быстро[/uquote]
Зачем? Реакция человека на подобные события определяется величиной 0,1...0,2 сек.
Кнопка - типичное устройство НЕ реального времени.
[uquote="SpeedFighter",url="/forum/viewtopic.php?p=3257408#p3257408"]Но я, честно говоря, не понял, в чем преимущество таймера для опроса кнопок в ДАННОЙ программе.
А вот преимущество задержки через таймеры - я вижу, но как сделать задержку от 100 мкс до 400 мс, если таймер TMR2 может только до 65 мс задерживать?[/uquote]
Преимущество в "прозрачности" такого алгоритма для остального кода. И отличной переносимости в практически в ЛЮБОЙ код. Делать нужно сразу правильно.
Про задержки.
Таймер генерирует лишь МИНИМАЛЬНЫЙ ДИСКРЕТ времени, а остальное реализуется ПРОГРАММНЫМ счетчиком ВНУТРИ ОБРАБОТЧИКА прерываний от таймера.
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Re: Формирование случайной импульсной последовательности

Сообщение SpeedFighter »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3257410#p3257410"]С какой дискретностью (какой шаг) от 100 мкс до 400 мс?[/uquote]

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

[uquote="КРАМ",url="/forum/viewtopic.php?p=3257494#p3257494"][uquote="Albert_V",url="/forum/viewtopic.php?p=3257383#p3257383"]Кнопка, для пользователя, должна сработать максимально быстро[/uquote]
Зачем? Реакция человека на подобные события определяется величиной 0,1...0,2 сек.
Кнопка - типичное устройство НЕ реального времени.
[uquote="SpeedFighter",url="/forum/viewtopic.php?p=3257408#p3257408"]Но я, честно говоря, не понял, в чем преимущество таймера для опроса кнопок в ДАННОЙ программе.
А вот преимущество задержки через таймеры - я вижу, но как сделать задержку от 100 мкс до 400 мс, если таймер TMR2 может только до 65 мс задерживать?[/uquote]
Преимущество в "прозрачности" такого алгоритма для остального кода. И отличной переносимости в практически в ЛЮБОЙ код. Делать нужно сразу правильно.
Про задержки.
Таймер генерирует лишь МИНИМАЛЬНЫЙ ДИСКРЕТ времени, а остальное реализуется ПРОГРАММНЫМ счетчиком ВНУТРИ ОБРАБОТЧИКА прерываний от таймера.[/uquote]

Насчет опроса кнопок:
1. После выполнения функции прерывания, микроконтроллер вернется на какой этап? С того момента, на котором прервался? Даже если был в цикле?
2. Если сделать глобальную переменную и в обработчике прерываний сделать присваивание этой переменной какого-либо числа, то сохранится ли в ней значение?
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Формирование случайной импульсной последовательности

Сообщение Albert_V »

SpeedFighter писал(а):...я не задавался этим вопросом, поэтому встречный вопрос: а какие есть варианты?
Это надо ТЗ смотреть... :)
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

Re: Формирование случайной импульсной последовательности

Сообщение SpeedFighter »

Ну допустим, что на мое усмотрение.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25259
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Формирование случайной импульсной последовательности

Сообщение КРАМ »

[uquote="SpeedFighter",url="/forum/viewtopic.php?p=3257733#p3257733"]Насчет опроса кнопок:
1. После выполнения функции прерывания, микроконтроллер вернется на какой этап? С того момента, на котором прервался? Даже если был в цикле?
2. Если сделать глобальную переменную и в обработчике прерываний сделать присваивание этой переменной какого-либо числа, то сохранится ли в ней значение?[/uquote]
1. При выходе из обработчика программа попадет на следующую после прерванной команду. То есть для основного кода прерывания как бы не существуют, при их исполнении выполнение основного кода замирает, а затем восстанавливается ровно с того места на котором произошла остановка.
2. Глобальная переменная измененная в прерывании останется измененной. Но есть несколько другая опасность. Компилятор может проигнорировать часть исходного кода основного цикла, если увидит, что переменная в основном цикле не модифицируется, а так же может произойти ошибка при чтении переменной в основном цикле, если ее разрядность выше разрядности контроллера (прерывание может произойти между чтениями младшей и старшей частями переменной). Поэтому все глобальные переменные, которые модифицируются в прерывании должны при объявлении иметь квалификатор volatile перед типом, например
volatile int count;
Это позволит компилятору избежать генерации ошибочного кода.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Формирование случайной импульсной последовательности

Сообщение ARV »

Какую тему не возьми, все в итоге сведется либо к политике, либо к кнопкам, либо к обсуждению крутости ARM. ведь про случайную последовательность тема же была, при чем тут кнопки, прерывания, DMA?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25259
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Формирование случайной импульсной последовательности

Сообщение КРАМ »

[uquote="ARV",url="/forum/viewtopic.php?p=3258333#p3258333"]при чем тут кнопки, прерывания, DMA?![/uquote]
Про ДМА разговор не идет. По крайней мере тут.
Про прерывания и кнопки разговор идет ровно потому, что автор реализует свое устройство посредством КНОПОК. Про случайную последовательность уже все разобрали.
Правила форума не ограничивают круг обсуждаемых вопросов в топике формулировкой заголовка. Тема обсуждения вольна уходить В ЛЮБУЮ ТЕХНИЧЕСКУЮ СТОРОНУ.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Формирование случайной импульсной последовательности

Сообщение dosikus »

[uquote="ARV",url="/forum/viewtopic.php?p=3258333#p3258333"]Какую тему не возьми, все в итоге сведется либо к политике, либо к кнопкам, либо к обсуждению крутости ARM. ведь про случайную последовательность тема же была, при чем тут кнопки, прерывания, DMA?![/uquote]

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

Вернуться в «PIC»