Мо­нитор с клас­сичес­ким кинес­копом сей­час мож­но отыс­кать раз­ве что в музее или на бло­шином рын­ке, да и там они попада­ются нечас­то. Тем инте­рес­нее пос­тро­ить такой сво­ими руками! В этой статье мы запус­тим элек­трон­но‑лучевую труб­ку, пос­мотрим на фигуры Лис­сажу, выведем текст и изоб­ражение. Будет мно­го схе­мотех­ники и кода.

На­вер­няка все видели часы на элек­трон­но‑лучевых труб­ках или экра­нах осциллог­рафов. Пос­ле неоно­вых часов это, навер­ное, сле­дующая по популяр­ности лам­повая замороч­ка. Обыч­но, кро­ме цифер­бла­та и нес­коль­ких цифр, на него ничего не выводят, и это таки не слу­чай­но! Собс­твен­но, о при­чинах дан­ного явле­ния мы и будем даль­ше мно­го говорить, а так­же обсу­дим те осо­бен­ности тру­бок и схе­мотех­ники, о которых обыч­но в интерне­те не пишут.

info

На­зывать ради­олам­пы труб­ками, элек­трон­ными труб­ками, ваку­умны­ми труб­ками и кла­пана­ми без­гра­мот­но. Прос­какива­ют такие наз­вания обыч­но по вине горе‑перевод­чиков, одна­ко в слу­чае элек­трон­но‑лучевых тру­бок и рен­тге­нов­ских тру­бок наз­вание плот­но уко­рени­лось и теперь общепри­нято. Такие дела.

 

Электронно-лучевая трубка

Элек­трон­но‑лучевые труб­ки, пожалуй, самые слож­ные ради­олам­пы в пла­не устрой­ства и управле­ния. Пред­назна­чены они, как нес­ложно догадать­ся, для вывода изоб­ражения. Здесь и далее мы будем говорить толь­ко об осциллог­рафичес­ких труб­ках с элек­трос­татичес­кой фокуси­ров­кой и элек­трос­татичес­ким откло­нени­ем.

Электронно-лучевая трубка
Элек­трон­но‑лучевая труб­ка

Как все‑таки работа­ет такая лам­па? Элек­тро­ны испуска­ются катодом, пос­ле чего про­ходят через сис­тему фокуси­ров­ки, которая в прос­тей­шем слу­чае сос­тоит из трех элек­тро­дов, как на рисун­ке выше. Пер­вый элек­трод управля­ет яркостью, вто­рой фокуси­ров­кой, а тре­тий, уско­ряющий, отве­чает за астигма­тизм. Пос­ле это­го пучок про­лета­ет через две пары откло­няющих элек­тро­дов, отве­чающих за горизон­таль­ное и вер­тикаль­ное откло­нение.

За­тем элек­тро­ны долета­ют до слоя люмино­фора и зас­тавля­ют его све­тить­ся. Если фокуси­ров­ка нас­тро­ена, то на экра­не горит точ­ка, положе­ние которой опре­деля­ется нап­ряжени­ем на откло­няющих элек­тро­дах. Изме­няя это нап­ряжение, мы можем выводить изоб­ражение. Но это все общие сло­ва, теперь перей­дем к кон­кре­тике, о которой обыч­но не пишут, раз­ве что на темати­чес­ких форумах.

 

Выбор трубки

Для экспе­римен­тов я выб­рал труб­ку 6ЛО1И. Мотиви­рова­ла меня ее низ­кая сто­имость (мне этот девайс обо­шел­ся в 400 руб­лей) и ее ком­пак­тность.

6ЛО1И
6ЛО1И

Од­нако уже во вре­мя сбор­ки и нас­трой­ки я осоз­нал, нас­коль­ко это пло­хой выбор, ведь имен­но из‑за исполь­зования 6ЛО1И я стол­кнул­ся с таким количес­твом труд­ностей. А дело в том, что у труб­ки есть такой показа­тель, как чувс­тви­тель­ность откло­няющей сис­темы. Изме­ряет­ся она в мил­лимет­рах на вольт, и у 6ЛО1И это зна­чение сос­тавля­ет око­ло 0,15 мм/В, для оси X — чуть мень­ше, для оси Y — чуть боль­ше. Такая чувс­тви­тель­ность край­не низ­кая, и для дви­жения луча по горизон­тали от левого края экра­на до пра­вого нуж­но поряд­ка 250 В, а по вер­тикали око­ло 200 В. Это доволь­но мно­го и тре­бует от виде­оуси­лите­ля очень хороше­го быс­тро­дей­ствия. Собс­твен­но, если пос­мотреть, что имен­но выпус­кала про­мыш­ленность на этих труб­ках, то ста­новит­ся ясно, что это были «показо­мет­ры» с шириной полосы не более нес­коль­ких десят­ков килогерц, нап­ример ОМШ-3М.

Здесь, прав­да, мож­но нем­ного схит­рить и понизить анод­ное нап­ряжение на труб­ке с пас­пор­тно­го 1200 В до, ска­жем, 700–1000 В. Яркость при этом сни­зит­ся, а чувс­тви­тель­ность откло­няющей сис­темы замет­но воз­растет, и в дан­ном слу­чае это разум­ный ком­про­мисс. В общем, советую взять труб­ку поп­рилич­нее — это силь­но упростит ковыря­ния с виде­оуси­лите­лем.
Но есть у 6ЛО1И и дос­тоинс­тва: устрой­ство ее нес­ложное, поэто­му и схе­ма питания у нее прос­тая.

 

Питание и обвязка трубки

Пе­ред тем как изоб­ретать свой велоси­пед, неп­лохо бы озна­комить­ся с уже изоб­ретен­ными вари­анта­ми. По уму, конеч­но, сто­ило бы соб­рать для анод­ного нап­ряжения импуль­сник со ста­били­заци­ей. Но пос­коль­ку для накала нуж­но 6,3 В, а в осциллог­рафичес­ких труб­ках боль­шая часть высоко­го нап­ряжения пода­ется на катод, то есть потен­циал катода око­ло –900 В, источник питания накала дол­жен быть надеж­но изо­лиро­ван от мас­сы. Про­ще все­го про­вер­нуть этот финт, исполь­зуя накаль­ную обмотку.

А раз уж нуж­на накаль­ная обмотка, зна­чит, тран­сфор­матор будет содер­жать и анод­ную обмотку, поэто­му высокое нап­ряжение мож­но получить умно­жите­лем. Как говорит­ся, 1000 В — это все­го лишь три раза по 330 В. Поэто­му, вдох­новив­шись про­ектом прос­того осциллог­рафа на 6ЛО1И, я раз­работал свою схе­му, в которой от исходной остался толь­ко кон­цепт.

warning

Раз­ность потен­циалов меж­ду положи­тель­ным и отри­цатель­ным пле­чами источни­ка питания пре­выша­ет 1000 В! Удар таким нап­ряжени­ем смер­тель­но опа­сен, а кро­ме того, это очень боль­но. Поэто­му будь край­не вни­мате­лен и осто­рожен! А если нет опы­та в работе с высоким нап­ряжени­ем, воз­можно, луч­ше и не свя­зывать­ся с этим бло­ком питания. Я пре­дуп­редил.

Схема блока питания и обвязки 6ЛО1И
Схе­ма бло­ка питания и обвязки 6ЛО1И

Ос­новой бло­ка питания слу­жит 30-ват­тный торо­идаль­ный тран­сфор­матор с дву­мя обмотка­ми, накаль­ной и анод­ной. Анод­ная обмотка выда­ет 235 В, которые пос­тупа­ют на вып­рямитель и умно­житель](https://en.wikipedia.org/wiki/Voltage_multiplier). Вып­рямитель при­менен одно­полу­пери­одный, так как он хорошо сочета­ется с умно­жите­лем, а токи пот­ребле­ния схе­мы око­ло 0,5 мА. На выходе вып­рямите­ля получа­ем око­ло +330 В. На выходе умно­жите­ля име­ем, соот­ветс­твен­но, око­ло –660 В, что в сум­ме дает нам 1000 В — впол­не дос­таточ­ное нап­ряжение для работы труб­ки.

Об­рати вни­мание на резис­торы, шун­тиру­ющие кон­денса­торы вып­рямите­ля и умно­жите­ля: они могут сущес­твен­но прод­лить твою жизнь, пос­коль­ку кон­денса­торы — шту­ка ковар­ная (см. пре­дуп­режде­ние). Вооб­ще говоря, нес­мотря на пас­пор­тное анод­ное нап­ряжение 1200 В, 6ЛО1И работа­ет и от 1000 В, и даже от 500 В. При этом повыша­ется чувс­тви­тель­ность откло­няющей сис­темы и сни­жает­ся яркость све­чения.

При 1000 В яркость впол­не при­лич­ная. Обвязка самой 6ЛО1И впол­не стан­дар­тная, как и в упо­мяну­том выше про­екте. Сто­ит так­же обра­тить вни­мание, что к обще­му про­воду под­клю­чен не выход вып­рямите­ля, а сред­няя точ­ка делите­ля на резис­торах R5/R6. Это нуж­но, что­бы при­под­нять нап­ряжение на откло­няющих элек­тро­дах при исполь­зовании окон­чатель­ного вари­анта виде­оуси­лите­ля.

Де­ло в том, что нап­ряжение на вто­ром ано­де (астигма­тизм) дол­жно быть чуть ниже, чем на откло­няющих элек­тро­дах. Если нап­ряжение на них низ­ковато, то и на вто­ром ано­де его при­дет­ся занижать, в резуль­тате пада­ет яркость, исполь­зование же делите­ля поз­воля­ет обой­ти эту проб­лему. Да, нас­трой­ки яркости, фокуса и астигма­тиз­ма вли­яют друг на дру­га. Если вклю­чить устрой­ство на этом эта­пе, пос­ле прог­рева на экра­не появит­ся точ­ка, которую мож­но сфо­куси­ровать. Сиг­нал пода­ется на откло­няющие плас­тины, выводы 10, 11 опре­деля­ют откло­нение по оси Y, выводы 7, 8 — откло­нение по оси X. Теперь перей­дем к виде­оуси­лите­лю.

6ЛО1И с блоком питания и обвязкой
6ЛО1И с бло­ком питания и обвязкой
 

Видеоусилитель

Од­но из луч­ших решений для пос­тро­ения виде­оуси­лите­ля — диф­ферен­циаль­ный кас­кад. При про­чих рав­ных такой кас­кад поз­воля­ет получить в два раза боль­ший раз­мах выход­ного сиг­нала, а учи­тывая, что откло­няющие плас­тины сим­метрич­ны, диф­ферен­циаль­ный кас­кад нап­рашива­ется сам собой. В боль­шинс­тве опи­сан­ных в интерне­те конс­трук­ций, выводя­щих изоб­ражение на осциллог­рафичес­кую труб­ку, исполь­зует­ся прос­тей­ший диф­ферен­циаль­ный кас­кад на маломощ­ных высоко­воль­тных тран­зисто­рах, нап­ример как здесь. С него я и начал.

Исходный вариант видеоусилителя
Ис­ходный вари­ант виде­оуси­лите­ля

Од­нако это решение неудоб­но, так как тре­бует допол­нитель­ного сме­щения на базу пер­вого тран­зисто­ра, в про­тив­ном слу­чае кас­кад работа­ет в нелиней­ном режиме, что совер­шенно неп­рием­лемо. Хотя если хочет­ся пос­мотреть фи­гуры Лис­сажу, а в качес­тве источни­ка сиг­нала исполь­зовать завод­ской ГСС, где мож­но задать сме­щение в пару вольт отно­ситель­но зем­ли, то такое решение впол­не рабочее. Изба­вить­ся от необ­ходимос­ти внеш­него сме­щения мож­но, исполь­зуя дву­поляр­ное питание, что я и сде­лал.

Простейший вариант видеоусилителя
Прос­тей­ший вари­ант виде­оуси­лите­ля

Уси­литель Y-канала иден­тичен. Как видишь, здесь появил­ся еще один источник питания — 5 В, это усложня­ет блок питания, но реша­ет проб­лему сме­щения, поэто­му на вход мож­но подавать сиг­нал непос­редс­твен­но с ЦАПа. Этот вари­ант уси­лите­ля чрез­вычай­но прост и под­ходит для экспе­римен­тов с труб­кой, одна­ко име­ет сущес­твен­ные огра­ниче­ния. И это в пер­вую оче­редь быс­тро­дей­ствие. Так, полоса про­пус­кания дан­ного уси­лите­ля будет око­ло 10 кГц, и выше этой час­тоты уси­ление дос­таточ­но быс­тро сни­жает­ся.

И что с того, спро­сишь ты? А из это­го сле­дует, что количес­тво сем­плов ЦАПа будет огра­ниче­но полосой про­пус­кания, что, в свою оче­редь, будет огра­ничи­вать раз­мер изоб­ражения (количес­тво точек), которое мож­но отри­совать без мер­цания. В дан­ном слу­чае количес­тво точек будет поряд­ка 500. А если под­нять час­тоту ЦАП, то изоб­ражение будет иска­жать­ся.

С дру­гой сто­роны, нес­коль­ко сотен точек впол­не дос­таточ­но для отри­сов­ки цифер­бла­та и стре­лок, нес­ложной геомет­ричес­кой кар­тинки или тех же фигур Лис­сажу. Собс­твен­но, в боль­шинс­тве конс­трук­ций подоб­ное изоб­ражение и выводят. А что делать, если мы хотим боль­шего, нап­ример вывес­ти на экран дос­таточ­но слож­ную кар­тинку в пару десят­ков тысяч точек? Для это­го при­дет­ся под­нимать быс­тро­дей­ствие, и самый прос­той спо­соб это сде­лать — под­нять токи выход­ного кас­када.

Кро­ме того, сто­ит иметь в виду, что кол­лектор­ные резис­торы вмес­те с емкостью откло­няющей сис­темы и выход­ной емкостью тран­зисто­ра обра­зуют RC ФНЧ, час­тоту сре­за которо­го мож­но при­мер­но при­кинуть, взяв емкость, ска­жем, 15 пФ. На прак­тике получа­ется замет­но хуже, чем в теории, ну да это как всег­да. Для резис­торов 220 К получа­ется зна­чение 48,25 кГц, а для резис­торов 3 К уже 3,54 МГц — то, что надо.

Нес­коль­ко усложним схе­му, исполь­зовав кас­кодное вклю­чение тран­зисто­ров. Такое вклю­чение поз­воля­ет сде­лать схе­му менее кри­тич­ной к парамет­рам высоко­воль­тных тран­зисто­ров. В целом кас­код работа­ет как иде­али­зиро­ван­ный кас­кад с общим эмит­тером. Нас, конеч­но, это не спа­сет, пос­коль­ку мы все рав­но упремся в парамет­ры труб­ки, зато поз­волит исполь­зовать дешевые высоко­воль­тные тран­зисто­ры в вер­хнем пле­че, нап­ример MJE13003, MJE13005. Одна­ко луч­ше все‑таки 2SC2611 или КТ940А.

Кро­ме того, добавим источник тока в эмит­терные цепи — так и работа­ет луч­ше, и нас­тра­ивать гораз­до удоб­нее. А сверх того на вход пос­тавим исто­ковые пов­торите­ли, что­бы не шун­тировать ЦАП. В пер­вом вари­анте схе­мы их не было, одна­ко ока­залось, что уси­литель замет­но шун­тировал ЦАП и силь­но про­сажи­вал нап­ряжение, потому пов­торите­ли приш­лось добавить.

Схема видеоусилителя
Схе­ма виде­оуси­лите­ля

Дан­ный уси­литель обес­печива­ет полосу око­ло 1,5 МГц при раз­махе сиг­нала на выходе каж­дого пле­ча 75 В и уси­лении око­ло 15. При этом замена тран­зисто­ров на MJE13005 дает при­мер­но такой же резуль­тат, и улуч­шить его малыми уси­лиями уже не получит­ся. Нас­трой­ка уси­лите­ля сво­дит­ся к подс­трой­ке источни­ков тока резис­торами RV2 и RV5: нуж­но добить­ся на кол­лекто­рах тран­зисто­ров Q2, Q5, Q7, Q10 нап­ряжения чуть выше полови­ны питания (око­ло 120 В), а так­же к под­бору кон­денса­торов час­тотной кор­рекции С3, С6, С9, С12.

Сто­ит заметить, что раз мы собира­ем не осциллог­раф, а монитор, то добивать­ся ров­ной АЧХ уси­лите­ля — не опти­маль­ное решение. Поэто­му под­бор кон­денса­торов удоб­но вес­ти, смот­ря на качес­тво изоб­ражения, добива­ясь минималь­ных арте­фак­тов. Методи­ка под­бора кон­денса­торов доволь­но прос­тая — начав с заведо­мо мень­шей емкости, нап­ример 1 нФ, необ­ходимо пос­ледова­тель­но уве­личи­вать емкость в два раза, наб­людая изме­нения изоб­ражения. Ког­да емкость ока­жет­ся чрез­мерной, начинай ее умень­шать на полови­ну пре­дыду­щего шага, таким обра­зом шагов за пять мож­но подоб­рать нуж­ное зна­чение. Обра­ти вни­мание, что эмит­терные резис­торы в каналах X и Y раз­личны и кон­денса­торы кор­рекции, соот­ветс­твен­но, тоже. Токи тран­зисто­ров так­же мож­но нас­тра­ивать, ори­енти­руясь на изоб­ражение.

Конс­трук­ция получи­лась дос­таточ­но слож­ной (12 тран­зисто­ров), а еще она замет­но гре­ется, поэто­му нужен хороший ради­атор. Мой, конеч­но, дико избы­точен, но он мне попал­ся под руку и под­ходил по раз­мерам. Резис­торы в кол­лектор­ной цепи так­же силь­но гре­ются, поэто­му надо взять пятиват­тные (не про­волоч­ные!). Хорошо, уси­литель есть, теперь нужен источник сиг­нала.

Внешний вид видеоусилиителя
Внеш­ний вид виде­оуси­лиите­ля
 

ЦАП

C точ­ки зре­ния соот­ношения цена/быс­тро­дей­ствие луч­шее решение — R-2R ЦАП. Пер­воначаль­но я пла­ниро­вал исполь­зовать Blue Pill как источник сиг­нала, и в этом слу­чае мож­но задей­ство­вать целый порт сра­зу на 2 ЦАПа (каналы X и Y). Одна­ко, ори­енти­руясь на дан­ный про­ект, я решил при­менить сдви­говые регис­тры 74HC59. В пла­не быс­тро­дей­ствия мы ничего не теря­ем, так как GPIO в stm32f103 работа­ют с час­тотой око­ло 2 МГц, и то при пря­мой записи в регис­тры, через обер­тки получа­ется нес­коль­ко мед­леннее. А вот шина SPI недур­но работа­ет на час­тоте 32 МГц, и ито­ге для двух 8-бит­ных каналов получа­ем 2 мегасем­пла в секун­ду, при этом ЦАП мож­но исполь­зовать незави­симо с дру­гими источни­ками сиг­нала. А кро­ме того, ЦАП на 74HC595 выда­ет сиг­нал до 5 В, что, учи­тывая низ­кую чувс­тви­тель­ность труб­ки, нам толь­ко на руку.

Схема ЦАПа
Схе­ма ЦАПа

Сна­чала, конеч­но, схем­ка была поп­роще, в ней при­сутс­тво­вали толь­ко сдви­говые регис­тры. Мик­рокон­трол­лер писал в SPI два бай­та, а потом дер­гал нож­ку RCLK, и все было хорошо, все работа­ло. Потом мне захоте­лось вымодить мас­сивы поболь­ше, которые не помеща­лись в память кон­трол­лера, и тут было два вари­анта: при­ладить к кон­трол­леру флеш­ку, или под­клю­чить к ком­пу через USB/SPI. Я выб­рал вто­рой вари­ант, а в качес­тве USB/SPI исполь­зовал FT232H.

Это самый быс­трый USB/SPI из мне извес­тных, а кро­ме того, его мож­но при­обрести в виде готово­го модуля за тер­пимые день­ги (ну, некото­рое вре­мя назад так и было). Одна­ко у FT232H есть та же проб­лема, что и у кон­трол­лера SPI: порт работа­ет быс­тро, а GPIO мед­ленно, при­чем гораз­до мед­леннее, чем в кон­трол­лере, поэто­му дер­гать нож­ку регис­тра на каж­дые два бай­та неразум­но. Приш­лось малой кровью допилить недо-SPI 74HC595 до «поч­ти SPI». Идея дос­таточ­но прос­та: надо счи­тать так­товые импуль­сы и каж­дый 16-й дер­гать RCLK. Для это­го соб­ран делитель на 16 на четырех D-триг­герах. А что­бы знать, отку­да счи­тать импуль­сы, по сиг­налу CS про­исхо­дит уста­нов­ка триг­геров, что сра­баты­вает как син­хро­низа­ция.

Ко­неч­но, делитель про­ще было соб­рать на 74HC4040, но это как‑нибудь в дру­гой раз. Так или ина­че, мы получи­ли ЦАП, спо­соб­ный выдавать до 2 мегасем­плов в секун­ду, при­чем его ско­ростью мож­но управлять, меняя ско­рость шины SPI. О резис­торах мож­но ска­зать, что исполь­зовать резис­торы одно­го номина­ла удоб­но: получа­ешь пра­виль­ное соот­ношение соп­ротив­лений 1/2. В прин­ципе, мож­но сэконо­мить и исполь­зовать резис­торы 5К1 и 10К. Нем­ного пос­тра­дает линей­ность, что на глаз поч­ти незамет­но, впро­чем, эко­номия копе­ечная и того не сто­ит.

Внешний вид собранного DAC
Внеш­ний вид соб­ранно­го DAC
 

Bluepill и фигуры Лиссажу

Ана­лого­вая часть соб­рана, и ЦАП у нас есть. Вре­мя про­верить, как оно работа­ет. Самый прос­той тес­товый сиг­нал для соз­дания изоб­ражения — это два синуса с раз­ными час­тотами или фазами. Про­ще все­го такой сиг­нал взять с ГСС и подать на вхо­ды виде­оуси­лите­ля, одна­ко если ГСС под рукой нет, то сиг­нал мож­но сге­нери­ровать в мик­рокон­трол­лере бук­валь­но нес­коль­кими десят­ками строк.

Ге­нери­ровать синус в мик­рокон­трол­лере мож­но тре­мя спо­соба­ми. Во‑пер­вых, исполь­зуя биб­лиоте­ку math.h и фун­кцию sin(), одна­ко это далеко не луч­ший вари­ант по быс­тро­дей­ствию и рас­ходова­нию ресур­сов. Работа с пла­вающей точ­кой — это не то, для чего пред­назна­чены мик­рокон­трол­леры, впро­чем, дан­ный метод работа­ет. Дру­гой дос­таточ­но инте­рес­ный вари­ант генера­ции синуса — на осно­ве раз­нос­тных схем — упо­мина­ется здесь. Урав­нения там дос­таточ­но прос­тые, и с пер­вого взгля­да даже не ска­жешь, что на выходе получа­ется синус.

V -= X*R
X += V

Здесь R — это кон­стан­та. На осоз­нание вывода этих фор­мул меня не хва­тило, впро­чем, даже в момент окон­чания уни­вера гра­ница моих матема­тичес­ких спо­соб­ностей лежала где‑то в рай­оне дивер­генции гра­диен­та, а с тех пор ста­ло толь­ко хуже. Но при реали­зации в целочис­ленной матема­тике оно работа­ет, и работа­ет неп­лохо. Уж точ­но нам­ного быс­трее, чем биб­лиотеч­ный синус.

Тре­тий же метод генера­ции синуса — таб­личный, и вот он мне боль­ше все­го пон­равил­ся, осо­бен­но проз­рачностью уста­нов­ки фаз и час­тот. Кро­ме того, он демонс­три­ровал наиболь­шее быс­тро­дей­ствие. Суть метода: берем таб­лицу с заранее рас­счи­тан­ными зна­чени­ями синуса и прос­то выводим записан­ные в ней дан­ные через рав­ные про­межут­ки вре­мени с задан­ным шагом. Меняя шаг, мы меня­ем час­тоту, а меняя стар­товую точ­ку, меня­ем фазу. То, что надо!

...
uint8_t msin[256]={
127, 130, 133, 136, 139, 142, 145, 148, 151, 154, 157, 160, 163, 166,
169, 172, 175, 178, 181, 184, 186, 189, 192, 194, 197, 200, 202, 205,
207, 209, 212, 214, 216, 218, 221, 223, 225, 227, 229, 230, 232, 234,
235, 237, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 250,
251, 252, 252, 253, 253, 253, 253, 253, 254, 253, 253, 253, 253, 253,
252, 252, 251, 250, 250, 249, 248, 247, 246, 245, 244, 243, 241, 240,
239, 237, 235, 234, 232, 230, 229, 227, 225, 223, 221, 218, 216, 214,
212, 209, 207, 205, 202, 200, 197, 194, 192, 189, 186, 184, 181, 178,
175, 172, 169, 166, 163, 160, 157, 154, 151, 148, 145, 142, 139, 136,
133, 130, 127, 123, 120, 117, 114, 111, 108, 105, 102, 99, 96, 93, 90,
87, 84, 81, 78, 75, 72, 69, 67, 64, 61, 59, 56, 53, 51, 48, 46, 44,
41, 39, 37, 35, 32, 30, 28, 26, 24, 23, 21, 19, 18, 16, 14, 13, 12,
10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 16, 18, 19, 21,
23, 24, 26, 28, 30, 32, 35, 37, 39, 41, 44, 46, 48, 51, 53, 56, 59,
61, 64, 67, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105,
108, 111, 114, 117, 120, 123};
static void spi1_init(void){
// Включаем порт и интерфейс
rcc_periph_clock_enable(RCC_SPI1);
rcc_periph_clock_enable(RCC_GPIOA);
/* Configure GPIOs:
* SCK=PA5
* MOSI=PA7
*/
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO5|GPIO7);
spi_reset(SPI1);
spi_init_master(SPI1, SPI_CR1_BAUDRATE_FPCLK_DIV_2,
SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE,
SPI_CR1_CPHA_CLK_TRANSITION_1,
SPI_CR1_DFF_8BIT, SPI_CR1_LSBFIRST);
//spi_set_full_duplex_mode(SPI1);
spi_enable_software_slave_management(SPI1);
spi_set_nss_high(SPI1);
spi_enable(SPI1);
}
void gpio_init(){
rcc_periph_clock_enable(RCC_GPIOB);
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO6|GPIO12);
/*
* GPIO4 - ST_CP
* GPIO12 - LED
*/
gpio_set(GPIOB,GPIO12);
gpio_clear(GPIOB,GPIO6);
}
void send_xy(uint8_t x, uint8_t y){
spi_xfer(SPI1,x);
spi_xfer(SPI1,y);
// Дергаем RCLK для записи в регистр
gpio_set(GPIOB,GPIO6);
gpio_clear(GPIOB,GPIO6);
}
void main(void){
rcc_clock_setup_in_hse_8mhz_out_72mhz();
spi1_init();
gpio_init();
uint32_t n=1;
uint8_t a=128, b=128;
while(1){
n++;
if(!(n%2))b++;
for(uint16_t i=0;i<256;i++){
send_xy(msin[a],msin[b]);
a+=1;
b+=3;
}
}
}
...

Вот такой нес­ложный код генери­рует дос­таточ­но инте­рес­ную кар­тинку, которая еще и дви­гать­ся будет.

Фигура Лиссажу
Фи­гура Лис­сажу

На этом мы, пожалуй, оста­вим Bluepill и перей­дем к x86_64.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии