Микроконтроллеры |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
Микроконтроллеры |
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В. Потребляемый ими ток насколько мал, что о нем и говорить неудобно (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 надо опять же смотреть в соотв. даташитах. ----------------- Я честно говоря, не знаю, надо ли продолжать или нет, т.к. в сети есть куча информации по различным МК, так, что если есть желание, то изучить их работу в желаемом для себя объеме нетрудно. Если есть интерес к обсуждению этого вопроса именно здесь а не на спец. форумах, то в след. раз поговорим о самих программах и программаторах. |
|
|
25.9.2009, 10:14
Сообщение
#2
|
|
Технический Маньяк-Гуру Группа: Администраторы Сообщений: 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 (IMG:style_emoticons/default/smile.gif) . Надо только обращать внимание на то, чтоб переменным не присваивались имена, совпадающие с зарезервированными в данном компилляторе словами, например, переменную нельзя назвать lcd_out, т.к. это команда МВР. Здесь у нас используются след. переменные press и num - байтовые number - строка из 3-х символов. num - это как раз то число, которое меняется при нажатии на кнопки, а number - то же число, но уже в символьном виде, для того, чтобы ЖКИ смог его воспроизвести. Т.е. с первым из них можно производить математические операции (конкретно у нас - прибавляем единицу), но нельзя воспроизвести, а со вторым мат. операций не совершишь, но воспроизвести можно. press - вообще нигде не видна, но она нужна нам для организации признака однократного нажатия на кнопку. В этой же программе посмотрим и то, как организуются подпрограммы (процедуры). В принципе то, что написано в процедуре можно написать и в теле программы (т.е. после main:), но с применением процедур Во-первых сама программа становиться более так сказать читабельной и понятной Во-вторых, если в течении выполнения программы надо чтобы какое-либо действие выполнялось несколько раз, то придется соотв. число раз писать в программе одно и то же, а так просто вызываем нужную процедуру - и все. Ну и много других положительных моментов... Т.к. процедуры расположены до точки входа main:, то они при включении не выполняются до тех пор, пока их не вызовут из тела главной части (между main: и end.) Рассмотрим это тело подробно (IMG:style_emoticons/default/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. ------------------- Дальше - попробуем собрать уже необходимое в хозяйстве устройство - часы... |
|
|
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
Текстовая версия | © 2006-2024 Форум Технических Маньяков. |
|