![]() |
![]() |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
![]() |
![]()
Сообщение
#1
|
|
Технический Маньяк-Гуру ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Технический Маньяк Сообщений: 7049 Регистрация: 3.6.2009 Из: Армения На форуме Авто: Lancer IX, AT Репутация: ![]() ![]() ![]() |
Ну что, начнем. Заранее заявляю, что я сам тоже новичок в этом деле, так, что если что не так с удовольствием приму и критику и замечания и дополнения.
Что такое микроконтроллер (МК)? Это микросхема которая сама по себе АБСОЛЮТНО ничего не умеет делать в отличии от даже самой примитивной логики. Для того, чтобы заставить МК выполнять какую-нибуть работу надо прошить (загрузить) в него программу. МК выпускаются многими фирмами - Mikrochip, Atmel, Motorolla, etc. Здесь будут рассматриваться только МК фирмы Mikrochip, так называемые pic-контроллеры. Их легко различить по маркировке от других, название начинается с префикса PIC или (в современных сигнальных процессорах) dsPIC, например, PIC18F2520, PIC16F877 и т.д. Наиболее употребимые в любительской практике - 8-разрядные контроллеры среднего и высшего семейств, PIC16 и PIC18. Буква "F" в маркировке МК означает, что он может многократно перезаписываться, т.е. если по каким-либо причинам надо поменять программу (прошивку), то это легко можно осуществить при помощи программатора (об этом попозже). Есть МК и с буквой "С" - это однократно программируемые. Питание МК - +5В, хотя многие из них могут работать и при пониженном напряжении, от +2,5В. Потребляемый ими ток насколько мал, что о нем и говорить неудобно (IMG:style_emoticons/default/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 надо опять же смотреть в соотв. даташитах. ----------------- Я честно говоря, не знаю, надо ли продолжать или нет, т.к. в сети есть куча информации по различным МК, так, что если есть желание, то изучить их работу в желаемом для себя объеме нетрудно. Если есть интерес к обсуждению этого вопроса именно здесь а не на спец. форумах, то в след. раз поговорим о самих программах и программаторах. |
![]() |
|
![]() |
![]()
Сообщение
#2
|
|
Технический Маньяк-Гуру ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Технический Маньяк Сообщений: 7049 Регистрация: 3.6.2009 Из: Армения На форуме Авто: Lancer IX, AT Репутация: ![]() ![]() ![]() |
Ну что же, продолжим.
Посмотрим, из каких модулей может состоять МК. Упомянем только о тех модулях, которые стандартно присутствуют почти во всех современных контроллерах, спец. МК (например со встроенным 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, его надо сначала инициализировать на одной скорости обмена, потом начать взаимодействовать с ним (спрашиваем - отвечает) на другой. Вот разберусь с делами - займусь этим. Вот и все про модули, дальше распространяться думаю не надо. Главное понять суть, а дальше нетрудно и самому разобраться. Если в дальнейшем возникнет необходимость - рассмотрим, а так, заранее не стоит, тем более, что я сам некоторые из них и не использовал, или же уже подзабыл что к чему. Да, чуть не забыл про модуль тактового генератора. Но в тех компиляторах, которые использую я, все настройки этого модуля производятся в настройках проекта, так, что о генераторе поговорим во время рассмотрения языков программирования. |
![]() |
|
![]() ![]() ![]() |
![]() |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
Текстовая версия | © 2006-2025 Форум Технических Маньяков. |
|