Всем привет, не так давно обзавелся Мегой 2560 и кучей датчиков ... постепенно осваиваю, и, в качестве восстановления навыков программирования на С/С++, делаю "свой собственный Wiring".
Цель приобретения: замена Лего Майндшторм для ребенка. Многое уже поставлено на лего-детальки, в т.ч. и сама Мега.
Из "достигнутого":
1. Прямое управление ножками через регистры прямо из типовых функций digitalWrite(), pinMode() . Типовой скетч Blink.ino у меня теперь компиляется в 508 байт "без переделок";
2. Прямое управление таймерами. Позволяет гонять "аппаратный ШИМ" на ножках меги напрямую функциями analogWrite(), а также иметь аппартатное управление серводвигателями через неё же;
3. Изменены:
таймер миллисекунд - считает только переполнения и "фсё";
функция millis() считает "ровно" без скачков в плюс-минус 2 миллисекунды в отличии от типовой;
функция micros() отдает микросекунды с учетом времени собственного выполнения (т.е. на момент завершения вызова);
сделана функция delay16() с парамтером unsigned int вместо long, что экономит по 6 байт на каждом вызове.
4. В хидер встроена функция every..() которая много где описана и позволяет делать задержки без delay();
5. прямое управление аналоговым чтением analogRead() позволяет настраивать АЦП блок в любой режим оцифровки: типовой, дифференциальный, с усилением.
В разработке:
6. Чтение длительности импульсов "по прерыванию". Задействовал прерывания PCINT2 (аналоговые входы 8..15) для реализации pulseIn() без простоев проца. Но, тут появилась "засада" с таймаутом определения длительности ... пока сделал в таймере список таймаутов, но это решение мне - не нравится.
7. "Событийная" обработка и переход на конечный автомат для построения разного рода роботов.
Сюда выкладывать - кому-то интересно будет?