Как научиться изящно и грамотно программировать МК?
=====================================================

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

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

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

Главное - не торопиться сразу кодить. 

 Ну ровно так же как человек учится ходить: вначале фигово и падая на попу, потом - получше, но косолапя и уже только потом начинает бегать...  
  

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

 Я всегда говорю, что программирование контроллеров распадается на две задачи: собственно программирование и схемотехника. Потому сначала надо научиться программировать и освоить схемотехнику.  
  

Научиться программировать можно выполняя классические задачи - на сортировки, на работу со структурами данных и т.п. Про это есть множество хороших и проверенных книжек и сайтов. Только не берите книжки типа "C++ за десять дней" - это совсем не то, что научит писать *изящно и грамотно*. На описываемом этапе вас будут интересовать основы, которые помогут научиться проводить разбиение сложной задачи на простые действия.  
  

Естесственно, генераторы кода я даже не обсуждаю - про них надо просто забыть. Никакого C++, только ANSI C - упор на него.  
  

Знание схемотехники необходимо, чтобы понимать особенности железа и способы правильного взаимодействия с ним. По основам схемотехники тоже есть много проверенных книг. Но, опять же, это не "Ардуино для начинающих". Берите нормальные книги вроде Горовица и Хилла.  
  

Ну и практика, практика, практика. Ну и, конечно, не забывайте, что понимание терминов "изящно и грамотно" у каждого свое. :)