Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
По вашей схеме: нажатая кнопка - "0". По программе: Если на всех входах "1" (кнопки отпущены) - проход программы с зацикливанием на "BCF PORTA, 0x2" (без возврата в начало программы).
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
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 на СИ".
Заголовок сообщения: Re: Формирование случайной импульсной последовательности
Добавлено: Пт дек 08, 2017 21:19:16
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
Вот я тогда хотел ещё спросить. Функции srand и rand дико едят память микроконтроллера. Где можно прочитать про то, как сделать функцию с ассемблерной вставкой, в которую я впихну генерацию псевдослучайную генерацию по заданному диапазону?
Первое число лично я получаю следующим образом: сразу после подачи питания (определяю по флагам), еще до того момента, когда Си очистит память статических переменных, подсчитываю CRC16 всей памяти, что доступна, ну или заметного её куска. И уже эту CRC использую в качестве стартового для srand. Так как после подачи питания RAM имеет случайное состояние, получается почти настоящая случайность. Во всяком случае получше srand(rand()), что вы предложили.
2. Чему равно 512 Words of Flash Program Memory в байтах?
3. Правильно ли я прикинул алгоритм быстродействия функции задерки (по disassembly listing):
а) Посчитал число строк в функции задержки без учета цикла задержки б) Посчитал среднее число тактов для всех инструкций без учета цикла задержки в) Заплакал г) Посчиитал п. а) и п. б) для инструкций внутри цикла, прибавил ещё примерно 8 тактов (суммарно) за __delau_us(x) и сам цикл фор. д) Посчитал время выполнение одной операции в микросекунду е) Составил уравнение: (180 + 80*N)*0.0625 = макс/мин задержка в мкс Получилось, что N примерно равно 18 и 79998 для мин. и макс. задержки.
В протосе, при моделировании, не нарушаются заданные условия (как показалось).
// Параметры микроконтроллера #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; // Установка режима МК (выкл) } } }
/* Конгруэнтный метод - простой спобо для генерации случайных чисел, * имеет следующий алгоритм: * 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); } }
SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками? У вас же есть таймер и вы можете работать по прерываниям.... По уму, обработка "дребезга" делается по системному таймеру не мешая работать другим подпрограммам. Не понимаю как можно писать программу под конкретный контроллер, не зная его ресурсов.....
---------- /Если изучали построение схем на "логике" с общим тактированием - это может быть лучшей подсказкой для написания программы/
SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?
Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера. А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что kit это не большое млекопитающее а набор инструментов ).
SpeedFighter, Признайтесь, кто вас учил тормозить работу контроллера программными задержками?
Судя по идиотскими стилю, кто-то из "птенцов гнезда" Пастера. А на С там перешли единицы , тима носов с лабкита (который до сих пор не знает что kit это не большое млекопитающее а набор инструментов ).
Я не понимаю, о чем ты, но:
1. Если я не знаю и не понимаю одного метода - сделал так, как смог. 2. Я первый раз в своей жизни писал код для МК!! До этого я даже близко не понимал, как и чего куда пихать нужно. 3. Я не умел читать нормально даташит.
А лабкид - да, использовал, так как на этом сайте раньше других нашел способ установки банальной лог. единицы на выход МК. Откуда я могу знать о качестве информации, если я никогда до этого её не нюхал?!
Я читал про прерывания и тупо не понимаю, куда для моего мк их пихать нужно.
Обработка дребезга. Вам же сказали выше. Берете TMR0 и делаете на нем прерывания с интервалом примерно 10...30 мс. И в обработчике этого прерывания читаете кнопки. Вот и вся защита.
Я немного по-другому делаю: Так сложилось что, обычно, системный таймер всегда настраиваю на 1mS и, для дискретных мембранных кнопок, я выставляю время срабатывания 5mS и время отпускания 50mS. По программе - на каждую кнопку один счётчик + два бита ("кнопка нажата" и "факт нажатия"; последний - для передачи в подпрограмму обработки нажатия кнопок).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения