0
А у Вас не закралась ошибка в таблицу синуса?
Там где два слэша, два раза повторяется значение 240.

Я построил такую же таблицу синуса для индексов от 0 до 124 по модулю 100 и сравнил их.
И как раз с этого места значения стали сдвинуты на 1 отсчет.
+6
Ждем статью о ремонте котла после замерзания.
+1
Был такой случай — коллеги заживляли на проце то ли UART, то ли SPI, не помню что, но зависящее от частоты кварца. И обнаружили, что частота немного ниже, чем расчетная. Думали кварц неправильный, перерыли литературу про работу кварцов, добавили кондеры, ! ВЫВЕЛИ ! частоту на нужную, а оказалось просто в делитель частоты нужно было записать число на 1 меньшее!
  • avatar
  • DmitryFx
  • 28 октября 2014, 00:24
0
Пардон, продолжу
Сумма ряда 1/(2^2n + 1) = 1/3

Алгоритм фактически вычитает из ряда 1/(2^2n) ряд 1/(2^2n + 1) и получается 1/3
0
Сумма ряда 1/(2^n) = 1.0
Сумма ряда 1/(2^2n) = 2/3
0
Вообще M37512 микроконтроллер, а вот прошивка это секрет фирмы. Как раз и делают так, чтобы блокировались. Продавать новое выгодно.
0
Дело в том, что у меня есть лишние банки на замену и сварочник. Да и когда брату менял все нормально было.
0
Надеюсь DI меня за это не отпинает. Ищи Тверь Связьприбор LanTest. Там еще и фотка моя есть ))
  • avatar
  • DmitryFx
  • 13 октября 2012, 11:50
0
У кабелей есть такой параметр как коэффициент укорочения — это отношение скорости света в вакууме к скорости распространения сигнала. Он варьируется для разных конструкций кабелей. Поэтому сразу ткнув прибор в кабель с известной длиной и увидев не ту цифру можно подумать, что все плохо. Но на самом деле все не так. Для UTP данный коэффициент приблизительно равен 1.45 — 1.55. Подобрав его под используемый кабель можно добиться точности 0.1 м на 20 метрах и 0.5 до сотни.
Правда я сделал отображение длин до 20 метров с точностью 0.1 м, а длин больше 20 метров, до 1 метра (целое число). На практике этого вполне достаточно. Максимум, что мерял — бухту 350 м.
Затухание и NEXT в позиции курсора показывается с точностью 0.1 Дб (см. структуру меню), а в отчете округляется до целого числа Дб.
  • avatar
  • DmitryFx
  • 10 октября 2012, 19:58
0
Насчет дубовости прибора это Вы абсолютно правильно сказали. У нас был случай, когда прибор подобного назначения сделали полностью сенсорным, а потом удивлялись почему такое решение не понравилось пользователям. Вариант с кнопками пошел на ура.

Этот прибор переделывать под сенсорный не буду. Придумаю что-нибудь другое.
  • avatar
  • DmitryFx
  • 10 октября 2012, 13:00
0
Блок схемы делал в онлайн редакторе www.gliffy.com
Для сохранения результатов там просят зарегистрироваться, а я просто содрал PrintScreen-ом.
  • avatar
  • DmitryFx
  • 10 октября 2012, 12:18
0
Вы все правильно поняли насчет .h файлов. Я напишу отдельную статью и разберу как это работает. И спасибо за объяснение.
  • avatar
  • DmitryFx
  • 10 октября 2012, 01:11
0
Из-за корпуса. Он у нас серийный.
А следующий прибор конечно хочу делать на дисплее с сенсорным экраном.
  • avatar
  • DmitryFx
  • 10 октября 2012, 00:53
0
Да, действительно. При таком способе, все глобальные переменные и все функции общие для всех модулей.
Наверно мне не встречался случай, когда было нужно, чтобы какая-то глобальная переменная была видна только нескольким модулям и не видна остальным. Чем это плохо? Число глобальных переменных невелико, а имена уникальны.

Хотел уточнить насчет «Зато внутри *.h файлов у Вас получается спагетти…». Внутри .h файлов тоже чисто. «Спагетти» из кучи инклудов только в main.h.
  • avatar
  • DmitryFx
  • 10 октября 2012, 00:14
0
«И все они, в зависимости от значения дефайна DECLARE вдруг станут «extern»». Как раз нет — так как директива #define DECLARE находится только в файле main.c (в самом начале), то в нем все переменные описанные c DECLARE будут без extern, а в остальных исходниках с extern.
  • avatar
  • DmitryFx
  • 09 октября 2012, 23:38
0
1. Спасибо. Самое главное, я понял то, что чтобы понять что же ты на самом деле сделал — напиши об этом статью. (Хочешь что-то понять — объясни это другому)
2. Действительно, даже самое незначительное действие, требует создания нескольких модулей, логически связанных, но делающих принципиально разные вещи.
Например, загрузка/сохранение настроек, это не просто прочитать/записать данные в памяти. Это связка файловой системы, TFTP, загрузка дефолтных настроек, парсера файла настроек с обработчиком-исправителем ошибок (ведь у пользователя не должен виснуть прибор, если что-то не так записалось), инициализация внутренних структур для отображения и редактирования параметров и сохранение настроек в файл. Целая эпопея.
  • avatar
  • DmitryFx
  • 09 октября 2012, 23:21
0
1. Про Ethernet. В начале был вопрос ставить PHY или W5100. Решили в пользу W5100. Цена такая же, но PHY с RGMII тогда доступные не нашлись. Плюс драйвера W5100 уже написаны, заживить проще… но, конечно, скорость не та. Теперь бы я стал делать на PHY.
2. «Сказано, как раз, таки мало.» Да, очень много хотелось рассказать, но либо никак либо это уже незначительные детали.
3. main.h. При таком способе создается рекурсия, однако неглубокая. Плюсом является то, что все заголовочные файлы собраны в одном файле. И в каждом исходном файле включается только один заголовочный файл с именем как у исходника. Если сделать пошаговую ручную обработку исходника, как это сделал бы препроцессор (или вывод исходника после препроцессора в отдельный файл, IAR такое умеет), то получится, что перед каждым кодом исходника вставится содержимое всех заголовочных файлов именно в том порядке как они описаны в main.h.
4. DECLARE. Это чтобы не следить объявлена переменная где-то явно, без extern, или нет. То-есть просто пишешь у всех объявлений глобальных переменных DECLARE и все. А если использовать слово extern, то нужно чтобы в одном и только одном файле эта переменная была без extern. Данный маневр применим там, где есть несколько исходников, использующих одну глобальную переменную. И эти исходники нужно включать или временно выключать из проекта. Где должна быть описана переменная явно без extern? Неизвестно. DECLARE в таком случае поможет.

Пожалуй, последние два пункта нужно будет оформить отдельной статьей.
  • avatar
  • DmitryFx
  • 09 октября 2012, 23:00
0
Чтобы не тянуться к блокираторам через весь салон. Ткнул кнопку под рукой и готово.
PS: Ну и срач же тут развелся.
  • avatar
  • DmitryFx
  • 26 сентября 2012, 20:09
0
Если хочешь заморочиться и выводить по полэкрана — попробуй. Когда изображение статичное, все будет нормально. Я имел в виду сделать вывод по одному байту, но часто (в прерывании, или, что лучше, DMA). Тогда можно будет увидеть сам процесс рисования. А чтобы этого избежать применяется двойная буферизация. Просто не хочется тратить время на работу долгой функции Lcd_write_buffer (даже на полэкрана). Пускай работает в фоне постоянно (или по запросу, но все равно в фоне).
  • avatar
  • DmitryFx
  • 25 сентября 2012, 02:01
+2
Хочу немного покритиковать.
1. При осмотре кода, комментариев в нем и ваших комментариев здесь понятно, что библиотека не доведена до ума и делалась наспех. Наверное стоит сначала все опробовать, исправить, а потом уже предлагать другим.
2. Библиотека называется lcd.c, хотя она представлена здесь для конкретного экрана wg12864b. Назовите её wg12864.c или NT7108.c (или другой совместимый контроллер).
3. Вообще лучше делать абстракцию графической библиотеки от работы с устройством. То есть разбить вашу библиотеку на две: первая (например graphic.с) работает только с видеобуффером, очищает, чертит линии фигуры и др. Она не должна зависеть ни от разрешений ни от организации битов. Вторая (NT7108.c) выводит видеобуффер на устройство (Lcd_init, Lcd_strob,nop18,Lcd_write,Lcd_reset,Init_pin_out,Lcd_write_buffer в вашем случае). Смешивать работу с устройством и памятью не стоит.
4. Посмотри C Coding Standard Application Note AN-2000 от Micrium. Там много полезного по оформлению кода.
Из опыта, на будущее — хотелось бы сделать вывод на экран либо через DMA либо по прерываниям таймера. Для этого нужно сделать функцию вывода буффера по небольшим частям, которую можно пихнуть в обработчик прерывания.
Итого: если это одна из ваших первых работ с экраном, то получилось довольно неплохо.
  • avatar
  • DmitryFx
  • 16 сентября 2012, 19:05