…Такс, ждем бита скл, кидаем сда в С, крутим кумулятор влева…так. битик мы замутили.. .скл… скл… ждём когда скл отпустит, считаем битики, циклимся. Опа, кажись работает. Замечательно! Хм как все просто. Такс, а если у нас стоп? а нет у нас стопа! и нафиг он нам не нужен! Или нужен? Пусть нужен. типо стандарт. Так круче.
*страшная мысль* Оппа… а ведь команда это 24 такта
*перед глазами воображение рисует страшную картину распределения высоких и низких уровней на шинах SDA и SCL*, а если вдруг, проверив скл, во время выполнения команды перехода изменится сда, а мы этого не спалим? Там же целых 24 такта проц не пойми что делает!!! ААА!!! Черт, мы же прозеваем стоп!
*страшная мысль №2* а если будет жуткая помеха, вот такая!
*воображение рисует жуткий цифровой срач на шинах SDA/SCL* !!! Мы же застрянем в этом условии! Повиснем нахрен… Повииииснеееем!!! Мать! Черт, жопа!
*далее много и нецензурно* Что делать!! АА, что делать! Блин, Аааа аАААаа
*жестокий тупняк минут на 5, бьется головой о стол, подрывается написать в жалобный пост о помощи* Что делать!!! Нет, должен быть выход! О! Точно! От висняка нас спасёт СОБАКА! Натравлю ка я её на прерывание! Вачдог!!! ЫЫ!! Вачдог!!! ФАС!!!
*при слове watchdog
Dlinyj начинает истерично ржать* Факин щит! у 2051 нет вачдога. Бля, как быть? Таймер! Нужен таймер! Сцуко, у таймера своей работы хватает! Он же ШИМом занят, черт…
*озорная мысля* А не переписать ли оба канала ШИМ на один таймер вместо двух?
*ленивая мысля* К черту, нее… Нахер! этож гимор, частота рухнет, он и так не более 10кГц дёргается. Неее нихочу. Таймер холосый, не сцы, я тебя никому ниатдам! Я никому не позволю своими грязными лапами лапать твои прерывания.
*светлая мысль* Нам нужен флаг! Флаг нас спасёт! Флаг поставим таймером! ТАдаМ!!!
*яростно начинает добавлять в обработчик прерывания таймера условие* так если мы вышли на таймер от нулевого инта ,то забиваем на шим и скачем делать вачдог. Тадам! Черт, сраное условие ,теперь обработчик таймера 0 длинней таймера 1 на 4 команды. Мать перемать!
*разумная мысль* но ведь шиму на это насрать!
*эстетичная мысль* Но ведь это нихера некрасиво! Нопы! Нам нужны НОПЫ!!! NOP NOP NOP NOP
*жадная мысль* Сука! целых четыре байта ПЗУ просрал зазря! А вдруг не хватит!!! Переделывай давай!
*светлая мысль* ТочнО! Нах нам обработчик! Нах нам левый флаг! За флаг сканает флаг прерывания таймера! Тадам! Сэкономили целых 10 байт, выгадали целых 180 тактов, да ещё зажмотили один битовый флаг! УРА!
*эстетичная мысль* Блин. А Шим то все равно перекосило! Один зубчик теряешь при каждом вызове IIC
*разумная мысль* ЭТО ШИМ! ЕМУ ПОХ!
*эстетичная мысль, обиженно* Ну хоть второй то шим выключить, и этот остановить.
*разумная мысль* Нах?
*эстетичная мысль* Для красоты, тебе что, жалко?
*разумная мысль, пожимая плечами* Да нет, пжалуста.. добавляет CLR TR1 CLR TR0.
*параноидальная мысль* А нас не перебьют? Кто же знает что ты там еще напишешь?
*Стратегическая мысль* Да ты чо!!! Все путем
*прогон под дебаггером* А чего у меня прерывание таймера не срабатывает? М? Разрешение есть…. ААА!!! Мать твою!!! Приоритеты прерываний!!!
*напевает на мотив гимна гитлеровской Германии* Инт ноль… Инт ноль убер алиес… Врёёшь!!! Не возмешь!!! Инт ноль капут! Гордо взмывает флаг
над рейхстагом в регистре приорететов прерываний…
*Совершенно жуткая мысль* АААААААААААААААА!!! Время!!! ТАКТЫ!!! ТАКТЫ!!! НЕ УСПЕЮ!!!
*посчитал пальчиком команды* эмм… 10 штук. эээ… 24MHz кварц, 12 тактов на команду… так так так… 24 на 12 = 2Мгц эквивалентного RISC процессора… по такту на команду… так так так… 2Мгц на 100Кгц… дает 20 команд.. у нас пока всего 10, а проверку стопа я в 4ре команды уложу… хух… укладываюсь … нормально
*разумная мысль* А нах нам 100КГц? один хрен мастер не даст такую частоту, кисо куку?
*понты* СТАНДАРТ! ХУЛЕ! И вообще! Что мы чё, лохи чтоль?
*разумная мысль* Да какой нах стандарт? У тя прерывание дергается третей линией! И вообще твоя система что хоти то и городи!
*понты* Неее СТАНДАРТ! И ПОНТ! ДА БУДЕТ ТАК! Клева! Работает… вроде бы…
*Ужасная мысль* ААААААА!!! А памяти тебе хватит!!! Посмотри сколько кода! А у тебя ещё обработчик шаговика не напиииисаааан, а если добавить ещё и опрос датчиков и своих мозгов? Куда пихать будем?? ААА??? ну ка!
*быстренько скомпилил* эээмм… всего кода на 450 байт. Еще осталось 1598 байт ПЗУ. Не сцать! Все путём. Места в памяти ещё жопой ешь! Сюда при желании влезет и искусственный интеллект, а также стадион и казино с блэк джеком и шюхами!!!
*физиологическая мысль* ээйй чуваааак… а пожрать?
*все хором* НАХУЙ!
…АУ! Братья по разуму! Кодеры! Ну как? Ведь так оно, да? ;)
Краткий глоссарий, для тех кто хотел, но не вкурил
- СКЛ, СДА (SCL, SDA) линии шины данных типа IIC (она же I2C) разработанной для передачи инфы внутри схемы от одной микрухи к другой. Скорость шины от 0 до 100Кбит/сек. У меня по IIC связаны между собой разные процессоры робота.
- СТОП и СТАРТ - определённые последовательности высоких (1) и низких (0) уровней на шинах SDA, SCL документированы в протоколе IIC
- NOP самая простая команда любого процессора. Почему самая простая? Потому что не делает НИХРЕНА! совершенно. Просто занимает свой байт в памяти и сжирает свои 12 тактов процессорного времени. Юзается для выравнивания кода или временных интервалов.
- Таймер - блок процессора, после заданной задержки выдаёт прерывание. Включается установкой бита TR, выключается сбросом этого бита.
- Прерывание - Получив его, процессор бросает все дела и начинает выполнять код заложенный в обработчике прерывания.
- ШИМ - Широтно импульсная модуляция. Метод, позволяющий задавать аналоговый сигнал цифровым выходом, посредством регулировки длительности высоких (1) и низких (0) уровней напряжения на шине, потом проинтегрировав это дело можно получить аналоговый сигнал. Пример: 1: ||||||||_|||||||||_|||||||| 2: ____|||____|||____ Напряжение сигнала 1 будет после интегрирования явно выше напряжения 2, где преобладает низкий уровень.
- ПЗУ - постоянное запоминающее устройство. В моем процессоре (на самом деле это микроконтроллер) памяти 2КБ, ОЗУ 128 байт.
- Кварц - кварцевый резонатор, им у меня задаётся частота тактов. На одну команду уходит от 12 до 24 тактов в зависимости от типа команды.