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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

Что за FOSC = EC???
Вы от внешнего тактирования работаете?
Реклама
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

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

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

Сообщение Albert_V »

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

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

Сообщение SpeedFighter »

#pragma config FOSC = INTOSC
Так нужно?

Я плохо английский знаю, поэтому я этот бит оставил таким, каким мне конфигуратор предложил.

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

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

Сообщение Albert_V »

По вашей схеме: нажатая кнопка - "0".
По программе: Если на всех входах "1" (кнопки отпущены) - проход программы с зацикливанием на "BCF PORTA, 0x2" (без возврата в начало программы).
Реклама
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

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

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

Сообщение Albert_V »

Ещё раз: Я не знаю Си, но по факту, у вас:

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

01ED  29FB     GOTO 0x1FB
01EE  1D85     BTFSS PORTA, 0x3 ; Если на входе 1, перейти на 01FB
01EF  29FA     GOTO 0x1FA
01FB  1C05     BTFSS PORTA, 0x0 ; Если на входе 1, перейти на 01FD (задержка)
01FC  29EE     GOTO 0x1EE
Добавлено after 2 minutes 55 seconds:
P.S.
Попробуйте задать вопрос в теме "Программирование pic на СИ".
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

В общем, я сделал так:
1. Поменял сопротивления резисторов R1 на R2, а R2 на R1.
2. Изменил сопротивление кнопки в разомкнутом состоянии на 500 МОм.

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

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

Сообщение Albert_V »

Я говорил по вашей схеме от Пт дек 08, 2017 18:25:00 .
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

Вот я тогда хотел ещё спросить. Функции srand и rand дико едят память микроконтроллера.
Где можно прочитать про то, как сделать функцию с ассемблерной вставкой, в которую я впихну генерацию псевдослучайную генерацию по заданному диапазону?
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

Если устроит генератор ПСП и разберётесь с кодом - у меня можете "содрать".
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

В общем, переделал я.
ГСЧ - конгруэнтный линейный метод.
С прерываниями я не разобрался, поэтому, увы, пришлось оставить часть кода неизменной.

Хотел бы только узнать некоторые детали:

1. Как просто можно получить случайное целое число для начального значения, как описано в этом сообщении:

[uquote="ARV",url="/forum/viewtopic.php?p=3251290#p3251290"]Первое число лично я получаю следующим образом: сразу после подачи питания (определяю по флагам), еще до того момента, когда Си очистит память статических переменных, подсчитываю CRC16 всей памяти, что доступна, ну или заметного её куска. И уже эту CRC использую в качестве стартового для srand. Так как после подачи питания RAM имеет случайное состояние, получается почти настоящая случайность. Во всяком случае получше srand(rand()), что вы предложили.[/uquote]

2. Чему равно 512 Words of Flash Program Memory в байтах?

3. Правильно ли я прикинул алгоритм быстродействия функции задерки (по disassembly listing):

а) Посчитал число строк в функции задержки без учета цикла задержки
б) Посчитал среднее число тактов для всех инструкций без учета цикла задержки
в) Заплакал
г) Посчиитал п. а) и п. б) для инструкций внутри цикла, прибавил ещё примерно 8 тактов (суммарно) за __delau_us(x) и сам цикл фор.
д) Посчитал время выполнение одной операции в микросекунду
е) Составил уравнение: (180 + 80*N)*0.0625 = макс/мин задержка в мкс
Получилось, что N примерно равно 18 и 79998 для мин. и макс. задержки.

В протосе, при моделировании, не нарушаются заданные условия (как показалось).

Вот код:
Спойлер

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

// Подключение нужных библиотек
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

// Параметры микроконтроллера
#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 // Выход генератора

// PIC10F322 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTOSC        // Oscillator Selection bits (EC: CLKIN function enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config WDTE = OFF        // Watchdog Timer Enable (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = ON          // Code Protection bit (Program memory code protection is enabled)
#pragma config LVP = OFF         // Low-Voltage Programming Enable (Low-voltage programming enabled)
#pragma config LPBOR = ON       // Brown-out Reset Selection bits (BOR enabled)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


void Prepare(); // Функция подготовки МК
void CheckButton(); // Функция опроса кнопок
void RandomDelay(); // Функция генерирования случайной задержки

int g_bStat = 0; // Переменная для запоминания режима МК (вкл/выкл)
/* 
 * g_Random[5] хранит следующие значения:
 * 0 - Начальное значение конгруэнтный метода
 * 1 - Текунщее значение конгруэнтный метода
 * 2 - Коэффициент 'a' конгруэнтный метода
 * 3 - Коэффициент 'b' конгруэнтный медода
 */
int g_Random[4]; 


int main() // Главная функция
{
    // Объявление параметров конгруэнтного метода
    g_Random[0] = 1;
    g_Random[2] = 3;
    g_Random[3] = 5;
    Prepare(); // Запуск функции подготовки      
    while(1) // Бесконечный цикл работы
    {
        CheckButton(); // Опрос кнопок
        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 CheckButton()
{
    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; // Установка режима МК (выкл)
        }
    }
}

void RandomDelay()
{
    /*if(g_Random[2] % 2 == 0)
    {
        g_Random[1] = (c*g_Random[1] + d)%DELMAX;
        g_Random[2]++;
        if(g_Random[1] < 100)
        {
            g_Random[1] = (c*g_Random[1] + d)%DELMAX;
        }
        for(int i = 0; i <= g_Random[1] - 100; i++)
        {
            __delay_us(1);
        }             
    }
    else
    {
        g_Random[1] = (a*g_Random[1] + b)%DELMAX;
        g_Random[2]++;
        if(g_Random[1] < 100)
        {
            g_Random[1] = (c*g_Random[1] + d)%DELMAX;
        }
        for(int i = 0; i <= g_Random[1] - 100; i++)
        {
            __delay_us(1);
        }
    }*/ 
    
    /* Конгруэнтный метод - простой спобо для генерации случайных чисел,
     * имеет следующий алгоритм:
     * Ki = (Ki-1*a + b) mod c, имеет максимальный период = c.
     */
    g_Random[1] = (g_Random[2]*g_Random[1] + g_Random[3])%CORRMAX; 
    if(g_Random[1] < CORRMIN) // Задержка долна быть большее 100 мкс;
    {
        g_Random[1] = (g_Random[2]*g_Random[1] + g_Random[3])%CORRMAX;
    }
    for(int i = 0; i <= g_Random[1]; i++) // Цикл задержек в 1 мкс
    {
        __delay_us(1);
    }       
}
Вот схема:
СпойлерИзображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

SpeedFighter писал(а):1. Как просто можно получить случайное целое число для начального значения, как описано в этом сообщении
а как написано в этом сообщении - это сложно или по другим причинам не подходит?
SpeedFighter писал(а):2. Чему равно 512 Words of Flash Program Memory в байтах?
на сколько я могу понять смысл слова word, то 512 words = 1024 bytes
SpeedFighter писал(а):3. Правильно ли я прикинул алгоритм быстродействия функции задерки
я бы плакал через строку...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

[uquote="ARV",url="/forum/viewtopic.php?p=3255398#p3255398"]
SpeedFighter писал(а):1. Как просто можно получить случайное целое число для начального значения, как описано в этом сообщении
а как написано в этом сообщении - это сложно или по другим причинам не подходит?[/uquote]

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

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

Сообщение Albert_V »

SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?
У вас же есть таймер и вы можете работать по прерываниям....
По уму, обработка "дребезга" делается по системному таймеру не мешая работать другим подпрограммам.
Не понимаю как можно писать программу под конкретный контроллер, не зная его ресурсов.....
:dont_know:
-------------------
/Если изучали построение схем на "логике" с общим тактированием - это может быть лучшей подсказкой для написания программы/
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

Я же говорю, я первый раз в жизни сел и начал кодить для МК.

Я читал про прерывания и тупо не понимаю, куда для моего мк их пихать нужно.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

[uquote="Albert_V",url="/forum/viewtopic.php?p=3255432#p3255432"]SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?[/uquote]


Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера.
А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что kit это не большое млекопитающее а набор инструментов ).
SpeedFighter
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 28, 2017 19:07:32

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

Сообщение SpeedFighter »

[uquote="dosikus",url="/forum/viewtopic.php?p=3256055#p3256055"][uquote="Albert_V",url="/forum/viewtopic.php?p=3255432#p3255432"]SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?[/uquote]


Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера.
А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что kit это не большое млекопитающее а набор инструментов ).[/uquote]

Я не понимаю, о чем ты, но:

1. Если я не знаю и не понимаю одного метода - сделал так, как смог.
2. Я первый раз в своей жизни писал код для МК!! До этого я даже близко не понимал, как и чего куда пихать нужно.
3. Я не умел читать нормально даташит.

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

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

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

[uquote="SpeedFighter",url="/forum/viewtopic.php?p=3255450#p3255450"]Я читал про прерывания и тупо не понимаю, куда для моего мк их пихать нужно.[/uquote]
Обработка дребезга.
Вам же сказали выше.
Берете TMR0 и делаете на нем прерывания с интервалом примерно 10...30 мс. И в обработчике этого прерывания читаете кнопки. Вот и вся защита.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

Я немного по-другому делаю: Так сложилось что, обычно, системный таймер всегда настраиваю на 1mS и, для дискретных мембранных кнопок, я выставляю время срабатывания 5mS и время отпускания 50mS.
По программе - на каждую кнопку один счётчик + два бита ("кнопка нажата" и "факт нажатия"; последний - для передачи в подпрограмму обработки нажатия кнопок).
Ответить

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