• Почему беседа считается самым опасным методом исцеления?… ваши версии

  • Взрослый, ты кто?


  • Что же можно сделать, имея кучу свободного времени, прекрасную доску с дырками под названием BREADBOARD фирмы ASIAN ENGINEER, микроконтроллер PIC, отличный семисегментный индикатор, ну и несколько еще штук?
    ООО, сделать можно многое.  
    Я начал с того, что просто выводил число на индикатор и дико этому радовался. Дело в том, что это не просто семисегментник, а ЧЕТЫРЕ семисегментника одним блоком. Этот индикатор валялся у меня месяца три, и я все не мог понять, как с ним обращаться. Но немного(3 часа) исследований на моем бредборде - и ХАХА, я все знаю. Итак, у него 12 ног: 8 ног отвечают за собственно состав цифры и еще 4 - за то, какая цифра будет гореть. Кроме того - он с общим анодом. Значит, к тем четырем ногам, отвечающим за номер горящей цифры, надо подключать плюс, а остальные 8 замыкать или не замыкать на землю. Так как управлять этим хотелось микроконтроллером, пришлось поставить еще 8 транзисторных ключей.
    Итак, я стал управлять так - на порт Б своего потертого пик16ф84 повесил управление составом цифры, а на порт А - номером цифры. Все заработало, НО у меня осталась только одна свободная нога, да и та в порте А... Что же мне, кнопку вшивую туда цеплять и все?! Это не дело. Чтобы кардинально освободить порт Б, из моей коробочки от губной гармошки был извлечен чудный сдвиговый регистр 74164(КАК ЖЕ Я ЛЮБЛЮ СДВИГОВЫЕ РЕГИСТРЫ!) и срочно установлен. Теперь от порта Б мне вместо восьми ног было нужно только две - для данных и для тактовых импульсов. Надо сказать, что эти регистры записываются с совершенно бешеной скоростью и, даже несмотря на то, что теперь мне нужно было последовательно напихать биты, составляющие маску цифры в регистр, качество отображения не пострадало - цифры все такие же яркие и не мерцают. УХУХУ! 
    Порт А я трогать не стал, и так попрет.

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

    Два дня я ходил и радовался этому таймеру, который к тому же еще и отпугивал родителей от компьтера, создавая видимость какого-то жуткого процесса... Но потом я снова заскучал. В конце концов неплохо бы добавить интерактивности. 
    Все из той же коробочки от губной гармошки была извлечена сногсшибательная микросхема MAX232, славящасся своей способностью лихо и непренужденно преобразовывать уровни rs232 в ТТЛ и наоборот, и скоропостижно установлена вместе с пятью конденсаторами, как повелел ее датащит.  И вот что я скажу: уровни преобразовывать она действительно умеет.

    И все бы замечательно: и UART канал есть, и индикатор - пиши цифры сколько душе угодно. Но только вот индикация у меня динамическая и если просто сделать ввод из ком-порта - контроллер станет услужливо ожидать данных, позабыв про все на свете, и цифры погаснут, что идет в разрез с моим пониманием прекрасного(ну на самом деле не погаснут, а останется гореть только одна, последняя отображаемая перед вводом)
     
    Все это подтолкнуло меня к совершенно мне неведомому прерыванию по rb0. Изначально у меня был очень изящный и простой, но в то же время остроумный план обойтись одной лишь только ногой rb0. Сначал ловить на нее прерывание по стартовому биту, а потом принимать байт данных. Однако, этот план оказался принципиально неработоспособен. Дело в том, что я питал ложные надежды на то, что в линии UART в отсутствие передачи низкий уровень, что на самом деле совершенно неверно. Там высокий уровень и стартовый бит являет собой провал в этом уровне. А прерывание на rb0 как раз(насколько я понял, но это совсем не факт... конечно, можно было бы и почитать где-нибудь, но я люблю потыкать) по высокому уровню. И если поставить все так, как я того хотел - я буду видеть лишь вечное прерывание.

    Ну что ж, добавим ногу. Будем принимать данные в rb1. Но как бы так все же сделать прерывание. Недолго думая, я собрал инвертор из одного несчастного транзистора bc547 и вход его соединил с rb1,а выход - с rb0. И это даже заработало.

    Теперь контроллер все время занимался отображением цифр, но в то же время в нужный момент мог прерваться, принять новое число и отображать уже его. 

    Не знаю, в силу ли цыганского проклятья, магнитной бури или каких-то моих грехов в прошлой жизни, но сразу это правильно не заработало. При отправке байта 0000 0000 принимался 1000 0000, при 0000 0001 - 1000 0001 и так далее. То есть откуда-то бралась единица в старшем разряде. И с числами, у которых она и так есть все было в порядке. Например, 128 (1000 0000) передалось чудесно. Должен признаться, я смалодушничал. Битый час промаявшись с этой бедой и перепробовав все мыслимые настройки ком-порта, я так и не понял, откуда берется эта чертова единица и просто снизил скорость с 9600 на 4800. И это помогло...

    Теперь недурно бы написать управляющую программу на компьютер и засылать в контроллер какие-нибудь осмысленные данные...









  • Почему беседа считается самым опасным методом исцеления?… ваши версии

  • Взрослый, ты кто?