Быстрый заказ, позвонить +7-978-708-85-73
Дроссель Amadeus Productions. Быстрый заказ по телефону.
(Viber, WhatsApp, Telegram)
Amadeus Productions Дроссельный узел на Lancer IX 1.6 (4G18), 2.0 (4G63) и другие моторы
Ремкомплект РХХ на Mitsubishi Lancer IX, 1.6 (4G18), MD619857, 1450A116
Облегченный маховик на 1.6 (4G18) и другие моторы
Облегченные шкивы на 1.6 (4G18) и другие моторы
One-touch или "Ленивые поворотники"

10 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Микроконтроллеры
SSh
сообщение 9.9.2009, 17:52
Сообщение #1


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Ну что, начнем. Заранее заявляю, что я сам тоже новичок в этом деле, так, что если что не так с удовольствием приму и критику и замечания и дополнения.
Что такое микроконтроллер (МК)? Это микросхема которая сама по себе АБСОЛЮТНО ничего не умеет делать в отличии от даже самой примитивной логики. Для того, чтобы заставить МК выполнять какую-нибуть работу надо прошить (загрузить) в него программу. МК выпускаются многими фирмами - Mikrochip, Atmel, Motorolla, etc. Здесь будут рассматриваться только МК фирмы Mikrochip, так называемые pic-контроллеры.
Их легко различить по маркировке от других, название начинается с префикса PIC или (в современных сигнальных процессорах) dsPIC, например, PIC18F2520, PIC16F877 и т.д. Наиболее употребимые в любительской практике - 8-разрядные контроллеры среднего и высшего семейств, PIC16 и PIC18.
Буква "F" в маркировке МК означает, что он может многократно перезаписываться, т.е. если по каким-либо причинам надо поменять программу (прошивку), то это легко можно осуществить при помощи программатора (об этом попозже). Есть МК и с буквой "С" - это однократно программируемые.
Питание МК - +5В, хотя многие из них могут работать и при пониженном напряжении, от +2,5В.
Потребляемый ими ток насколько мал, что о нем и говорить неудобно dry.gif
Так что-же все таки представляет собй МК? Это микросхема с определенным количеством выводов (8, 14, 16, 18, 20, 28, 40 и т.д), как минимум двое из которых предназначены для подачи питания, а почти все остальные представляют собой линии ввода-вывода. Почти - потому-что есть МК, которые обязательно должны тактироваться внешним кварцем (еще 2 вывода) и/или имеют отдельный вывод сброса. А есть и такие, что могут работать как от внешнего так и от внутреннего генераторов, в этом случае освободившиеся выводы тоже можно использовать для дела. Конкретно количество выводов данных можно посмотреть в даташите на конкретный МК.
Т.к. МК 8-и битные, то и выводы организованы в шины той-же разрядности, или, как их называют - порты.
В зависимости от кол-ва ножек могут быть порты A, B, C, D, E, которые на изображении МК обозначаются след. образом: буква R, затем наименование порта, затем номер разряда порта, напр. RA0, RC2, RB7...
В МК совсем необязательно наличие всех разрядов какого-либо порта, например, могут быть RC3...RC7, a RC0, RC1 и RC2 - отсутствовать. В принципе, это не имеет значения, т.к. любой порт можно запрограммировать на выполнение практически любой задачи (исключая некоторые специфические, такие, как обмен данными по USB или Ethernet), так, что без разницы - подключен, например, светодиод, сигнализирующий о превышении температуры к порту RB5 или RE0.
Исключение составляют выводы порта А, которые можно сконфигурировать так, чтоб они работали в аналоговом режиме (все остальные только цифровые). Естественно, порт А также может работать в цифровом режиме, что он и делает по умолчанию. Аналоговый режим используется для задействования встроенных АЦП - аналого-цифровых преобразователей, с их помощью измеряются аналоговые сигналы, например, напряжение, показания термодатчиков и т.д.
С распространением различных протоколов на определенные выводы могут также возлагаться дополнительные функции. Это не значит, что с другими выводами нельзя добиться результата, просто, если на вывод подключена какая-либо доп. функция, то результат достигается более легкими программными способами.
Для примера приведу обозначения выводов МК PIC16F876

1 MCLR/VPP/RE3
2 RA0/AN0
3 RA1/AN1
4 RA2/AN2/VREF-/CVREF
5 RA3/AN3/VREF+
6 RA4/T0CKI/C1OUT
7 RA5/AN5/SS/HLVDIN/C2OUT
8 VSS
9 OSC1/CLK1
10 OSC2/CLK0
11 RC0/T1OSO/T13CKI
12 RC1/T1OSI/CCP2
13 RC2/CCP1
14 RC3/SCK/SCL
15 RC4/SDI/SDA
16 RC5/SDO
17 RC6/TX/CK
18 RC7/RX/DT
19 VSS
20 VDD
21 RB0/INT
22 RB1
23 RB2
26 RB3/PGM
25 RB4
26 RB5
27 RB6/PGC
28 RB7/PGD

Смотрим, что мы тут имеем. МК имеет 2 вывода для соединения с общим проводом (8 и 19 - Vss), вывод питания - 20 - Vdd, отдельные выводы для подачи тактовых импульсов или подключения кварца - 9 - OSC1/CLK1 и 10 - OSC2/CLK0. Вывод сброса по желанию можно переконфигурировать для обработки данных - 1 - MCLR/VPP/RE3, т.е. он превращается в RE3. Все остальные - данные.
Дальше, некоторые выводы не имеют никаких специальных функций, например, RB1...RB7. Здесь PGM, PGC, PGD, а также Vpp на выводе 1 - сигналы с программатора, после прошивки МК они (имеются в виду сигналы а не выводы) не используются. Порты А, как видно, могут переконфигурироваться и работать как AN0...AN5 - аналоговые входы.
Некоторые сигналы (вернее протоколы) могут нам никогда и не понадобиться, так, что не стоит сейчас акцентировать на них внимание, просто опять же для примера упомянем
17 - RC6/TX/CK
18 - RC7/RX/DT, т.е. если надо, чтоб МК взаимодействовал с компьютером по последовательному интерфейсу (СОМ порт), то для этой цели лучше выбрать выводы 17 и 18, т.к. на них посажены также режимы RX и TX.

-----------------
Естественно, т.к. МК работают под управлением программы, то в них должна быть предусмотрена память для этих самых программ. В зависимости от МК объем памяти может колебаться от сотен байт до десятков килобайт. Память, как уже отмечалось, обычно многократно перезаписываемая.
Помимо программной МК может также иметь RAM память (ОЗУ) - для временного хранения данных/переменных во время работы программы, а также EEPROM - постоянная память для хранения данных при выключенном питании контроллера. Скажем, если на контроллере построен борткомпьютер, то, например, пройденный путь или израсходованный бензин надо писать именно в EEPROM, иначе данные потеряются после выключения зажигания. Данные же о мгновенном расходе пишутся в RAM. Конкретно объем программной памяти и наличие/отсутствие и объем RAM и EEPROM надо опять же смотреть в соотв. даташитах.
-----------------
Я честно говоря, не знаю, надо ли продолжать или нет, т.к. в сети есть куча информации по различным МК, так, что если есть желание, то изучить их работу в желаемом для себя объеме нетрудно.
Если есть интерес к обсуждению этого вопроса именно здесь а не на спец. форумах, то в след. раз поговорим о самих программах и программаторах.









Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Titus
сообщение 10.9.2009, 0:06
Сообщение #2


Don Amadeus
*******

Группа:
Главные администраторы
Сообщений: 29929
Регистрация: 19.2.2009
Из: Russia, Sevastopol
Вне форума
Авто: Lancer IX-1.6 MT Turbo, Honda Accord IX-2.4 AT Executive.

Репутация:   465  


Спасибо, отлично, как базовый материал wink.gif
Если действительно интересно продолжать - скажите, плз, надеюсь, что SSh сочтет нужным продолжить тему, да и я может чем полезным окажусь wink.gif
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
TCL
сообщение 10.9.2009, 2:40
Сообщение #3


Технический Маньяк
***

Группа:
Технический Маньяк
Сообщений: 407
Регистрация: 19.2.2009
Из: г. Брянск
Вне форума


Репутация:   0  


Конечно. Мне интересно.


--------------------
Lancer IX 1.6 MT 2004, black


Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Titus
сообщение 10.9.2009, 3:18
Сообщение #4


Don Amadeus
*******

Группа:
Главные администраторы
Сообщений: 29929
Регистрация: 19.2.2009
Из: Russia, Sevastopol
Вне форума
Авто: Lancer IX-1.6 MT Turbo, Honda Accord IX-2.4 AT Executive.

Репутация:   465  


Тогда сразу ссылка на один из моих любимых сайтов: http://easyelectronics.ru (кстати, тоже друг нашего сайта и форума).
Это ни в коем разе - не поправка и не дополнение к словам SSh, просто ссылка на интересные материалы, тоже написанные в очень доступной форме для чтения и понимания. Советую изучить рекурсивно все, что есть на сайте smile.gif
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Onega
сообщение 10.9.2009, 9:14
Сообщение #5


Банный маньяк. Надежный как румынская авиация
*******

Группа:
Почетные ветераны
Сообщений: 5244
Регистрация: 17.3.2009
Из: Ярославль
Вне форума
Авто: Lancer STW 1.6AT

Репутация:   147  


ту би контьюниед..... ждем продолжения


--------------------
Бригады строителей - это расходный материал

З.ы. Бригады строителей как расходный материал делятся на нормальных и русских.

Toyota - управляй мечтой! Хочу - мечтаю. Хочу - не мечтаю. Управляю мечтой...


Lancer STW 1.6 AT red 2008
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 10.9.2009, 13:10
Сообщение #6


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Ну что же, продолжим.

Посмотрим, из каких модулей может состоять МК. Упомянем только о тех модулях, которые стандартно присутствуют почти во всех современных контроллерах, спец. МК (например со встроенным USB) рассматривать не будем.
Сразу же, применительно к модулям, рассмотрим и соотв. управляющие регистры, т.к. для того, чтобы задействовать тем или иным образом какой-то модуль его надо как-то сконфигурировать, а иногда даже и включить.
Что такое управляющий регистр. Это специальная область в памяти МК, размер каждого регистра - 8 байт, меняя которые можно настроить модуль. Некоторые модули управляются не одним а несколькими регистрами, так сказать для тонкой настройки. Все регистры имеют имена, так, что обращаться к ним и управлять не составляет труда.
Теперь об основных модулях. Для лучшего понимания давайте определимся с типом МК и скачаем его даташит. Раз уже упоминали PIC16F876 давайте на нем и остановимся.

Модули ввода/вывода.
По вышеприведенной таблице легко можно посмотреть, что мы имеем для ввода/вывода данных. Если на графическом изображении порты обозначались через R, то в программах они упоминаются как PORTx, и, если требуется обращение к конкретному биту, через точку - номер бита, например, PORTA.2 - это вывод RA2 МК. Таким образом можно обращаться к любому выводу любого порта МК. Тут возможна и групповуха (в хорошем смысле слова), например, если надо установить некоторые логические уровни на всех 8 разрядах какого-либо порта, то пишем
PORTB = %11001100 - % - признак того, что число двоичное, 7 и 6-й разряды установлены в 1 (т.е. есть сигнал), 5 и 6 - в 0, ну и т.д.
То же самое можно записать и в десятичной и в шестнатиричной формах
PORTB = 204
PORTB = $CC
Или по мазохистски (но так писать не будем, только в качестве примера)
PORTB.0 = 0
PORTB.1 = 0
PORTB.2 = 1
PORTB.3 = 1
PORTB.4 = 0
PORTB.5 = 0
PORTB.6 = 1
PORTB.7 = 1
Так же можно и считать значения с портов, например, если бит 3 порта А через кнопку посажен на общий провод, то ее нажатие в программе распознается так (пока своими словами, не привязываясь к конкретному языку программирования)
Если PORTA.3 = 0, то выполнить такие-то действия.
Следует заметить, что все порты выполнены по схеме с открытым коллектором. Для нас это означает, что если вывод не подключен никуда, то на нем может присутствовать неопределенный уровень. Для борьбы с неопределенностью надо подтянуть порты на + или корпус через так называемые pull-up резисторы (4,7 ... 10 кОм). Для предыдующего примера резистор должен быть подключен на +. Ясно почему? Пока кнопка не нажата через него на PORTA.3 гарантированно подается высокий уровень, т.е. PORTA.3 = 1.
Но в некоторых случаях можно резисторы не ставить, например, если на выводе сидит светодиод - то он уже является нагрузкой и лишние резисторы не нужны.

Другой важнейший регистр портов - TRIS - определяет направление передачи данных, 1 - на вход, 0 - на выход (запоминаем 1 - I - Input, 0 - O - Output), он используется тогда, когда надо точно обозначить прием или передачу данных. По аналогии с предыдующим, если
TRISA = %10000001, то разряды 0 и 8 сконфигурированы на вход, остальные на выход. Это имеет смысл если на выводы посажены скажем, кнопки - то однозначно вход, светодиоды - выход. Если же какие-то операции требуют двунаправленного канала, например для считывания данных с цифрового датчика температуры, то направление не обозначаем, программа сама сделает все за нас.

Забегая вперед скажу, что направления в некоторых случаях можно и не обозначать если язык программирования может сделать это за нас. Например если есть команда для измерения напряжения при помощи встроенного АЦП, то логично, что этот бит должен работать только на вход. Ничего не мешает разработчику организовать библиотеку так, чтобы при подаче команды порт сначала конфигурировался соотв. образом, потом начинал мерить. Так, что, в каждом конкретном случае, будем внимательно читать и описание языков программирования, чтоб не городить ненужных команд.

Модуль АЦП - аналого-цифровое преобразование.
Как уже упоминалось PORTA, а в некоторых МК и часть других портов, можно использовать как аналоговые. АЦП этих портов 10-разрядный (есть МК с переключаемой разрядностью АЦП - 8 или 10). Это дает нам до 1024 градаций измеряемого напряжения (2^10=1024), т.е. точность измерения примерно равна 5В/1024 = 0,005В, что вполне достаточно для практического применения. Точность измерения зависит и от опорных напряжений - Vref. Хотя опять же на практике достаточно в качестве опорного использовать напряжение питания самого МК, мы можем подать на определенные выводы внешнее Vref.
Вот всеми этими делами и заправляют регистры управления АЦП - ADCON0 и ADCON1.
ADCON0 часто можно и не трогать, его значения по умолчанию во многих случаях нас удовлетворят, а вот ADCON1 надо настроить обязательно. С его помощью устанавливаются аналоговые и цифровые входы, а также выбор Vref. Рассмотрим его поподробнее
Старший бит (7) устанавливает формат результата, нам надо выравнивание вправо, т.е. так, как мы привыкли видеть числа. далее идут 3 незадействованных бита, и, наконец 4 последних, которые и определяют то, о чем упоминалось выше
Лучше рассмотреть на примерах, сравнивая с даташитом
ADCON1 = %10000000 - все выводы аналоговые, опорным является напряжение питания.
ADCON1 = %10000110 - все выводы - цифровые, об опорном напряжении нет смысла говорить, как, впрочем и о 7 бите.
ADCON1 = %10001110 - RA0 - аналоговый, все остальные - цифровые. Так можно сконфигурировать скажем схему простогоо одноканального вольтметра.
Все возможные комбинации приведены в описании на МК.
Ну и т.д, думаю понятно.

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

Наибольший интерес лично для меня представляет модуль MSSP, т.к. с его помощью облегчается взаимодействие МК с внешними устройствами, работающими по протоколу I2C или SPI, такими как микросхемы EEPROM, часы, напр. DS1307, MMC/SD карты памяти и т.д. В нашем МК есть выводы SCL и SDA (RC3, RC4) к которым и подключаем соотв. выводы скажем микросхемы часов DS1307. Не вникая в тонкости протокола, а они нам и не нужны, просто говорим - передать по шине I2C такую-то команду, или наоборот, принять байт по той же шине и все. Другое дело, что передавать и принимать. Тут уж нужен индивидуальный подход для каждого периферийного устройства. Это не зависит от самого МК. Но и это не проблема, например в даташите на DS1307 написано, что для того, чтобы "встряхнуть" его надо подать опред. команду, после чего начать считывать по тем же линиям ответ (в данном случае дату и время). Все это легко реализуется средствами языков программирования.
След. на моей очереди - USART, а конкретнее хочу подцепиться контроллером к лансеровскому MUT2.
Тут вся хитрость состоит в том, что согласно описанию протокола MUT2, его надо сначала инициализировать на одной скорости обмена, потом начать взаимодействовать с ним (спрашиваем - отвечает) на другой. Вот разберусь с делами - займусь этим.

Вот и все про модули, дальше распространяться думаю не надо. Главное понять суть, а дальше нетрудно и самому разобраться.

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

Да, чуть не забыл про модуль тактового генератора. Но в тех компиляторах, которые использую я, все настройки этого модуля производятся в настройках проекта, так, что о генераторе поговорим во время рассмотрения языков программирования.
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 12.9.2009, 8:08
Сообщение #7


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Поехали дальше.
Как уже отмечалось, для того, чтобы добиться от МК какой либо деятельности его надо прошить соответствующей программой. Сама скомпиллированная программа представляет собой набор символов в hex (шестнатиричном) формате и если открыть ее в блокноте имеет след вид:
:1000000043290830211901308F008E012408840013
:100010002208BB202208800484130005FF3E211D16
ну и т.д.

Для заливки программы требуется программатор, который как правило состоит из двух компонент - аппаратной и программной. Аппаратная часть является по сути согласующим интерфейсом между компьютером и МК, всю работу по заливке - формирование управляющих импульсов, передача данных, проверка (верификация) правильности записи и т.д. берет на себя программная оболочка. Существует множество типов программаторов под разные интерфейсы - COM, LPT, USB. Самые быстрые, конечно, USB-шные, но если не предъявлять особых требований, то подойдут и самодельные, на COM или LPT.
Один из самых распространенных программаторов - PonyProg, схема его аппаратной части и программная оболочка доступны для свободного скачивания, он хорош тем, что состоит из базового блока и доп. адаптеров, предназначенных для прошивки различных чипов. Т.е. если вдруг понадобиться запрограммировать скажем память 93 или 24 серий, то достаточно сделать адаптер и все.
В свое время я переделал кучу программаторов - PonyProg, SOLO, JonisProg и т.д, но потом купил USB-шный фирменный PicKit2 oт Microchip, который при всех остальных достоинствах позволяет также программировать внутрисхемно, т.е. не надо при каждой перепрошивке вытаскивать чип из схемы, зашивать его в программаторе а потом заново устанавливать на место. Тем более, что с микросхемами для поверхностного монтажа вообще морока получается. Но... при разработке той или иной схемы приходилось все-таки травить печатную плату, собирать схему, если что ни так - переделывать, что очень тормозило работу. И вдруг на глаза мне попался сайт фирмы Mikroelektronika - mikroe.com, которая помимо того, что выпускает компиляторы для МК, так еще осуществляет аппаратную поддержку в виде макетниц EasyPic5 и всевозможных периферийных дополнительных модулей и все это по приемлемой цене. Сами макетницы снабжены встроенным программатором, программная оболочка которого запускается прямо из среды компилятора.
Получается вот какое удобство - пишешь программу, нажимаешь на кнопку - программа компилируется, прошивается и сразу видишь результат.
Подробно плату описывать не буду - кому надо можно посмотреть на сайте. Если возникнут какие-нибуть вопросы - пишите.
В качестве языка программирования также выбрал компилятор этой же фирмы - MikroBasic Pro. Во-первых он очень легок в освоении, во-вторых имеет очень хороший Help, ну и немаловажно то, что к ниму прилагается куча примеров, почти на все случаи жизни. Да и форум на сайте очень активный.
Там же есть компилляторы MikroC и MikroPascal, отличаются друг от друга только синтаксисом.
При использовании указанных компиляторов совсем не обязательно иметь программаторы от той же фирмы, результатом их работы является hex файл прошивки, который можно залить в МК любым другим программатором. Просто вышеописанным образом резко повышается производительность.
Ещё могу посоветовать PicBasic Pro, тоже неплохой компиллятор для начинающих.
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Onega
сообщение 23.9.2009, 9:05
Сообщение #8


Банный маньяк. Надежный как румынская авиация
*******

Группа:
Почетные ветераны
Сообщений: 5244
Регистрация: 17.3.2009
Из: Ярославль
Вне форума
Авто: Lancer STW 1.6AT

Репутация:   147  


моск плавится. но стараюсь изучить.


--------------------
Бригады строителей - это расходный материал

З.ы. Бригады строителей как расходный материал делятся на нормальных и русских.

Toyota - управляй мечтой! Хочу - мечтаю. Хочу - не мечтаю. Управляю мечтой...


Lancer STW 1.6 AT red 2008
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 23.9.2009, 9:28
Сообщение #9


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Если что непонятно написано - спрашивайте, я пока подготавливаю след. части.
В любом случае без практических занятий сложно, а вот если попробовать - сразу становиться понятно. Это я исходя из собственного опыта говорю.
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Engineer
сообщение 23.9.2009, 13:36
Сообщение #10


Технический Маньяк
***

Группа:
Технический Маньяк
Сообщений: 189
Регистрация: 28.7.2009
Из: Регион 52
Вне форума


Репутация:   0  


Читается и понимается легко, в отличие от заумных книжек.
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
dmitrij_b
сообщение 23.9.2009, 16:25
Сообщение #11


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 1802
Регистрация: 21.2.2009
Из: Екатеринбург
Вне форума
Авто: Lancer IX 1.6MT (105HP)

Репутация:   108  


Надо, наверное, скозать еще о том, что микроконтроллер - это на самим деле такой небольшой компьютер в виде одной микросхемы. На борту у этой микрухи всегда есть проц, ПЗУ под программу и некоторое колличество оперативной памяти. Про пики не скажу, я больше по AVR-ам прибиваюсь пока, дак вот у них еще и некоторое колличество энергонезовисимой памяти есть. То есть особо важные данные (например настройки устройства) не пропадут при отключении питания.
И, до кучи, в эту-же микоросхему напихано некоторое колличество периферии. Как-то таймеры, компараторы, АЦП-шки, интерфейсы связи с внешним миром (чаще всего последовательные), и еще всякая полезная шушара. Напихано это добро для того, чтобы разработчик не забивал себе голову реализацией всего нужного ему хозяйства программным способом. И это надо сказать большое подспорье.
Естественно в разных моделях микроконтроллеров набор периферии разный, да и размеры ПЗУ, оперативки EEPROM - ов тоже.


--------------------
Lancer IX 1.6 MT 2006г. & клубные рамки NLC
--------------------
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 24.9.2009, 12:45
Сообщение #12


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Продолжим.
В подавляющем большинстве случаев МК должен работать не в одиночку, а с некоторой периферией, например, светодиодные или ЖК индикаторы, кнопки, датчики, и т.д. Причем некоторые из периферийных устройств не требуют специальных протоколов обмена - светодиоды, кнопки, другие же, наоборот, работают только по своим специфическим протоколам. Протокол обмена - это как бы язык, на котором два устройства "разговаривают" друг с другом. К нашему облегчению многие стандартные и распространенные протоколы реализованы в МК на аппаратном уровне (об этом уже говорилось) остается понять как можно организовать обмен данными между МК и внешним устройством.
Одним из наиболее востребованным периферийным устройством является многострочный ЖК индикатор, обычно применяются индикаторы 16х2 (2 строки по 16 символов в каждой). Не вдаваясь в подробности его работы посмотрим как можно управлять им при помощи МК. Сразу отметим, что почти всегда требуется при использовании какого-либо устройства справляться с его описанием (datasheet), хотя бы для того, чтоб узнать расположение выводов и сигналов.
Для управления такими ЖКИ обычно требуются сигналы данных (4-х разрядная шина) - D4...D7, выбора кристалла - Е, и сигнала выбора между данными и инструкциями (командами) - D/I или RS (разные производители могут обозначать по-разному). Т.е. для управления нам потребуется 6 линий - 6 выводов МК.
Естественно и питание надо подключить и, желательно, регулировку контрастности, но в этом деле сам МК не участвует.
Сразу же определимся с языком программирования, т.к. хотя смысл программы на разных языках и не меняется, но они отличаются синтаксисом. Предлагаю для начала выбрать MikroBasic Pro (МВР), производство Mikroelektronika.
1. Полнофункциональную версию можно скачать с сайта www.mikroe.com, ограничение только на размер кода, для изучения нам хватит и усеченной версии.
2. Программа имеет очень хороший Help, множество примеров и форум поддержки.
3. При желании можно легко освободиться от ограничений wink.gif
4. Фирма предлагает по доступной цене множество демо плат, при желании можно не заморачиваться с изготовлением того или иного устройства а просто собрать его "из кубиков"
5. Все команды организованы в виде библиотек, которые полностью документированы, возможно добавление собственных библиотек.
6. Одновременно с описанным выпускаются также MikroC и MikroPascal, которые отличаются только синтаксисом, так, что каждый может выбрать себе компиллятор по вкусу.

Т.к. язык уже выбран - кратко о структуре программы, она (эта самая структура) должна иметь вид:
program Имя_программы ' заголовок программы

объявление различных переменных, а также соединений периферийных устройств с выводами МК

main: ' точка входа в основную программу
Сама программа
.....
.....
.....
.....
end. ' Конец программы, обратите внимание, в конце стоит точка
Здесь мы не обозначили подпрограммы, но пока и не надо, первую программу напишем "в упор", без подпрограмм.

Ладно, вернемся к нашему ЖК.
Перво-наперво надо сообщить МК, к каким его выводам подключаются какие выводы ЖКИ.
После этого может начаться сама программа, надо очистить ЖКИ, выключить курсор на нем, чтоб не мельтешил перед глазами и написать что-нибуть.
Как видим, мы здесь в принципе даже и не пытались программировать, просто рассказали что требуется.
А теперь запрограммируем, читая help.
Все, что написано на строке после символа ' является комментарием и игнорируется программой. Это надо для нас, чтоб по прошествии времени могли вспомнить, что мы тут нагородили...

program LCD

' Lcd connection
dim LCD_RS as sbit at RB4_bit ' Вывод RS индикатора подключен к выводу RB4 МК (Для pic16f876 это вывод 25)
LCD_EN as sbit at RB5_bit ' Остальные писать не будем, и так все ясно...
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit

LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd connections

main: ' Начало основной программы

Lcd_Init() ' Проиницилизируем (встряхнем) ЖКИ
Delay_ms(200) ' Выдержим паузу в 200 мс, можно и не делать, но лучше дать ЖКИ время очухаться
Lcd_Cmd(_LCD_CLEAR) ' Очистить экран
Lcd_Cmd(_LCD_CURSOR_OFF) ' Выключить курсор

Lcd_Out(1, 1, "AMADEUS") ' Вывести в 1-й строке на 1-й позиции слово AMADEUS
Lcd_Out(2, 1, "PROJECT") ' 2 строка, 1 позиция

End. ' Закончить программу.

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

Здесь мы рассмотрели связь МК с устройством, которое хотя и работает по опред. протоколу, но в МК нет соответствующей аппаратной поддержки. Дальше рассмотрим связь с простейшей периферией (если можно так назвать кнопки и светодиоды) и потом и связь под конкретный протокол. ЖК индикатор оставим подключенным к МК, он нам никогда не помешает.



Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 25.9.2009, 10:14
Сообщение #13


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


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

Имеем 2 кнопки, светодиод и ЖК индикатор из предыдующего примера. При подаче питания светодиод погашен, на индикаторе же высвечивается 0. При нажатии на одну из кнопок (та, что идет на RA4), число на индикаторе увеличивается на единицу с частотой 2 раза в секунду, до тех пор, пока кнопка нажата, вторая кнопка работает по другому - число увеличивается на единицу при однократном нажатии, т.е. для след. увеличения надо отпустить и снова нажать кнопку. Помимо этого, когда число становиться равным 10, загорается светодиод, при всех остальных значениях - тухнет.
Разберемся, что к чему....
Первая часть нам уже знакома, это описание того, к каким выводам МК подключен ЖКИ.
Дальше идет описание переменных. Дело в том, что если в программе присутствуют некоторые переменные, то они должны быть описаны заранее, с указанием их типа. Все возможные типы перечислены в описании МВР, здесь же мы применяем 2 типа - byte - это байтовая переменная, которая может принимать значения от 0 до 255 (см. help) и символьная - char, число в квадратных скобках - количество символов. Понятно, чтоб воспроизвести любое число, организованное byte-м надо 3 символа.
Переменная - это любые изменяющиеся в ходе выполнения программы данные. Это как X, Y, Z и т.д. знакомые еще из школы. Навания (имена) переменным придумываем сами, можно вообще называть их как угодно, AAA, BBB, hrtdys, но лучше, конечно, чтоб по имени было ясно, что это за переменная, например, если она отмосится к измерению напряжения, лучше назвать её VOLTAGE, а не VVV smile.gif.
Надо только обращать внимание на то, чтоб переменным не присваивались имена, совпадающие с зарезервированными в данном компилляторе словами, например, переменную нельзя назвать lcd_out, т.к. это команда МВР.
Здесь у нас используются след. переменные
press и num - байтовые
number - строка из 3-х символов.
num - это как раз то число, которое меняется при нажатии на кнопки, а number - то же число, но уже в символьном виде, для того, чтобы ЖКИ смог его воспроизвести. Т.е. с первым из них можно производить математические операции (конкретно у нас - прибавляем единицу), но нельзя воспроизвести, а со вторым мат. операций не совершишь, но воспроизвести можно.
press - вообще нигде не видна, но она нужна нам для организации признака однократного нажатия на кнопку.
В этой же программе посмотрим и то, как организуются подпрограммы (процедуры). В принципе то, что написано в процедуре можно написать и в теле программы (т.е. после main:), но с применением процедур
Во-первых сама программа становиться более так сказать читабельной и понятной
Во-вторых, если в течении выполнения программы надо чтобы какое-либо действие выполнялось несколько раз, то придется соотв. число раз писать в программе одно и то же, а так просто вызываем нужную процедуру - и все.
Ну и много других положительных моментов...

Т.к. процедуры расположены до точки входа main:, то они при включении не выполняются до тех пор, пока их не вызовут из тела главной части (между main: и end.)
Рассмотрим это тело подробно smile.gif
TRISA = %11111111 - т.к. к портам А подключены кнопки, то, естественно, он должен работать на вход
TRISC = 0 - здесь все наоборот, подключен светодиод - значит выход
ADCON1 = %10000110 - кнопка или нажата или отжата, значит все входы - цифровые (см. datasheet на pic16f876)
press = 0 - промежуточная переменная равна 0, потом рассмотрим подробнее
num = 0 - с начала работы программы число на индикаторе равно 0

Далее идут команды инициализации ЖКИ, они нам уже знакомы
Часть программы между while и wend - бесконечный цикл, т.е. все, что находится между этими командами будет повторяться до тех пор, пока не выключим питание МК.
И что же в этом цикле? Все это легко описывается словами, в принципе, думаю, и так понятно, но все-же...
1.
if Button(PORTA, 4, 1, 0) then
num = num + 1
Delay_ms(500)
end if
Если нажата кнопка, подключенная к RA4, то увеличить значение num на единицу. Подождать пол-секунды и продолжить. Если же ничего не нажато, то просто продолжить.

2.
SelectMode()
Перейти из тела программы к выполнению процедуры SelectMode и после её выполнения возвратиться к следующей по порядку команде.

3.
if num = 100 then
num = 0
end if
Если мы уже столько понажимали на кнопки, что счетчик достиг 100 - обнулить его. Ясно, если еще меньше 100 - ничего не предпринимать.

4.
if num = 10 then
PORTC.0 = 1
else
PORTC.0 = 0
end if
Еще одно условие, если на счетчике 10, то зажечь светодиод, подключенный к выводу RC0, в противном случае (else) светодиод погашен.

5.
ByteToStr(num,number)
Lcd_Out(1, 1, number)
Первая строчка делает то, о чем уже упоминалось - переводит байтовое (числовое) значение в строчное, чтобы можно было отобразить его на ЖКИ, что и выполняется след. строкой. Здесь в отличии от предыдующего примера number - без кавычек, т.е. в соотв. позицию подставляется не само слово а значение той переменной, именем которой оно является.

6. Ну и подпрограмма
sub procedure SelectMode()
if press = 0 then
if Button(PORTA, 3, 1, 0) then
num = num + 1
press = 1
end if
end if

if Button(PORTA, 3, 1, 1) then
press = 0
end if
end sub

Должна быть заключена между sub procedure end sub
Тут мы слегка хитрим для того, чтобы организовать однократное нажатие на кнопку.
Переменной press мы изначально присвоили 0, поэтому при первом нажатии на кнопку выполняется условие if press = 0 и система реагирует на нажатие, но одновременно присваивает переменной значение 1.
Если мы кнопку не отпускаем, то она так и остается равной 1, и при след. вызове процедуры программа не выполняет команду увеличения счетчика. Как только мы отпустили кнопку - if Button(PORTA, 3, 1, 1) -
press обнуляется, т.е. след. нажатие регистрируется.
Пару слов о команде Button, хотя она и подробно описана в help, но все-же...
Button(PORTA, 3, 1, 1) - кнопка подключена к выводу RA3, первая единица устанавливает время подавления дребезга контактов, вторая - изменение состояние. Т.е. если RA3 подтянут на +5В, то
Button(PORTA, 3, 1, 0) - означает нажатие кнопки
Button(PORTA, 3, 1, 1) - отпускание.


Вот и сама программа:

program button

' Lcd module connection
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit

LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

dim press, num as byte ' Объявление переменных
dim number as char[3]

sub procedure SelectMode() ' Подпрограмма (процедура)
if press = 0 then
if Button(PORTA, 3, 1, 0) then
num = num + 1
press = 1
end if
end if

if Button(PORTA, 3, 1, 1) then
press = 0
end if
end sub ' Окончание процедуры

'########################## MAIN PROGRAMM ########################
main:
TRISA = %11111111
TRISC = 0
ADCON1 = %10000110
press = 0
num = 0

Lcd_Init()
Delay_ms(200)
Lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_CURSOR_OFF)
Delay_ms(200)

while true
if Button(PORTA, 4, 1, 0) then
num = num + 1
Delay_ms(500)
end if

SelectMode()

if num = 100 then
num = 0
end if

if num = 10 then
PORTC.0 = 1
else
PORTC.0 = 0
end if

ByteToStr(num,number)
Lcd_Out(1, 1, number)
wend
end.

-------------------

Дальше - попробуем собрать уже необходимое в хозяйстве устройство - часы...
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 27.9.2009, 12:09
Сообщение #14


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Как и было сказано ранее - попытаемся сделать что-то полезное а не просто "там нажал, тут светит" smile.gif
Будем делать часы, с применением специализированной микросхемы DS1307. Для этого дополним схему голубой частью, а светодиод исключим из схемы, хотя, в принципе он нам и не мешает, пусть остается. Вместо резервной батареи питания часов можно просто закоротить вывод 3 DS1307 на общий провод, если его оставить пустым - микросхема не будет работать.
DS1307 представляет собой 8-ножечную микросхему, взаимодействующую с внешним миром по протоколу I2C. Это стандартный протокол, применяется во многих устройствах, например в микросхемах памяти eeprom, так, что его изучение не помешает (естественно на том уровне, чтоб мы лишь бы смогли подцепить такое устройство к МК, большего и не надо).
Во многих МК на аппаратном уровне заданы выводы для I2C устройств, хотя, как уже отмечалось, их можно посадить куда угодно, организуя этот протокол программно.
I2C устройства взаимодействуют с внешним миром по 2-х проводной шине, SCL-синхронизация и SDA-данные. Т.е. вся информация передается по двум проводам, это особенно удобно если 2 устройства разнесены друг от друга или надо сэкономить выводы МК.
На графическом обозначении pic16f876 видим, что SCL сидит на RC3, SDA - на RC4. Но здесь мы организуем программную реализацию протокола, для того, чтоб просто не занимать PORTC.
Сначала слегка изучим саму DS1307 (RTC - Real Time Clock). Как? Конечно качаем datasheet. Опять же, все читать не надо, только суть, которая состоит в том, что

Для того, чтобы читать из DS1307 надо подать команду 11010001 ($D1)
Для записи в неё - 11010000 ($D0)
Время и дата располагаются в области памяти, начиная с 0,
0 - секунды
1 - минуты
2 - часы и т.д.
Время и дата считываются не в нашем родном десятичном формате, а в каком-то непонятном BCD (Binary Coded Decimal) - двоично-десятичном. Что это такое - черт его знает, ну да ладно, потом разберемся...
Ну и естественно смотрим типовую схему включения, куда что паять.
Все, больше нам ничего и не надо, все нарисованные графики, диаграммы и т.д.
Только поймем, почему использован кварц на 32768 Гц, число какое-то ни к селу ни к городу. Оказывается, если это число последовательно делить на 2, то в итоге получим 1, т.е. интервал в 1 секунду, а деление на два самая простая операция в цифровой технике.
Вооружившись этими сведениями примемся за программирование.
Т.к. считанное время надо куда-то выводить - используем ЖКИ, работу с которым уже изучили.
Далее, любые часы требуют коррекции, значит надо иметь кнопки для установки - как с ними работать - тоже знаем.

Сразу же привожу текст программы, все, что на русском - здесь комментарии, все, что уже описывалось ранее - не комментируем.
Почти во всех языках программирования, если перед числом стоит знак $, то подразумевается, что имеется в виду шестнацитиричное число, % - двоичное, ничего нет - десятичное. Для справки - компиллятор MikroBasic имеет в своем составе конвертор чисел, так, что, не надо объяснять как производится перевод из одной системы счисления в другую wink.gif

program DS1307

'
' Lcd module connection
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit

LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

' По аналогии с описанием ЖКИ, здесь описано соединение выводов DS1307 с МК
' SCL - RB7
' SDA - RB6
' Software I2C connections
dim Soft_I2C_Scl as sbit at RB7_bit
Soft_I2C_Sda as sbit at RB6_bit
Soft_I2C_Scl_Direction as sbit at TRISB7_bit
Soft_I2C_Sda_Direction as sbit at TRISB6_bit
' End Software I2C connections

' Описания переменных, здесь присутствует новый тип - string, строка, состоящая из 8 символов
' Позиции символов нумеруются слева направо, начиная с нуля.
dim hours, minutes, seconds as byte
dim press as byte
dim menuitem as short
dim hrs, min, sec as char[3]
dim text as char[2]
dim systime as string[8]

' Считать показания DS1307
sub procedure GetTime()
Soft_I2C_start ' Запустить программный протокол обмена по I2C
Soft_I2C_write($D0) ' Подаем команду $D0 - запись в DS1307
Soft_I2C_write(0) ' записываем 0 - адрес с которого располагаются данные о времени.
Soft_I2C_Start ' Перезапускаем протокол
Soft_I2C_write($D1) ' Команда $D1 - читать из DS1307
seconds = Bcd2Dec(Soft_I2C_read(1)) ' т.к. адрес установлен на 0, считываем секунды и переходим (1) к
minutes = Bcd2Dec(Soft_I2C_read(1)) ' считыванию минут, далее (1)
hours = Bcd2Dec(Soft_I2C_read(0)) ' и часы и все, дальше не читаем (0)
Soft_I2C_stop ' ну и останавливаем передачу данных по I2C
end sub
' Здесь при считывании данных мы сразу же перевели их в десятичный формат - BCD2Dec (BCD to decimal)

sub procedure ResetSec() 'Установка (сброс) секунд
if Button(PORTA, 4, 1, 0) then
Soft_I2C_start
Soft_I2C_write($D0) ' Записать
Soft_I2C_write($00) ' В ячейку с адресом 0
Soft_I2C_write($00) ' ноль
Soft_I2C_stop
end if
Delay_ms(200) ' Здесь задержка в принципе и не нужна, ну да ладно, не помешает
end sub

sub procedure SetMinutes() ' Установка минут
if Button(PORTA, 4, 1, 0) then
Inc(minutes) ' При нажатии на кнопку увеличивать значения минут на единицу
if minutes = 60 then minutes = 0 end if 'Больше 59-и минут не бывает
minutes=Dec2Bcd(minutes) ' Переводим обратно формат в BCD, чтоб было понятно DS1307
Soft_I2C_start
Soft_I2C_write($D0) ' Записать
Soft_I2C_write($01) ' В ячейку с адресом 1
Soft_I2C_write(minutes) ' то число, которое мы получили чуть выше
Soft_I2C_stop
end if
Delay_ms(200) ' Небольшая пауза, чтоб не слишком быстро менялись цифры
end sub

sub procedure SetHours() ' То же самое до часов
if Button(PORTA, 4, 1, 0) then
Inc(hours)
if hours = 24 then hours = 0 end if ' Часы - до 24-х
hours=Dec2Bcd(hours)
Soft_I2C_start
Soft_I2C_write($D0)
Soft_I2C_write($02) 'Адрес ячейки часов - 2
Soft_I2C_write(hours) '
Soft_I2C_stop
end if
Delay_ms(200)
end sub

sub procedure DisplayTime()
ByteToStr(seconds,sec) ' Переводим байты в символы
text[0]=sec[1] ' Подробное описание - см. ниже
text[1]=sec[2] '
text[2]=0
if text[0] = 32 then text[0] = "0" end if '
sec = text '
ByteToStr(minutes,min)
text[0]=min[1]
text[1]=min[2]
text[2]=0
if text[0] = 32 then text[0] = "0" end if
min = text
ByteToStr(hours,hrs)
text[0]=hrs[1]
text[1]=hrs[2]
text[2]=0
if text[0] = 32 then text[0] = "0" end if
hrs = text

systime = hrs + ":" + min + ":" + sec ' Имея все данные складываем их в строку, готовую к выводу на экран
' Это так называемая конкатенация строк, т.е. в результате получаем строковую переменную вот такого вида
' 12:06:34
end sub


sub procedure SelectMode()
' Вторую кнопку (ту, что меняла состояние МК при однократном нажатии)
' используем для перебора пунктов меню установки времени и индикации соотв. режима
if press = 0 then
if Button(PORTA, 3, 1, 0) then
menuitem = menuitem + 1
press = 1
end if
end if

if Button(PORTA, 3, 1, 1) then
press = 0
end if

select case menuitem ' В зависимости от значения переменной menuitem выбираем то или иное действие
case 0
Lcd_out(1, 1, "Reset ") 'Если нажать на кнопку 1 - произойдет сброс секунд
ResetSec()
case 1
Lcd_out(1, 1, "Minutes") ' Установка минут
SetMinutes()
case 2
Lcd_out(1, 1, "Hours ") ' Часов
SetHours()
case 3 ' Обнуляем menuitem, т.е. после 3-х нажатий на кнопку пункты меню будут крутиться по новой.
menuitem = 0
end select

end sub

'########################## Главная программа ########################
main:
TRISA = %11111111
ADCON1 = %10000110
press = 0
menuitem = 0

Soft_I2C_Init() ' Аналогично ЖКИ надо проинициализировать и I2C
Lcd_Init()
Delay_ms(200)
Lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_CURSOR_OFF)

Lcd_Out(2, 1, "Time:") 'Т.к. это слово постоянно должно высвечиваться на экране, выводим его

while true ' А этот цикл будет крутиться бесконечно
GetTime() ' Считать время
DisplayTime() ' Подготовить считанные данные к выводу на экран
SelectMode() ' Проверить, не нажата ли вторая кнопка
Lcd_Out(2, 9, systime) ' Вывести подготовленные данные (ЧЧ:ММ:СС) на экран ЖКИ
wend ' возвратиться к while, и так все время, пока не выключим питание
end.

---------------------------
Про преобразование строки:
Переводим байты в строку:
ByteToStr(seconds,sec)
Как происходит преобразование - мы уже видели,
000 - преобразуется в "0"
001 - "1"
...
010 - "10"
100 - "100" - но это нам не грозит, т.к. время - это мах. число 59

видно, что байт может состоять из 1-го, 2-х или трех символов (0...255), а показания часов - двухзначные, значит надо что-то предпринимать. Следующие операторы сдвигают символы в строке на одну позицию влево, и отсекают последний символ, т.е., например, если имеем 045, получаем 45
text[0]=sec[1]
text[1]=sec[2]
text[2]=0 ' Обратите внимание, это не символ "0", а просто пустота, иначе получилось бы не 45 а 450

если же имеем, например, 005, то после предыдующего преобразования получим просто 5, некрасиво будет смотреться на экране. Поэтому, если 0-й символ равен пробелу (ASCII код - 32), то вместо него записываем "0" (Т.к. ноль - в кавычках, то это не число а символ)
if text[0] = 32 then text[0] = "0" end if
sec = text
Переменная text - промежуточная, сама она непосредственно нигде не высвечивается, присваиваем её значение переменной sec, чтоб в дальнейшем использовать text для преобразования минут и часов.
------------------------------
Здесь, да и раньше тоже, мы не останавливались на подробном описании команд, т.к. все это описано в HELP, и для того, чтобы полностью уяснить как работает та или иная команда надо читать её описание.

Далее (если еще не надоел), добавим к нашему устройству вольтметр, а может еще и термометр wink.gif



Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Asdwarf
сообщение 23.10.2009, 21:14
Сообщение #15


Левша
*******

Группа:
Почетные ветераны
Сообщений: 1801
Регистрация: 19.2.2009
Из: Санкт-Петербург, Центр
Вне форума
Авто: VW CC 1.8MT

Репутация:   24  


В поисках программатора для PIC набрел вот на такую акцию: http://www.pickit2.ru/doku.php/form
Продают программатор за 565р. Есть разные магазины.
SSh говорит, что хорошая штука smile.gif


--------------------
MMC CS3A R20 -> VW PCC 2013 1.8MT Fortana
[№7200 в контакте][ICQ 124648493] 98 RUS
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 23.10.2009, 21:42
Сообщение #16


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Очень хорошая и полезная. Позволяет писать помимо всех пик-ов еще и 24, 25 и 93 память, причем фирма периодически обновляет прошивки добавляя новые возможности из которых отмечу:
1. Внутрисхемное программирование (ICP) - не надо выпаивать МК из схемы
2. Возможность подачи питания от USB через него на отлаживаемое устройство (напряжение регулируется от 2,5 до 5 В - включается галочкой в оболочке программатора).
3. Автоматически распознает тип МК - если надпись стерлась - нет проблем - подключил и смотри что за чип.
4. Имеет внутреннюю память, т.е. если нет возможности подлезть с компом к какому-либо устройству можно залить прошивку в память программатора, потом уже без участия компьютера из программатора в МК (там кнопочка специальная для этого есть).
5. Имеет окно для редактирования области памяти МК.

Ну и быстрый в отличии от COM-овских.
Я покупал такой 3 года назад за чуть больше 100$, после чего повыкидывал все имеющиеся у меня программаторы. Сейчас попеременно пользуюсь или им - если надо отлаживать устройство на плате или входящим в состав EasyPic5 тоже USB-шным программаторам.

Вот мой PicKit2 вместе с самодельными адаптерами для всех пик-ов в дип корпусах и для вышеуказанных типов EEPROM. Кстати, на Lancer-ах в одометре использована 93 память.



Прикрепленные изображения
Прикрепленное изображение
 
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 23.10.2009, 22:04
Сообщение #17


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Что-то я не нашел на сайтах упоминания об акции. На всякий случай советую связаться с дистрибютерами, а то мало ли что...
P.S. На прибалтийском сайте есть - PICkit 2 SPECIAL OFFER (more than a twice lower price)
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
Asdwarf
сообщение 23.10.2009, 22:49
Сообщение #18


Левша
*******

Группа:
Почетные ветераны
Сообщений: 1801
Регистрация: 19.2.2009
Из: Санкт-Петербург, Центр
Вне форума
Авто: VW CC 1.8MT

Репутация:   24  


Я вот тут нашел: http://easyelectronics.ru/forum/mcu-pic/pickit2
Сообщение номер 7


--------------------
MMC CS3A R20 -> VW PCC 2013 1.8MT Fortana
[№7200 в контакте][ICQ 124648493] 98 RUS
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 23.10.2009, 22:55
Сообщение #19


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Ну, хорошо. А то кидальщиков сейчас расплодилось... Сам знаешь.

А вот и я нашел, на Гамме

http://www.gamma.spb.ru/news.php?id=434
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post
SSh
сообщение 25.10.2009, 12:54
Сообщение #20


Технический Маньяк-Гуру
*******

Группа:
Администраторы
Сообщений: 7044
Регистрация: 3.6.2009
Из: Армения
Вне форума
Авто: Lancer IX, AT

Репутация:   263  


Как уже отмечалось, с PicKit-ом удобно использовать универсальный адаптер для прошивки отдельных МК и EEPROM.
Выкладываю разводку такого адаптера, вернее 2-х, один для пиков, другой для микросхем памяти.
Прикрепленный файл  PickitHeader.rar ( 13,27 килобайт ) Кол-во скачиваний: 1111


В пик-адаптер можно вставлять и прошивать все виды пик-контроллеров (не dsPIC - это новая разработка Mikrochip, со встроенным аппаратным обработчиком цифровых сигналов) в 8, 14, 18, 20, 28 и 40 - выводных корпусах. Для удобства применены так называемые ZIF панельки (панельки с нулевым усилием), на фото выше видно, что это такое. Обратите внимание, что на панельках прорези под выводы микросхем - продолговатые - для того, чтобы можно было вставлять как широкие так и узкие микросхемы.
Go to the top of the page
¬
Вставить ник в форму быстрого ответа
+Quote Post

10 страниц V   1 2 3 > » 
Fast ReplyReply to this topicStart new topic
7 чел. читают эту тему (гостей: 7, скрытых пользователей: 0)
Пользователей: 0

 



Быстрый заказ, позвонить +7-978-708-85-73
Дроссель Amadeus Productions. Быстрый заказ по телефону.
(Viber, WhatsApp, Telegram)
Amadeus Productions Дроссельный узел на Lancer IX 1.6 (4G18), 2.0 (4G63) и другие моторы
Ремкомплект РХХ на Mitsubishi Lancer IX, 1.6 (4G18), MD619857, 1450A116
Облегченный маховик на 1.6 (4G18) и другие моторы
Облегченные шкивы на 1.6 (4G18) и другие моторы
One-touch или "Ленивые поворотники"