UT.6.02.x: Embedded Systems - Shape The World улучшенная версия
В прошлом году был курс Embedded Systems — Shape The World, многие о нём знают. Мне курс очень понравился, получил сертификат (правда бесплатную версию).
Теперь они запустили новую улучшенную версию и добавили несколько новых вещей.
Читать дальше
Теперь они запустили новую улучшенную версию и добавили несколько новых вещей.
Читать дальше
Инициализация PWM конструктором класса ( C++ )
Долгое время писал код под МК на С. Друг пишет под МК на С++, посоветовал мне, вот я решил попробовать. Микроконтроллер у меня ATmega88А, IDE Atmel Studio 6.2. Буду использовать 6 апаратных PWM для управления сервоприводами, так как нужно писать 6 одинаковых кусков кода, решил сделать класс Servo:
через конструктор передаем куда будем писать наше значение, тоесть регистр таймера для управления PWM:
Используем:
Вроде код получился читабельней.
Но вот как быть с инициализацией. Писать просто функцию где будут инициализироваться 3 апаратных таймера как то не по ООП. Добавить в конструктор весь код, будет инициализировать всё 6 раз, тоесть делать то же самое. Как можно сделать чтобы получить независимую инициализацию для каждого обьекта (канала) PWM — если регистры конфигурации разные для каждого таймера?
class Servo
{
private:
int* pulse_width;
public:
Servo(int* PWM_Channel);
void write(int data);
}; //Servo
через конструктор передаем куда будем писать наше значение, тоесть регистр таймера для управления PWM:
// default constructor
Servo::Servo(int* PWM_Channel)
{
pulse_width = PWM_Channel;
} //Servo
void Servo:: write(int data)
{
*pulse_width = data;
}
Используем:
int main(void)
{
Servo servo1(&OCR0A);
Servo servo2(&OCR0B);
servo1.write(10);
servo2.write(50);
while(1)
{
}
}
Вроде код получился читабельней.
Но вот как быть с инициализацией. Писать просто функцию где будут инициализироваться 3 апаратных таймера как то не по ООП. Добавить в конструктор весь код, будет инициализировать всё 6 раз, тоесть делать то же самое. Как можно сделать чтобы получить независимую инициализацию для каждого обьекта (канала) PWM — если регистры конфигурации разные для каждого таймера?
Embedded Systems - Shape The World
22 января начинается очень интересный курс по Embedded Systems. Записаться можно тут Изучение будет проходить на Cortex M4 от Texas Instruments в среде Keil uVision IDE. Для закрепления знаний будет задание написать графическую игру на дисплее от мобильника. Также можно будет получить сертификат. Список необходимого железа тут.
TDD для Embedded.
На своей работе занимаюсь написанием кода для разных микроконтроллером. Но потом приходиться всё тестировать, и тестировать приходиться каждый раз когда идут даже самые простые изменения в прошивке, например смена значения константы и т.д. К примеру изменения в прошивке и компиляцию можно сделать меньше чем за 5 минут, а тестировать нужно примерно часа 5 или больше ( всё завысит от тестплана). Хочу автоматизировать процесс тестирования, так как например делают наши высокоуровневые коллеги — пишут автоматизирование тесты (TDD). Хочется чтобы запустил тестирование и через некоторое время увидел результ — тест такой — pass/fail.
Начал читать книгу: Test Driven Development for Embedded C пока понимаю не много…
Также понемного разбираюсь с библиотекойPySerial — очень просто работать с ком портом.
Само тестирование вижу так:
запустил скрипт или программу на компе, программа конектиться с МК по UART и обмениваеться данными. Программа (скрипт) на компе шлёт данные в МК, а сама знает заведомо правильный результат. МК обрабатывает принятый результат и посылает обратно на комп, программа сравнивает — если сошлось — pass, не сошлось — fail.
Кто нибудь делал подобное?
Начал читать книгу: Test Driven Development for Embedded C пока понимаю не много…
Также понемного разбираюсь с библиотекойPySerial — очень просто работать с ком портом.
Само тестирование вижу так:
запустил скрипт или программу на компе, программа конектиться с МК по UART и обмениваеться данными. Программа (скрипт) на компе шлёт данные в МК, а сама знает заведомо правильный результат. МК обрабатывает принятый результат и посылает обратно на комп, программа сравнивает — если сошлось — pass, не сошлось — fail.
Кто нибудь делал подобное?
Cubieboard VS BeagleBone Black
Думаю о покупке платы. Пока не могу решиться что лучше. Xочу использовать для робота (ком. зрение, стереозрение, передача видео по Wi-Fi) Решил сравнить плюсы и минусы, и услышать мнение сообщества. И так:
Cubieboard                                                            BeagleBone Black


_________________________________________________________________________________________________
Читать дальше
Cubieboard                                                            BeagleBone Black


_________________________________________________________________________________________________
Читать дальше
My Robot Car

Решил сделать своего робота, так как в процесе создание многому можна научиться.
Робот представляет собой платформу которая может управляться с пульта, или компьютера (пока слишком тупая, чтобы принимать решения самостоятельно но я над этим работаю). В планах управление по Wi-Fi, беспроводная передача видео, обработка даных с датчиков, комютерное зрение, и многое другое… И так, с чего же состоит мой робот…
Читать дальше
PSoC 1. Быстрый старт.
На блоге увидел статью PSoC 5.Введение. Создание проекта. очень понравилась, решил написать свою но о PSoC 1, самом младшем семействе микроконтроллеров Cypress. Микроконтроллеры PSoC 1 восьмибитные. Их отличие от других производителей мк есть то что переферийные модули (таймеры,UART, и другие) можно добавлять в зависимости от потребности. Можно сказать что cypress микроконтроллеры смесь FPGA і uC.
Читать дальше
Читать дальше
"Волшебная коробка"
Решил сделать для любимой девушки оригинальный подарок своими руками. Это моя первая статься на блоге, так что не судите строго :))
Функционал устройства:
Схема устройства очень простая — микроконтроллера ATmega8, красные светодиды, кнопки и батарейки питания (3 пальчика). Плату сделал двухслойной (не хотелось использовать перемычки).Разводил в Altium Designer, избыточно для такой прсотой платы использовать такую программу, но так как я с ней постоянно работаю — мне в ней удобно. Altium проект вконце статьи в архиве. Чтобы распечатать чертеж для ЛУТ сначала необходимо сгенерировать гербер, как сделать уже описано тут.
Вот так выглядит плата устройства в Altium Designer:

Визуализация платы в Altium Designer:

Плату поместил в сувенирную коробку:

Для программирования МК на плате есть разъем. Конечно он немного портыть выд устройства, но совсем не хотелось мучаться с проводами для прошивки. Я программировал через AVRISP mkII но можно использовать той что есть в у вас в наличии.
Прошивку писал в AVR Studio на язике С, не особо оптиммизировал. Частота работы МК 8MHz В программу очень легко вносить новые эффекты мигания. Кнопкой S2 включаеться устройство, S1 — переключючение программ мигания по кругу, после МК переходить в сон, и чтобы включить нужно нажать S2 (кнопка подключена к внешнему прерыванию). Если кнопка S1 не нажимаеться, через 30 секунд произойдет переключение на следующую программу мигания. Если нет активности пользователся, через 5хв устройство отключиться.
Программа огранизована в виде тасков. В прерывании таймера устанавливаеться флаг события, в главном идет обработка события и сбрасиваеться флаг:
Так происходить переключение программ мигания:
Одна с функций мигания:
Для тех кто выдержал и дочитал:
Как работает устройство-видео
Файлы к статье:
we.easyelectronics.ru/attachments/get/1091
we.easyelectronics.ru/attachments/get/1092
Спасибо. Жду конструктивной критики и замечаний!)
Функционал устройства:
- 7- программ миганния;
- Переключенние между программами происходить по кнопке;
- Переключенние между программами по таймеру, каждых 30с;
- Отключение устройства по кнопке;
- автоматичиское выключение при 5минутах неактивности.
Схема устройства очень простая — микроконтроллера ATmega8, красные светодиды, кнопки и батарейки питания (3 пальчика). Плату сделал двухслойной (не хотелось использовать перемычки).Разводил в Altium Designer, избыточно для такой прсотой платы использовать такую программу, но так как я с ней постоянно работаю — мне в ней удобно. Altium проект вконце статьи в архиве. Чтобы распечатать чертеж для ЛУТ сначала необходимо сгенерировать гербер, как сделать уже описано тут.
Вот так выглядит плата устройства в Altium Designer:

Визуализация платы в Altium Designer:

Плату поместил в сувенирную коробку:

Для программирования МК на плате есть разъем. Конечно он немного портыть выд устройства, но совсем не хотелось мучаться с проводами для прошивки. Я программировал через AVRISP mkII но можно использовать той что есть в у вас в наличии.
Прошивку писал в AVR Studio на язике С, не особо оптиммизировал. Частота работы МК 8MHz В программу очень легко вносить новые эффекты мигания. Кнопкой S2 включаеться устройство, S1 — переключючение программ мигания по кругу, после МК переходить в сон, и чтобы включить нужно нажать S2 (кнопка подключена к внешнему прерыванию). Если кнопка S1 не нажимаеться, через 30 секунд произойдет переключение на следующую программу мигания. Если нет активности пользователся, через 5хв устройство отключиться.
Программа огранизована в виде тасков. В прерывании таймера устанавливаеться флаг события, в главном идет обработка события и сбрасиваеться флаг:
volatile unsigned char BlinkMode = 0; // какой ефект должен работать
volatile unsigned char BlinkSpeed = 0; //скорость переключения
volatile unsigned char TaskFlag = 0; // переменная флагов для задачь
ISR(TIMER2_COMP_vect) // 1mS
{
if (++count2 == BlinkSpeed)
{
TaskFlag|= (1<<6); //set flag
count2 = 0;
}
}
while(1)
{
if (TaskFlag & (1<<6))
{
BlinkLedTask();
TaskFlag&=~(1<<6); // clear flag
}
}
Так происходить переключение программ мигания:
void BlinkLedTask(void)
{
switch (BlinkMode)
{
case 0: Blink1(20); break;
case 1: Blink2(50); break;
case 2: Blink3(200); break;
case 3: Blink4(255); break;
case 4: Blink5(150); break;
case 5: Blink6(90); break;
case 6: Blink7(250); break;
case 7: Sleep(); break;
}
}
Одна с функций мигания:
iBlinkSpeed
— параметр функции — скорость мигания.EnableAll();
устанавливает лог «1» на аноды светодиодов.PWM = 10;
минимальная яркость мигания светодиодов PWM = 250;
максимальная яркость мигания светодиодов
void Blink7(unsigned char iBlinkSpeed)
{
static unsigned char num = 0;
BlinkSpeed = iBlinkSpeed;
EnableAll();
if (num == 0)
{
PWM = 10;
num = 1;
}
else
{
PWM = 250;
num = 0;
}
}
Для тех кто выдержал и дочитал:
Как работает устройство-видео
Файлы к статье:
we.easyelectronics.ru/attachments/get/1091
we.easyelectronics.ru/attachments/get/1092
Спасибо. Жду конструктивной критики и замечаний!)