Easyelectronics.ru

Электроника для всех
Текущее время: 18 июл 2019, 10:16

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 06 авг 2018, 18:01 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
VladyMile писал(а):
Требуется полное повторение описания переменной в экстерне или достаточно её упоминания?

С переменными ситуация ровно та же, что и с функциями - компилятор видит только то, что перед ним, следовательно он должен видеть правильное объявление. Два отличия: 1) если у переменной есть инициализация, то в объявлении она не нужна и 2) перед объявлением должен стоять extern.
Типа такого:

Код:
(.с)
...
volatile uint16_t event = EVENT_NONE;
uint32_t ADC_Data[ADC_DATA_BUFFER_SIZE] = {};
...
(.h)
...
extern volatile uint16_t event;
extern ADC_Data[ADC_DATA_BUFFER_SIZE];
...


Если на пальцах: в .с объявление( + инициализация), в .h - только объявление (если есть что-то после = то его отбрасываем) + перед ним extern.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 00:02 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Благодарю за пояснения, Жень.

В мастере сейчас актуальный код.
Не компилится.
30 ошибок.
Надо разбирать построчно - что не так. Потому что моих знаний недостаточно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 01:49 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
Ну дык вы еще те ошибки, о которых писали вам не поправили. Уже два раза между прочим писали. Никаких "int a = 10;" в .h файлах. Никаких extern static - либо extern, если где-то еще надо, либо просто static, только в .c файле.
К тому же советую завести Makefile, с ним удобнее.
Поправил исключительно синтаксические ошибки. Логику не разбирал.
Код:
$ make clean && make
rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o main.s
avr-gcc -DF_CPU=8000000  -Os -Wall -mmcu=atmega328p -c adc.c -o adc.o
avr-gcc -DF_CPU=8000000  -Os -Wall -mmcu=atmega328p -c buttons.c -o buttons.o
avr-gcc -DF_CPU=8000000  -Os -Wall -mmcu=atmega328p -c gtimer.c -o gtimer.o
gtimer.c: In function ‘GTimer_Init’:
gtimer.c:43:22: warning: unused variable ‘GTDelay’ [-Wunused-variable]
  static volatile u64 GTDelay[MAX_GTIMERS] = {0};   // обнуляем все задержки
                      ^
gtimer.c:42:22: warning: unused variable ‘GTStates’ [-Wunused-variable]
  static volatile u08 GTStates[MAX_GTIMERS] = {0};  // "STOP"-арим все таймеры
                      ^
avr-gcc -DF_CPU=8000000  -Os -Wall -mmcu=atmega328p -c leds.c -o leds.o
avr-gcc -DF_CPU=8000000  -Os -Wall -mmcu=atmega328p -c main.c -o main.o
avr-gcc -DF_CPU=8000000  -Os -Wall -mmcu=atmega328p -o main.elf adc.o buttons.o gtimer.o leds.o main.o
rm -f main.hex main.eep.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size main.hex
   text    data     bss     dec     hex filename
      0    2300       0    2300     8fc main.hex

Пушить не буду, просто патч. Это с бранча adc_Vlady.
Show под катом патч


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 10:31 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Послезавтра (уже в отпуске буду!) проверю ещё раз.
adc_Vlady уже "давно" неактуален - был слит с мастером, после чего правился мастер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 10:59 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
Сорри, проглядел последний комментарий, по памяти прошлый помню что в бранче актуальная версия была. Сейчас гляну мастера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 11:14 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
Пока из очевидного - нельзя применять типы переменных (u08/uint8_t) к константам (в #define). Писать "#define N (u08)123" нельзя. Вы же потом это не к переменной применяете, а как константу используете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 11:15 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
Тем более вот так нельзя:
Код:
  K_ancillary[LapTime] = u08MAX << (u08 ADC_K_EXPONENT);


EDIT:
Не надо стремиться все дефайны заключать в (). Оно же ошибки генерит. Какой еще do {} while в скобках? Поймите - do {} while - это не константа. Это кусок кода. Следовательно #define данный - макрос подстановки кода. Вы же в main() не напишите код:
Код:
void main() {
  ( do {
      lalala();
    } while (0);
  )
}

Скобки тут явно лишние. Также лишние они и в макросе.
Но в leds.h do {} while снова лишний совсем.

static переменные используемые в рамках одного юнита (файла) не надо выносить в .h. Тем более писать "extern static". Об этом уже писали, но в мастере всё-равно полно таких.


Последний раз редактировалось NStorm 07 авг 2018, 14:41, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 11:41 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
https://github.com/VladyMile/Smart-Fan-Timer/pull/1

Собирается без ошибок и предупреждений, синтаксические ошибки все поправил:
Код:
$ make
avr-gcc -Os -std=c11 -Wall -DF_CPU=8000000       -mmcu=atmega328p  -c adc.c -o adc.o
avr-gcc -Os -std=c11 -Wall -DF_CPU=8000000       -mmcu=atmega328p  -c buttons.c -o buttons.o
avr-gcc -Os -std=c11 -Wall -DF_CPU=8000000       -mmcu=atmega328p  -c gtimer.c -o gtimer.o
avr-gcc -Os -std=c11 -Wall -DF_CPU=8000000       -mmcu=atmega328p  -c leds.c -o leds.o
avr-gcc -Os -std=c11 -Wall -DF_CPU=8000000       -mmcu=atmega328p  -c main.c -o main.o
avr-gcc -Os -std=c11 -Wall -DF_CPU=8000000       -mmcu=atmega328p  -o main.elf adc.o buttons.o gtimer.o leds.o main.o
rm -f main.hex main.eep.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size main.hex
   text    data     bss     dec     hex filename
      0    2332       0    2332     91c main.hex

В логике работы по прежнему не разбирался и не лез туда - это уж вам оставляю )

PS: Atmega328P взята "от фонаря", в Makefile сами пропишите ваш МК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 14:23 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
NStorm писал(а):
1) https://github.com/VladyMile/Smart-Fan-Timer/pull/1 Собирается без ошибок и предупреждений, синтаксические ошибки все поправил

2) В логике работы по прежнему не разбирался и не лез туда - это уж вам оставляю )

3) Atmega328P взята "от фонаря"
1) Благодарю за правки - буду смотреть и учиться. Ваши замечания понимаю, но не всегда смекаю даже очевидные вещи, например, про статик и экстерн (сейчас-то допёр).

2) Благодарю :)))

3) Atmega328P взята правильно - их у меня как грязи, под неё и проект.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 14:47 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Вопрос (см. gtimer.c):

Понятно, что нам почти всё равно, сколько времени длится инициализация - всё равно доли секунды.
Но я предпочёл отказаться от for в пользу простой записи в нужные массивы нужных u08- и u64-значений - это чуть-чуть быстрее.
Хотя, я согласен, for - чуть более читабельнее, "логичнее".

Вы же отказались от моей "прямой записи" и вернули к жизни мой закомменченный for.

for на AVR выполняется, конечно, очень быстро, но ведь всё равно медленнее, чем просто запись массивов u64 и u08.

Почему вы выбрали именно for (чтобы мне на будущее)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 15:06 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1929
Откуда: Харьков
Цитата:
Хотя, я согласен, for - чуть более читабельнее, "логичнее".

по идее ваш цикл развернется просто в вызовы и все.
там нет ни условий ни выходов неопределенных заранее. Посмотрите что компилятор собрал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 16:11 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
VladyMile, а вы попробуйте ваш вариант вернуть и скомпилировать - ошибка будет. Нельзя в массив записывать так. Значения массива через type array[] = { } можно задать только на этапе инициализации переменной, т.е. определения. А если её определять в функции, то она будет локальна только для данной функции. Чтобы "просто записать в нужные массивы" нули, надо именно в цикле пройтись по каждому значению. Ну или использовать например memset(), как я вначале сделал, но потом отказался (посмотрите промежуточный коммит).

PS: Под промежуточной правкой я вот это имел в виду: https://github.com/VladyMile/Smart-Fan- ... 2d83a3279f


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 07 авг 2018, 17:18 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Я видел и теперь вроде понял (но "понял" не до уровня "сам умею применять", а до "блин, нихрена не понятно как тут надо правильно; где бы живого кода ещё посмотреть?").


Ассемблер я не читаю от слова почти совсем.
То есть когда носом в код тыкают - я просто верю.
Ещё знаю про 16 и 17 регистры, но почему они такие важные - я не в курсе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 16 авг 2018, 00:25 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Думал, в отпуске будет больше времени на код.
Ага.
За все эти дни даже гит на ноутбук не удосужился поставить. :)

Короче, проект на паузе :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 27 авг 2018, 21:19 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Пока в отпуске. Ручки чешутся, но близкие не дают расслабиться :)
Ничего, завтра возвращаемся.

Сегодня сел вспомнить код и нашёл пример, почему я не могу нутром прочувствовать и научиться "влёт" понимать приведение типов:
Код:
// Вроде инициируем массив как u16

static u16 K_ancillary[ADC_INPUTS];   // вспомогательный массив, хранящий "коэффициенты
                           // усреднения" для ADC_Average_Filter_...
и тут же внутри функции вписываем в него u08-значение:
Код:
void ADC_Average_Filter_Init() {

   K_ancillary[LapTime] = (u08)(u08MAX << ADC_K_EXPONENT);

}
Это ошибка или так можно?
Если можно, то почему так можно?
Можно не подробно, просто "направить моё понимание".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 27 авг 2018, 21:59 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1929
Откуда: Харьков
Если на пальцах то в бОльшую ячейку (u16) памяти может же влезть мЕньшая (u08) ? :)
Просто остальное добьется нулями.
Наоборот напрямую нельзя, но через приведение можно так:
u08 var08 = 0;
u16 var16 = 0xABCD;
var08 = (u08)var16; //что-то обрежется, но что? :)
Что будет в var08 ? ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 27 авг 2018, 22:19 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Доходчиво. Благодарю. Всё-тки нет ничего эффективней прямого обучения.
М-м-м-м...
Поскольку по моему мнению паровозик данных едет от младших к старшим, то в вар08 окажется "старший регистр".
А вот если паровозик едет от старших к младшим, то окажется младший.
Как же ездит паровозик?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 27 авг 2018, 23:53 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
Младший останется всегда разряд, т.к только он может поместится. По сути, это ведь всё-равно, что написать
u08 var08 = 0xABCD
0xAB00 сюда "не влезет" и уйдет, останется 0xCD.

Это в стандарте C записано. Но верно только для unsigned integer. Для чисел со знаком уже зависит от платформы и компилятора, в стандарте т.е. поведение не определено.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 28 авг 2018, 00:36 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1929
Откуда: Харьков
Ну а если чтоб совсем просто запомнить - то помните решали столбиком в школе? Вот оно самое:
Код:
0x1234567890ABCDEF  //very long word
0x        90ABCDEF  //doubleword
0x            CDEF  //word
0x              EF  //byte

Вот такая матрешка получается.
Если впихивать меньшее в большее то все что слева заполнится нулями, ну а наоборот только приводить к типу и так же все что слева обрежется до нужного типа, иначе нельзя впихнуть невпихуемое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 28 авг 2018, 00:43 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1929
Откуда: Харьков
NStorm писал(а):
Младший останется всегда разряд, т.к только он может поместится. По сути, это ведь всё-равно, что написать
u08 var08 = 0xABCD
0xAB00 сюда "не влезет" и уйдет, останется 0xCD.

запись вида u08 var08 = (u08)var16 наглядней тем, что мы как бы уже сами говорим: эй, отрежь ка нам от переменной слева столько, чтоб она влезла в (u08).
Так же и если записать: u16 var16 = (u16)var08 - получаем обратное - эй, добавь ка нам до var08 столько нулей слева, чтоб получилось u16.
Сама запись типа слева от переменной как бы намекает :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 28 авг 2018, 14:23 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2031
Кстати, полно онлайн компиляторов, где можно смотреть результат действий и проверять различные вещи. Вот например: http://tpcg.io/vvtFtB


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 29 авг 2018, 12:24 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
Благодарю, мужики.
С этим вроде разобрался :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 29 авг 2018, 12:55 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5270
VladyMile писал(а):
Это двухканальный "умный" таймер для двух компьютерных (12-вольтовых) вентиляторов с встроенным мониторингом их исправности для применения в системе вытяжки на кухне, в гараже и т.п.


задача выбрана правильная) для обучения самое то, вполне интересная
сам делал подобное и для DC и для AC вентиляторов

наивно думать, что DC вентиляторы от компов можно применять для помещений любого плана будь то озвученные кухня или гараж
по прокачиваемому объему компьютерные вентиляторы для этого совершенно не подходят
минимум применяемый для помещений это вентиляторы на 100м3 в час, для компьютерных не достижимо
поэтому если хочется именно DC то разумно под этим понимать вентиляцию небольших по обьему боксов или корпусов
я применяю такие для вентиляции рабочего шкафа со встроенным оборудованием и компьютером, для смарт вентиляции мощных ACDC блоков питания, для вентиляции системы охлаждения шпинделя ЧПУ станка.

если нужна задача именно по помещениям то нужен проект AC. здесь будет уже или высоковольтный ФИМ или ШИМ. вполне рабочее решение

с точки зрения органов управления - чем меньше тем лучше, но продумать эргономику
для одноканального контроллера из моей практики вполне хватает одной кнопки, с ее помощь можно настраивать и желаемую температуру и еще от одного до нескольких параметров. тем более что параметры подобного рода контроллеров не меняют часто и всякие энкодеры или потенциометры по большому счету избыточны, а все что избыточно зло))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 13 сен 2018, 11:42 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2519
Откуда: Русь, Новороссийск
axill, это уже четвёртая инкарнация контроллера вентиляторов, в ней учтены все прошлые ошибки и юзабилити.
Спасибо на добром слове :)
Код:
#define ABS(n) (((n) >= 0) ? (n) : -(n))
Народ, меня знак минус смущает отсутствием скобок. Так можно писать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Smart Fan Timer
СообщениеДобавлено: 13 сен 2018, 12:29 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
VladyMile писал(а):
Код:
#define ABS(n) (((n) >= 0) ? (n) : -(n))
Народ, меня знак минус смущает отсутствием скобок. Так можно писать?

Так нужно писать. n вполне может быть выражением и менять знак надо для всего выражения. Еще стоит почитать приоритеты операций. Унарный минус имеет один из самых высоких приоритетов, так что что бы там ни было в скобках, он отработает правильно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB