Формирование случайной импульсной последовательности
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
Что за FOSC = EC???
Вы от внешнего тактирования работаете?
Вы от внешнего тактирования работаете?
- Реклама
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
Тогда зачем вы выбрали внешнее тактирование (вместо внутреннего)?
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
#pragma config FOSC = INTOSC
Так нужно?
Я плохо английский знаю, поэтому я этот бит оставил таким, каким мне конфигуратор предложил.
Но это не изменяет ситуацию, кнопки все равно работают не так, как я описал в программе.
Так нужно?
Я плохо английский знаю, поэтому я этот бит оставил таким, каким мне конфигуратор предложил.
Но это не изменяет ситуацию, кнопки все равно работают не так, как я описал в программе.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
По вашей схеме: нажатая кнопка - "0".
По программе: Если на всех входах "1" (кнопки отпущены) - проход программы с зацикливанием на "BCF PORTA, 0x2" (без возврата в начало программы).
По программе: Если на всех входах "1" (кнопки отпущены) - проход программы с зацикливанием на "BCF PORTA, 0x2" (без возврата в начало программы).
- Реклама
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
А почему так?
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
Ещё раз: Я не знаю Си, но по факту, у вас:
Добавлено after 2 minutes 55 seconds:
P.S.
Попробуйте задать вопрос в теме "Программирование pic на СИ".
Код: Выделить всё
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
P.S.
Попробуйте задать вопрос в теме "Программирование pic на СИ".
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
В общем, я сделал так:
1. Поменял сопротивления резисторов R1 на R2, а R2 на R1.
2. Изменил сопротивление кнопки в разомкнутом состоянии на 500 МОм.
Теперь кнопки работают так, как должны.
1. Поменял сопротивления резисторов R1 на R2, а R2 на R1.
2. Изменил сопротивление кнопки в разомкнутом состоянии на 500 МОм.
Теперь кнопки работают так, как должны.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
Я говорил по вашей схеме от Пт дек 08, 2017 18:25:00 .
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
Вот я тогда хотел ещё спросить. Функции srand и rand дико едят память микроконтроллера.
Где можно прочитать про то, как сделать функцию с ассемблерной вставкой, в которую я впихну генерацию псевдослучайную генерацию по заданному диапазону?
Где можно прочитать про то, как сделать функцию с ассемблерной вставкой, в которую я впихну генерацию псевдослучайную генерацию по заданному диапазону?
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
Если устроит генератор ПСП и разберётесь с кодом - у меня можете "содрать".
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
В общем, переделал я.
ГСЧ - конгруэнтный линейный метод.
С прерываниями я не разобрался, поэтому, увы, пришлось оставить часть кода неизменной.
Хотел бы только узнать некоторые детали:
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 для мин. и макс. задержки.
В протосе, при моделировании, не нарушаются заданные условия (как показалось).
Вот код:
Вот схема:

ГСЧ - конгруэнтный линейный метод.
С прерываниями я не разобрался, поэтому, увы, пришлось оставить часть кода неизменной.
Хотел бы только узнать некоторые детали:
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: Формирование случайной импульсной последовательности
а как написано в этом сообщении - это сложно или по другим причинам не подходит?SpeedFighter писал(а):1. Как просто можно получить случайное целое число для начального значения, как описано в этом сообщении
на сколько я могу понять смысл слова word, то 512 words = 1024 bytesSpeedFighter писал(а):2. Чему равно 512 Words of Flash Program Memory в байтах?
я бы плакал через строку...SpeedFighter писал(а):3. Правильно ли я прикинул алгоритм быстродействия функции задерки
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
[uquote="ARV",url="/forum/viewtopic.php?p=3255398#p3255398"]
Сложно в понимании, да и примеров я не нашел годных.
а как написано в этом сообщении - это сложно или по другим причинам не подходит?[/uquote]SpeedFighter писал(а):1. Как просто можно получить случайное целое число для начального значения, как описано в этом сообщении
Сложно в понимании, да и примеров я не нашел годных.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?
У вас же есть таймер и вы можете работать по прерываниям....
По уму, обработка "дребезга" делается по системному таймеру не мешая работать другим подпрограммам.
Не понимаю как можно писать программу под конкретный контроллер, не зная его ресурсов.....

-------------------
/Если изучали построение схем на "логике" с общим тактированием - это может быть лучшей подсказкой для написания программы/
У вас же есть таймер и вы можете работать по прерываниям....
По уму, обработка "дребезга" делается по системному таймеру не мешая работать другим подпрограммам.
Не понимаю как можно писать программу под конкретный контроллер, не зная его ресурсов.....
-------------------
/Если изучали построение схем на "логике" с общим тактированием - это может быть лучшей подсказкой для написания программы/
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
Я же говорю, я первый раз в жизни сел и начал кодить для МК.
Я читал про прерывания и тупо не понимаю, куда для моего мк их пихать нужно.
Я читал про прерывания и тупо не понимаю, куда для моего мк их пихать нужно.
Re: Формирование случайной импульсной последовательности
[uquote="Albert_V",url="/forum/viewtopic.php?p=3255432#p3255432"]SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?[/uquote]
Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера.
А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что kit это не большое млекопитающее а набор инструментов ).
Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера.
А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что kit это не большое млекопитающее а набор инструментов ).
-
SpeedFighter
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 28, 2017 19:07:32
Re: Формирование случайной импульсной последовательности
[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. Я не умел читать нормально даташит.
А лабкид - да, использовал, так как на этом сайте раньше других нашел способ установки банальной лог. единицы на выход МК. Откуда я могу знать о качестве информации, если я никогда до этого её не нюхал?!
Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера.
А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что 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 мс. И в обработчике этого прерывания читаете кнопки. Вот и вся защита.
Обработка дребезга.
Вам же сказали выше.
Берете TMR0 и делаете на нем прерывания с интервалом примерно 10...30 мс. И в обработчике этого прерывания читаете кнопки. Вот и вся защита.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Формирование случайной импульсной последовательности
Я немного по-другому делаю: Так сложилось что, обычно, системный таймер всегда настраиваю на 1mS и, для дискретных мембранных кнопок, я выставляю время срабатывания 5mS и время отпускания 50mS.
По программе - на каждую кнопку один счётчик + два бита ("кнопка нажата" и "факт нажатия"; последний - для передачи в подпрограмму обработки нажатия кнопок).
По программе - на каждую кнопку один счётчик + два бита ("кнопка нажата" и "факт нажатия"; последний - для передачи в подпрограмму обработки нажатия кнопок).


