Заголовок сообщения: Формирование случайной импульсной последовательности
Добавлено: Сб дек 02, 2017 19:18:47
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
Здарова, ребята.
Тут делаю небольшое устройство (пишу на сишке) на базе пичка (PIC18F1230). Его задачи:
Спойлер1. По нажатию кнопки пуск - работать, по нажатию кнопки стоп - не работать. 2. Формировать импульсы постоянной длительности со случайными задержками (импульс - 30 мкс, задержка от 100 мкс до 400 мс). 3. Работает - горит зеленый светодиот, не работает - красный.
В ходе работы возникли следующие вопросы:
1. Как выбрать правильно МК под мою задачу?
СпойлерКак минимум, я могу предположить, что МК должен нормально работать с импульсами, имеющими длительность 30 мкс. Но сейчас, как мне кажется, любой, даже самый дешевый МК может это. Вот я выбрал PIC18F1230, но что-то мне кажется, что это не совсем рационально, т.к. я использую функции в работе только те, которые есть в каждом пичке.
2. Где можно в даташите посмотреть требования к окружающим условиям и к источнику питания (я в английском слаб, хотел бы просто ключевые слова получить, если можно)?
3. Как сделать задержку на определенное время?
СпойлерЧитал, что можно сделать задержку через циклы, но я не совсем понимаю, как приблизительно хотя бы прикинуть, сколько времени занимает выполнение одной пустой итерации цикла. Где-то читал, что цикл for выполняется за 3 такта, а частота моего внутреннего генератора вроде бы 4 МГц (Oscillator frequency), так вот, получается, что 1 итерация цикла задерживает работу на: t = 3/F = 3/(4*10^6) = 0,75 мкс. Я взял для уверенности 1 мкс. В итоге я потерпел фиаско, скажем, раз в 15 примерно. Прикладываю картинку выходного сигнала. Сигнал должен был длиться 15 мкс...
4. Как узнать, что кнопка нажата?
5. Является ли признаком быдло-кода использование оператора goto программировании МК на C?
6. Как правильно настроить биты конфигурации в МК (использую MPLAB X 4.05)? А то я фигню какую-то понастраивал.
7. Какой компилятор оптимальнее всего использовать для решения таких задач? И какие у него должны быть настройки?
Прикладываю все важные файлы (проект в протосе, мплабе, изображение пичка)
// CONFIG3L #pragma config PWMPIN = OFF // PWM Output Pins Reset State Control bit (PWM outputs disabled upon Reset) #pragma config LPOL = HIGH // Low-Side Transistors Polarity bit (Even PWM Output Polarity Control bit) (PWM0, PWM2 and PWM4 are active-high (default)) #pragma config HPOL = HIGH // High Side Transistors Polarity bit (Odd PWM Output Polarity Control bit) (PWM1, PWM3 and PWM5 are active-high (default))
// CONFIG3H #pragma config FLTAMX = RA5 // FLTA Mux bit (FLTA input is muxed onto RA5) #pragma config T1OSCMX = LOW // T1OSO/T1CKI MUX bit (T1OSO/T1CKI pin resides on RB2) #pragma config MCLRE = ON // Master Clear Enable bit (MCLR pin enabled, RA5 input pin disabled)
// CONFIG4L #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Reset on stack overflow/underflow enabled) #pragma config BBSIZ = BB256 // Boot Block Size Select bits (256 Words (512 Bytes) Boot Block size) #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled)
// CONFIG5L #pragma config CP0 = OFF // Code Protection bit Block 0 (000400-0007FF) (Block 0 is not code-protected) #pragma config CP1 = OFF // Code Protection bit Block 1 (000800-000FFF) (Block 1 is not code-protected)
// CONFIG5H #pragma config CPB = OFF // Code Protection bit (Boot Block Memory Area) (Boot Block is not code-protected) #pragma config CPD = OFF // Code Protection bit (Data EEPROM) (Data EEPROM is not code-protected)
// CONFIG6L #pragma config WRT0 = OFF // Write Protection bit Block 0 (000400-0007FF) (Block 0 is not write-protected) #pragma config WRT1 = OFF // Write Protection bit Block 1 (000800-000FFF) (Block 1 is not write-protected)
// CONFIG6H #pragma config WRTC = OFF // Write Protection bit (Configuration Registers) (Configuration registers are not write-protected) #pragma config WRTB = OFF // Write Protection bit (Boot Block Memory Area) (Boot Block is not write-protected) #pragma config WRTD = OFF // Write Protection bit (Data EEPROM) (Data EEPROM is not write-protected)
// CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit Block 0 (000400-0007FF) (Block 0 is not protected from table reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit Block 1 (000800-000FFF) (Block 1 is not protected from table reads executed in other blocks)
// CONFIG7H #pragma config EBTRB = OFF // Table Read Protection bit (Boot Block Memory Area) (Boot Block is not protected from table reads executed in other blocks)
// #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF.
#define SIGNAL 30 // Длительность сигнала в мкс #define DELMIN 100 // Минимальное время задержки в мкс #define DELMAX 400000 // Максимальное время задержки в мкс
void delay(int type); // Функция задержки void Prepare(void); // Функция подготовки МК
int main() { Prepare(); // Запуск подготовки МК while(1) // Бесконечный цикл, основная задача МК { delay(0); // Задержка межуд сигналами TRISB = 0b00010000; // Подаем на выход лог. единицу delay(1); // Длительность сигнала TRISB = 0b00000000; // Выставляем лог. ноль } return 0; }
void delay(int type) // Функция задержки { int N; // Локальная переменная для промежуточных присвоений if(type == 0) { N = DELMIN + rand() % DELMAX; // Формируем случайную задержку } else { N = SIGNAL; // Определяем длительность сигнала }
for(int i = 0; i <= N; i++) {} // Держим заданный лог. уровень }
// Подготовка МК void Prepare(void) { TRISA = 0b00000000; // Направление работы ножек порта А TRISB = 0b00010000; // Направление работы ножек порта В CMCON = 0x07; // Отключение компараторов PORTA = 0; // Очищаем порт А PORTB = 0; // Очищаем порт Б RBPU = 0; // Подтягивающие R (0-вкл, 1-выкл) }
Вложения:
Комментарий к файлу: Проект в PROTEUS Proteus.rar [44.9 KiB]
Скачиваний: 254
Комментарий к файлу: Проект в MPLAB Programm.X.rar [69.14 KiB]
Скачиваний: 255
Задача действительно простая и может быть реализована практически на любом контроллере, желательно с модулем CCP (Capture-Compare-PWM). Этот модуль позволит аппаратно получать импульсы в 30 мкс. Но можно и без него, просто дергая ногой с программной задержкой в 30 мкс. Единственное, что Вы не сможете получить - True Random. Любая случайная функция будет ПСЕВДОслучайной, то есть иметь какой то интервал повторения. Узнать нажатие кнопки можно опросом порта и маскированием бита на котором висит кнопка. Опрос следует проводить с интервалом большим, чем время дребезга кнопки. Это позволит защититься от этого самого дребезга. Обычно хватает интервала 10...30 миллисекунд. Совершенно непонятно зачем Вам goto для такой задачи. И таки да, на Си этот оператор применять не следует без каких то совершенно безвыходных случаев (я таких не встречал). Температурный диапазон и требования к питанию указаны в разделе электрических параметров (в конце даташита). Факт того, что Вы их не нашли, означает, что Вы их и НЕ ПЫТАЛИСЬ искать. Достаточно посмотреть оглавление. Незнание английского тоже не аргумент, нынче гуглопереводчик доступен так же, как и сам гугол. Выбор Вами контроллера совершенно не обоснован. Ну разве только он единственный есть в наличии. Это очень старый МК и весьма дорогой.
Это не решение. Это хуже, чем псевдослучайная функция. Патамушта случайная функция подразумевает на выходе белый шум в спектральном интервале квантования, а с WDT получится корреляция с питанием и температурой. А это совсем не случайные величины. То есть матожидание будет следовать за этими величинами. Если человек решает задачи криптографии, то простым будет генератор шума на стабилитроне и ОУ. Сигнал подаем на АЦП и имеем тот самый True Random. А если это типа" елочной гирлянды", то даже тупое повторение таблицы из 256 значений даст более чем отличный результат.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Задача действительно простая и может быть реализована практически на любом контроллере, желательно с модулем CCP (Capture-Compare-PWM). Этот модуль позволит аппаратно получать импульсы в 30 мкс. Но можно и без него, просто дергая ногой с программной задержкой в 30 мкс. Единственное, что Вы не сможете получить - True Random. Любая случайная функция будет ПСЕВДОслучайной, то есть иметь какой то интервал повторения. Узнать нажатие кнопки можно опросом порта и маскированием бита на котором висит кнопка. Опрос следует проводить с интервалом большим, чем время дребезга кнопки. Это позволит защититься от этого самого дребезга. Обычно хватает интервала 10...30 миллисекунд. Совершенно непонятно зачем Вам goto для такой задачи. И таки да, на Си этот оператор применять не следует без каких то совершенно безвыходных случаев (я таких не встречал). Температурный диапазон и требования к питанию указаны в разделе электрических параметров (в конце даташита). Факт того, что Вы их не нашли, означает, что Вы их и НЕ ПЫТАЛИСЬ искать. Достаточно посмотреть оглавление. Незнание английского тоже не аргумент, нынче гуглопереводчик доступен так же, как и сам гугол. Выбор Вами контроллера совершенно не обоснован. Ну разве только он единственный есть в наличии. Это очень старый МК и весьма дорогой.
1. Про рандом я знаю, что получаю псевдослучайное число. 2. Спасибо, некоторые нужные строчки в даташите нашел. 3. А какой тогда из современных и недорогих пичков (именно пичок хочу) можно взять?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
3. Полагаю, что PIC12F1822 Вас устроит. Если кварцевая точность 30 мкс не нужна (1...2% разброса устроит), то можно еще понизить цену и взять PIC12F1501, а может и PIC10F322. Последний вообще в корпусе SOT23-6, что сделает устройство суперкомпактным.
Заголовок сообщения: Re: Формирование случайной импульсной последовательности
Добавлено: Вс дек 03, 2017 10:54:42
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
__delay_us и __delay_ms - это не функции, а встроенные в компилятор макросы. По этому, переменную в них передавать нельзя. Если хотите с переменной, то пишите свою функцию. Но учтите, что частота процессора при этом должна быть достаточной, чтобы отработать 1 цикл в функции задержки за 1 us.
__delay_us и __delay_ms - это не функции, а встроенные в компилятор макросы. По этому, переменную в них передавать нельзя. Если хотите с переменной, то пишите свою функцию. Но учтите, что частота процессора при этом должна быть достаточной, чтобы отработать 1 цикл в функции задержки за 1 us.
Вот проблема как раз в том, что я сам писал задержку через пустой цикл for, но увы, потерпел фиаско, слишком неточно.
TRISA/TRISB - означает Tri-state - третье состояние, то есть отключенное состояние ВЫХОДНОГО буфера. Таким образом, 1 в регистре TRIS означает чистый вход, а 0 - выход и вход одновременно (можно прочесть значение выхода). Не забывайте, что помимо ТRIS ногой управляет аналоговая функция этой ноги, если она присутствует. Включение аналоговой функции отключает цифровой вход.
Посмотри здесь. После получения случайного числа используй модуля ССР в режиме "сравнение установка выхода в 1/0" (compare set/clear output) для получения своей последователности.
Заголовок сообщения: Re: Формирование случайной импульсной последовательности
Добавлено: Вт дек 05, 2017 15:37:49
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
Спасибо.
А вот я что ещё прикинул:
Есть функция srand(чиселка), которая выполняет инициализацию генератора случайных чисел rand(). С помощью неё я хочу и запустить псевдогенератор на пички, вставляя в srand предыдущее сгенерированное число. А первое число можно получить из rand(), например.
Первое число лично я получаю следующим образом: сразу после подачи питания (определяю по флагам), еще до того момента, когда Си очистит память статических переменных, подсчитываю CRC16 всей памяти, что доступна, ну или заметного её куска. И уже эту CRC использую в качестве стартового для srand. Так как после подачи питания RAM имеет случайное состояние, получается почти настоящая случайность. Во всяком случае получше srand(rand()), что вы предложили.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Заголовок сообщения: Re: Формирование случайной импульсной последовательности
Добавлено: Ср дек 06, 2017 21:16:12
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
На PIC18F1230 я сделал, все работало, пусть и через костыли (не смог отключить АЦП на выводах RA0 и RA1, подключил к другим - все работало). На PIC10F322 - все не так гладко. Почему-то не загорается красный светодиод при отсутствии входных сигналов.
Вообще непонятна история с двумя кнопками на одном входе. Что автор хотел получить? Впрочем, со светодиодами такая же история. Светодиоды нельзя будет погасить оба.
LVP = 1 - MCLR/Vpp pin is MCLP. Weak Pull-Up is enabled.
Твой код не может определить 1 на входе. Там всегда есть 1.
А как убрать её?
#pragma config LVP = OFF - не помогает.
КРАМ писал(а):
Вообще непонятна история с двумя кнопками на одном входе. Что автор хотел получить? Впрочем, со светодиодами такая же история. Светодиоды нельзя будет погасить оба.
Нажатая кнопка включения - все работает. Не нажата кнопка включения или нажата кнопка выключения - МК не генерирует сигнал, только светодиод красный горит. На PIC18F1230 у меня все работало, тут же - нет.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения