#include <delay.h> #include <stdlib.h> #define MAX 5
uint8_t arr[MAX] = {1, 2, 3, 4, 5 };
void view_flasher_1(void) { }
void view_flasher_2(void) { }
void view_flasher_3(void) {
}
void view_flasher_4(void) {
}
void view_flasher_5(void) {
}
void shuffle(uint8_t *array, size_t n) { if (n > 1) { size_t i; for (i = 0; i < n - 1; i++) { size_t j = i + rand() / (RAND_MAX / (n - i) + 1); uint8_t t = array[j]; array[j] = array[i]; array[i] = t; } } }
//=================== main ==========
//основаня функция void main(void){
//настройка портов PORTB=0b00000000; DDRB=0b00000000; PORTC=0b00000000; //порт С 4 первые по умолчанию 1 DDRC=0b00011111; //порт С 4 первые ноги на вывод PORTD=0b00000000; //порт D по умолчанию все ноги на 0 DDRD=0b00001111; //порт D все ноги на вывод
// ---------- рабочая часть ----------
while(1) {
shuffle(&arr, sizeof(arr)); for(uint8_t i = 0, i++, i <= MAX { view_flasher(arr[i]); } }
ругается CodeVisionAVR. на строчку uint8_t arr[MAX] = {1, 2, 3, 4, 5 }; чтобы я в скобках не писал может в CodeVisionAVR библиотеки какой не хватает
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
да ну его к черту этот CodeVisionAVR ! я уже вник/понял что да как , а он все не тот синтаксис, ошибка... целую неделю провозился так и не поборол CodeVisionAVR . никого не хочу обидеть, но какая то "древняя" программа даже почти и примеров нет в интернете.
сегодня примерно за час написал в ардуине. и она меня поняла, что я от нее хочу...
Спойлерvoid setup() { Serial.begin(9600); }
void loop() {
Serial.println("начало"); delay(2000); //---------- int effect[] = {0,1,2,3,4,5,6,7,8,9}; const size_t n = sizeof(effect) / sizeof(effect[0]); for (size_t i = 0; i < n - 1; i++) { size_t j = random( n - i);
int t = effect[i]; effect[i] = effect[j]; effect[j] = t;
} for(uint8_t i = 0; i < n; i++) { int ef(effect[i]); //---------- switch(ef) { case 0: view_flasher_0(); break; case 1: view_flasher_1(); break; case 2: view_flasher_2(); break; case 3: view_flasher_3(); break; case 4: view_flasher_4(); break; case 5: view_flasher_5(); break; case 6: view_flasher_6(); break; case 7: view_flasher_7(); break; case 8: view_flasher_8(); break; case 9: view_flasher_9(); break; }
у меня еще один маленький вопросик в интернете после примеров иногда показывают результат типа виндувской командной строки это как делается в какой-то программе или среде есть такая возможность не прошивая атмегу посмотреть результат кода?
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый вечер уважаемые коты. Перехожу потихоньку с С на С++. Начал с лаподрыгинга. Установил в Atmel Studio 7 поддержку С++11. Нашел вот какой class на этом форуме. Откомпилировал. Пока задача минимум - вкрутить на любой пин лампочку и да будет свет. Ну и застрял на этом. Смотрю на этот class как на новые ворота. Как создать экземпляр, как передать параметры. Пока закоментировал многоточия в исходнике. Замысловатый какой то класс, но красивый. main.cppСпойлер
//Pin pin; //Ошибка отсутствия аргументов шаблона перед 'pin' //Pin.as_output(PORTB, PB0); //Pin.as_output(PB0);
while(1){ } }
pins_0.hppСпойлер
Код:
/* ATtiny 84 */ #ifndef PINS_H_ #define PINS_H_
#include <stdint.h> #include <avr/io.h>
// arbitrarly use PORT as base addres // произвольно использовать ПОРТ как базовый адрес enum base { A = (const uint16_t) &PORTB, B = (const uint16_t) &PORTB // C = (const uint16_t) &PORTC, // D = (const uint16_t) &PORTD };
template <base b, uint8_t /*...*/all_args>
class Pin { private: // Calculate DDR and PIN offsets from PORT // Рассчитайте смещения DDR и PIN из ПОРТА static constexpr int8_t dir_offset = &DDRB - &PORTB; static constexpr int8_t in_offset = &PINB - &PORTB;
// In C++11, constexpr functions can only contain one statement: return. // В C++11 функции constexpr могут содержать только один оператор: return.
// This forces recursiveness to be used // Это заставляет использовать рекурсивность struct recursive { // Funtion to terminate iteration // Функция завершения итерации static constexpr uint8_t bit_mask(){ return 0; }
// Recursive function // Рекурсивная функция
// Since this function is private, it can only receive the types of "all_args...", // that is uint8_t // Поскольку эта функция является частной, она может получать только типы "all_args ...", // то есть uint8_t template <typename first_arg_type, typename /*...*/ next_args_types> static constexpr uint8_t bit_mask(first_arg_type first_arg, next_args_types /*...*/ next_args){ return (1<<first_arg)|bit_mask(next_args/*...*/); } };
// This version is valid in C++14 only, constexpr functions have less limitations // Эта версия действительна только для C++14, функции constexpr имеют меньше ограничений. struct non_recursive { // нерекурсивный // put variadic arguments in static constant array for easy access // поместите вариативные аргументы в статический массив констант для облегчения доступа static constexpr int arg_count = sizeof/*...*/(all_args); static constexpr int params[arg_count]={ all_args /*...*/ };
static constexpr uint8_t bit_mask(){ uint8_t mask = 0; for (unsigned int i = 0; i < arg_count; i++) mask |= 1<<params[i]; return mask; } };
Gcc 10 для AVR с неплохой поддержкой С++20 появился еще раньше, чем для ARM, там снято множество ограничений и все делается значительно проще. В частности вместо рекурсивной bit_mask можно использовать свертку:
И наверно если действительно хочется понимать что там происходит, то для начала нужно писать свои простенькие классы... Pin должен принимать адрес порта и номер пина, главное чтобы никакие из этих параметров не были volatile, такое после С++11 уже не работает. А с группой пинов уже работают более сложные классы оперирующие списками пинов...
Зарегистрирован: Пт сен 02, 2016 08:19:31 Сообщений: 15
Рейтинг сообщения:0
Добрый день. вопрос новичка. Осваиваю Си для STM32(CUBEIDE, HAL). Правильно ли понимаю что Callback функция выполняется "внутри" прерывания? И соответвенно нужно стремится к минимизации кода в Callback функции.
хочу собрать метеостанцию атмега 328, LCD 2004 (0x27,20,4), RTC DS 3231 и чип памяти: AT24C32 (32 Кб), три кнопки и т.д. как высветить часы, дату, температуру, давление... все ясно
вопрос в седеющем: хочу нажать кнопку "set" и увидеть четыре строчки (потому что только четыре строчки в экране)температуры за сегодня и за предыдущее дни измеренную каждый день в назначенное время типа
нажать кнопку "минус" список прокрутится на три строчки ранее еще нажал - три сорочки ранее на "плюс" список к верху
данные температуры хранить в AT24C32 за ... на сколько позволит память
нашел https://microkontroller.ru/arduino-proj ... u-arduino/ смысл тот же , только они на карту памяти , а мне на AT24C32... и не понятно закончится память нужно с первой ячейки (Адрес RTC модуля 0х68) начинать запоминать данные , а "хвост" еще в конце............. и как записать число, мес, год(можно и без года) время, темпер (может двухмерный массив)??? одни вопросы ..............
Думаю, тут можно просто записывать всю структуру после самой старой по времени. Например, структура на 8 байтов (время - 4, температура - 2, давление -2.) Измеряем, ищем в eeprom где самая старая запись (по максимальному времени), записываем измеренное со смещением в 8 байтов. Для показа - аналогично, ищем самую последнюю, отображаем её и ещё предыдущие. При нажатии на кнопку - смещаемся назад на 24 байта.
у меня есть умная собака она все понимает, но сказать не умеет я такой же...
мне бы как говориться на пальцах объяснить, доходчиво как первокласснику если Вам не трудно, с примерами или че почитать... что б конкретно спросить. понимаете я даже не знаю с чего начать...
Найти самую старую запись - это пройтись в цикле по всему eeprom с шагом в размер структуры (8 байтов в примере выше) и искать самую старую запись по полю "время".
Как-то так: Спойлер
Код:
// Описание структуры, с результатами измерения: struct { uint32_t time; int16_t temperature; unt16_t pressure; } Data_t;
// Пишете функцию, которая умеет писать данные в eeprom по заданному адресу void write_to_eeprom(uint16_t ee_addr, void *data, size_t size);
// Пишете функцию, которая умеет читать данные из eeprom void read_from_eeprom(uint16_t ee_addr, void *data, size_t size);
// Функция, которая будет искать самую последнюю запись int16_t find_last_record() { int16_t idx = 0; uint32_t time = 0; Data_t last_data;
for (int16_t i = 0; i < EEPROM_SIZE / sizeof(Data_t); i++) { read_from_eeprom(i * sizeof(Data_t), &last_data, sizeof(Data_t)); if (last_data.time != 0xFFFFFFFF && last_data.time > time) { idx = i; } }
return idx; }
В общем, идея достаточно понятная, на мой взгляд. Главное тут - саму запись произвольных данных реализовать.
Последний раз редактировалось WiseLord Пт апр 02, 2021 21:27:34, всего редактировалось 1 раз.
Serzh2000, В качестве дополнения. Зная объем памяти, выделенный под буфер, для записи структур измерения и байтовый размер этой структуры, легко подсчитать количество уникальных записей в этом объеме и организовать кольцевой буфер. Указатель на адрес следующей записи я храню в ЕЕПРОМе. Т.о. знаю, что предыдущая по указателю, записанная структура содержит самые свежие данные. Время. Я запоминаю почасовые данные, поэтому мне достаточно считать и узнавать месяц, дату и текущий час. Я объединил эти числа и удалось "вписаться" в 16-битовое слово.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения