Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум Технических Маньяков _ Вычислительная техника _ Микроконтроллеры

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

Автор: SSh 9.9.2009, 17:52

Ну что, начнем. Заранее заявляю, что я сам тоже новичок в этом деле, так, что если что не так с удовольствием приму и критику и замечания и дополнения.
Что такое микроконтроллер (МК)? Это микросхема которая сама по себе АБСОЛЮТНО ничего не умеет делать в отличии от даже самой примитивной логики. Для того, чтобы заставить МК выполнять какую-нибуть работу надо прошить (загрузить) в него программу. МК выпускаются многими фирмами - 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 надо опять же смотреть в соотв. даташитах.
-----------------
Я честно говоря, не знаю, надо ли продолжать или нет, т.к. в сети есть куча информации по различным МК, так, что если есть желание, то изучить их работу в желаемом для себя объеме нетрудно.
Если есть интерес к обсуждению этого вопроса именно здесь а не на спец. форумах, то в след. раз поговорим о самих программах и программаторах.










Автор: Titus 10.9.2009, 0:06

Спасибо, отлично, как базовый материал wink.gif
Если действительно интересно продолжать - скажите, плз, надеюсь, что SSh сочтет нужным продолжить тему, да и я может чем полезным окажусь wink.gif

Автор: TCL 10.9.2009, 2:40

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

Автор: Titus 10.9.2009, 3:18

Тогда сразу ссылка на один из моих любимых сайтов: http://easyelectronics.ru (кстати, тоже друг нашего сайта и форума).
Это ни в коем разе - не поправка и не дополнение к словам SSh, просто ссылка на интересные материалы, тоже написанные в очень доступной форме для чтения и понимания. Советую изучить рекурсивно все, что есть на сайте smile.gif

Автор: Onega 10.9.2009, 9:14

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

Автор: SSh 10.9.2009, 13:10

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

Посмотрим, из каких модулей может состоять МК. Упомянем только о тех модулях, которые стандартно присутствуют почти во всех современных контроллерах, спец. МК (например со встроенным 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, его надо сначала инициализировать на одной скорости обмена, потом начать взаимодействовать с ним (спрашиваем - отвечает) на другой. Вот разберусь с делами - займусь этим.

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

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

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

Автор: SSh 12.9.2009, 8:08

Поехали дальше.
Как уже отмечалось, для того, чтобы добиться от МК какой либо деятельности его надо прошить соответствующей программой. Сама скомпиллированная программа представляет собой набор символов в 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, тоже неплохой компиллятор для начинающих.

Автор: Onega 23.9.2009, 9:05

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

Автор: SSh 23.9.2009, 9:28

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

Автор: Engineer 23.9.2009, 13:36

Читается и понимается легко, в отличие от заумных книжек.

Автор: dmitrij_b 23.9.2009, 16:25

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

Автор: SSh 24.9.2009, 12:45

Продолжим.
В подавляющем большинстве случаев МК должен работать не в одиночку, а с некоторой периферией, например, светодиодные или ЖК индикаторы, кнопки, датчики, и т.д. Причем некоторые из периферийных устройств не требуют специальных протоколов обмена - светодиоды, кнопки, другие же, наоборот, работают только по своим специфическим протоколам. Протокол обмена - это как бы язык, на котором два устройства "разговаривают" друг с другом. К нашему облегчению многие стандартные и распространенные протоколы реализованы в МК на аппаратном уровне (об этом уже говорилось) остается понять как можно организовать обмен данными между МК и внешним устройством.
Одним из наиболее востребованным периферийным устройством является многострочный ЖК индикатор, обычно применяются индикаторы 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 надо отметить, что если в программе используется какая-либо библиотека, то в диспетчере библиотек надо поставить галочку напротив необходимых компонент, или вообще выбрать все. Кстати, если библиотека не выбрана, то в окне редактора соотв. команды подчеркиваются красной волнистой линией, что облегчает нам задачу выбора.
Таким же образом можно вывести на экран любую информацию, в том числе и считываемую с различных датчиков, внешних устройств.

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




Автор: SSh 25.9.2009, 10:14

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

В этом примере посмотрим, как взаимодействовать с кнопками и светодиодами.

Имеем 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.

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

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

Автор: SSh 27.9.2009, 12:09

Как и было сказано ранее - попытаемся сделать что-то полезное а не просто "там нажал, тут светит" 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




Автор: Asdwarf 23.10.2009, 21:14

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

Автор: SSh 23.10.2009, 21:42

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

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

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




 

Автор: SSh 23.10.2009, 22:04

Что-то я не нашел на сайтах упоминания об акции. На всякий случай советую связаться с дистрибютерами, а то мало ли что...
P.S. На прибалтийском сайте есть - PICkit 2 SPECIAL OFFER (more than a twice lower price)

Автор: Asdwarf 23.10.2009, 22:49

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

Автор: SSh 23.10.2009, 22:55

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

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

http://www.gamma.spb.ru/news.php?id=434

Автор: SSh 25.10.2009, 12:54

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


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

Автор: SSh 9.11.2009, 9:36

Ну как, кто-нибуть купил/получил PicKit? Что-то все молчат... dry.gif

Автор: Asdwarf 10.11.2009, 21:44

Мутно там как-то...
Позвонил, сказали вышлют счет. Глухо...

Автор: Vituha 30.1.2010, 18:15

Привет! Я собрал осцилограф на 4 канала на 16меге и хочу с исходником разобратся досканально чтобы расширить число каналов расширить до 6 и добавить один канал с возможнотью синхронизации от него

Автор: SSh 30.1.2010, 18:29

С mega-ми никогда дела не имел, так, что - извини не в курсе. Одно время заинтересовался осциллографами, даже собрал ADC21 - http://forum.roboclub.ru/IPBoard/index.php?showtopic=131 - , но понял, что в домашних условиях приличный прибор создать не смогу, тем более, что нашел вот это
http://www.seeedstudio.com/depot/dso-nano-the-pocket-size-digital-storage-oscilloscope-p-512.html?cPath=11&zenid=1edb09641bc2aa4da3230abfca7e5075
Уже выписал, со дня на день жду посылку.

А что за осциллограф у тебя, я вроде все, что есть в сети по этой теме изучил...

Автор: Engender 30.1.2010, 18:37

Похоже на бот.
Vituha - вам сутки на подтверждение, что вы не бот. Или в бан.

Автор: Vituha 30.1.2010, 18:43

Цитата(Engender @ 30.1.2010, 22:37) *
Похоже на бот.
Vituha - вам сутки на подтверждение, что вы не бот. Или в бан.

А как подтвердить и что такое бот?

Автор: Vituha 30.1.2010, 18:52

Цитата(SSh @ 30.1.2010, 22:29) *
С mega-ми никогда дела не имел, так, что - извини не в курсе. Одно время заинтересовался осциллографами, даже собрал ADC21 - http://forum.roboclub.ru/IPBoard/index.php?showtopic=131 - , но понял, что в домашних условиях приличный прибор создать не смогу, тем более, что нашел вот это
http://www.seeedstudio.com/depot/dso-nano-the-pocket-size-digital-storage-oscilloscope-p-512.html?cPath=11&zenid=1edb09641bc2aa4da3230abfca7e5075
Уже выписал, со дня на день жду посылку.

А что за осциллограф у тебя, я вроде все, что есть в сети по этой теме изучил...

Я нашол 4 канальник на какомто форуме с исходниками для ремонта машин, мне очень помогает

Автор: dmitrij_b 30.1.2010, 20:14

2 Vituha а выложи схемы осцила с прошивками и исходниками. Поковыряем...
Я немножко с AVR-ами знаком.

Автор: Vituha 30.1.2010, 22:38

Цитата(dmitrij_b @ 31.1.2010, 0:14) *
2 Vituha а выложи схемы осцила с прошивками и исходниками. Поковыряем...
Я немножко с AVR-ами знаком.

Я сейчас на форуме с телефона, завтра домой приеду и скомпа зайду и скину

Автор: Vituha 30.1.2010, 23:20

Цитата(SSh @ 30.1.2010, 21:29) *
С mega-ми никогда дела не имел, так, что - извини не в курсе. Одно время заинтересовался осциллографами, даже собрал ADC21 - http://forum.roboclub.ru/IPBoard/index.php?showtopic=131 - , но понял, что в домашних условиях приличный прибор создать не смогу, тем более, что нашел вот это
http://www.seeedstudio.com/depot/dso-nano-the-pocket-size-digital-storage-oscilloscope-p-512.html?cPath=11&zenid=1edb09641bc2aa4da3230abfca7e5075
Уже выписал, со дня на день жду посылку.

А что за осциллограф у тебя, я вроде все, что есть в сети по этой теме изучил...

Я adc21 делал он неплохо работает, скажи а будет продолжение статей по мк?

Автор: SSh 30.1.2010, 23:44

Цитата
Я adc21 делал он неплохо работает

Случайно не по моей разводке? biggrin.gif wink.gif
Продолжения как такового - скорее всего нет, но вот в разных темах так или иначе кое-какие конкретные вопросы иногда обсуждаются. Здесь же была цель просто ознакомиться с МК, и то лишь потому, что есть некоторые конструкции на них - чтоб было понятнее. А так, кому надо - есть специализированные сайты, там и информации побольше и спецы поопытнее.

Автор: Titus 31.1.2010, 1:07

Цитата(Engender @ 30.1.2010, 17:37) *
Похоже на бот.
Vituha - вам сутки на подтверждение, что вы не бот. Или в бан.


Не, видно, что не бот, все оки, Егорыч wink.gif

Автор: SSh 31.1.2010, 12:59

Кстати насчет синхронизации. Как правило осциллографы на контроллерах работают след. образом:
Предположим в качестве дисплея использован графический LCD с разрешением 128х64 точек (в подавляющем большинстве случаев так и есть). Встроенный АЦП МК оцифровывает входной сигнал или сигналы после чего происходит преобразование в горизонтальную координату точки на экране. Но все это дело сразу на экран не выводится а сохраняется в буфере, организованном во внутреннем RAM контроллера. Для одного луча таких отсчетов (объем буфера) 128, для двух 256 и т.д. После заполнения буфера МК переводится в режим вывода накопленных координат на дисплей, после чего процесс повторяется. Сам вывод организован в виде цикла, состоящего из 256 шагов, где Х координатой является номер шага, Y координата - значение ячейки буфера с номером X.
Т.е. в то время, когда производится само измерение нет вывода на экран и наоборот. Буфер же начинает заполнятся не в произвольное время а только тогда, когда сигнал проходит через 0. Этот момент элементарно отследить программно.
Так вот если отсчет ведется с нулевого уровня сигнала, то и буфер заполняется с координатой Y=0, и вывод соответственно с точки с координатами 0,0.
Иными словами, получается автоматическая синхронизация...
И еще, увеличение числа каналов приведет к сужению полосы частот.



Автор: Vituha 1.2.2010, 10:12

Цитата(SSh @ 31.1.2010, 16:59) *
Кстати насчет синхронизации. Как правило осциллографы на контроллерах работают след. образом:
Предположим в качестве дисплея использован графический LCD с разрешением 128х64 точек (в подавляющем большинстве случаев так и есть). Встроенный АЦП МК оцифровывает входной сигнал или сигналы после чего происходит преобразование в горизонтальную координату точки на экране. Но все это дело сразу на экран не выводится а сохраняется в буфере, организованном во внутреннем RAM контроллера. Для одного луча таких отсчетов (объем буфера) 128, для двух 256 и т.д. После заполнения буфера МК переводится в режим вывода накопленных координат на дисплей, после чего процесс повторяется. Сам вывод организован в виде цикла, состоящего из 256 шагов, где Х координатой является номер шага, Y координата - значение ячейки буфера с номером X.
Т.е. в то время, когда производится само измерение нет вывода на экран и наоборот. Буфер же начинает заполнятся не в произвольное время а только тогда, когда сигнал проходит через 0. Этот момент элементарно отследить программно.
Так вот если отсчет ведется с нулевого уровня сигнала, то и буфер заполняется с координатой Y=0, и вывод соответственно с точки с координатами 0,0.
Иными словами, получается автоматическая синхронизация...
И еще, увеличение числа каналов приведет к сужению полосы частот.

Спасибо доступно описано, а то что сужение частот то не беда 10кгц достаточно

Автор: SSh 1.2.2010, 10:29

Опечатка просочилась... не 256 а 128 шагов, т.е. кол-во шагов равно горизонтальному разрешению примененного экрана, вернее ширине области вывода осциллограммы. Я встречал устройства, где правая или левая части были использованы для вывода информации (длит. развертки, чувствительность и т.д.)

Автор: SSh 1.2.2010, 10:56

Кстати вот здесь есть описание 6-канального осциллографа
http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/AVRLogAna/AVRLogAna.html

Правда на японском, но можно перевесту Гуглем.
И исходники выложены, причем на более понятном Бейсике, так, что если надо что-то поменять - разобраться будет не трудно.

Автор: dmitrij_b 1.2.2010, 11:41

Это похоже не осцил, а логический анализатор. Если я правильно понял только картинки, без анализа текста...

Автор: SSh 1.2.2010, 12:48

Да, точно - анализатор.
На этом же сайте есть пара осциллографов одно- и двух-лучевые. Я все порывался собрать один из них, но теперь успокоился - жду заказанного DSO Nano...

Автор: Vituha 5.2.2010, 19:35

Я набросал проектик в c+ 2009 давайте вместе добьем его до логического завершения скажите кто знаком с c+?

Автор: NeWT 15.9.2010, 13:41

Такой глобальный вопрос по поводу программы. Вот по поводу нажатий кнопок и загораний светодиодов. В моём текущем понятии, программа должна выполниться один раз и всё. Здесь же я так понял, программа как бы зацикленна бесконечно? Т. е. этот глобальный бесконечный цикл никак не объявляется, а он просто есть? И ещё, ведь событие происходит не тогда, когда кнопка нажата, а тогда, когда по тактовому генератору программа дошла до проверки кнопки и вот тогда если она нажата то выполнить то-то? Так?

Автор: SSh 15.9.2010, 14:36

Программа обычно должна работать в цикле, в выложенном примере цикл образуется командами while-wend
while true
....
....
....
wend

А можно и метками
main:
....
....
....
goto main
В принципе да, любая программа если нет ветвлений выполняется построчно, т.е. грубо говоря если распознавание нажатия кнопки идет на 5-й строке, то сначала выполняются первые 4, потом только проверка нажатия. Но это происходит так быстро, что паузу не почувствуешь...

Автор: NeWT 15.9.2010, 15:37

Ага, всё, цикл нашёл, спасибо. smile.gif Про быстроту выполнения программы я тоже понял. Кстати установил себе МикроПаскаль взломанный, класс! Теперь привычный язык! smile.gif) Ещё вопросик. Как запустить микроконтроллером что-нибудь тяжёлое? Например моторчик 12В 500мА. Ведь если на транзистор NPN подать на базу с МК 5В то ведь он не полностью "откроется" если на коллекторе 12В?
Ещё вопрос по старту. Старт он всегда начинается сам когда на МК подаётся питание? Или нужно обязательно MCLR через 10кОм на + подавать? А если скажем программа без цикла, то тогда МК в конце встанет просто? И на старт его можно сбросом через MCLR? Какая тут вообще логика? smile.gif

Автор: SSh 15.9.2010, 15:47

Биполярные транзисторы вообще-то током управляются smile.gif, т.е. если на коллекторе 500 мА и макс. выходной ток порта МК 10 мА, то надо ставить транзистор с соотв. допустимым током коллектора (лучше больше wink.gif ) и коэффициэнтом усиления не менее 50.

Вот другое дело - полевики, есть же серия IRL - специально предназначенная для управления логическими уровнями до 5В.

Автор: SSh 15.9.2010, 15:51

MCLR в некоторых МК можно вообще переконфигурировать под обычный порт. А так, на него сажают через 5,6...10кОм напряжение питания.
Все остальное что ты написал - верно smile.gif

Насчет логики - кто его знает, мали ли что кому на ум взбредет. У меня все программы зациклены в бесконечный цикл.

Автор: NeWT 15.9.2010, 16:13

Схемку бы конкретную с конкретными моделями blush.gif blush.gif blush.gif happy.gif

Автор: SSh 15.9.2010, 16:44



Транзистор, для описанного случая подойдет КТ972 и т.д.

Автор: NeWT 15.9.2010, 16:57

А, ну так всё также как и с логическими элементами было. Просто меня смутило, что с лог элемента у нас +12В выходило, а тут будет только +5. Или это не страшно?

Автор: SSh 15.9.2010, 17:16

У логического элемента выходит напряжение питания, если запитать его от 5В - столько же и выйдет smile.gif
Но я же уже писал - биполярные транзисторы управляются током а не напряжением.
Напряжение может быть очень маленьким - лишь бы пробить p-n переход, обычно надо 0,6...0,7В, а у германиевых транзисторов и того меньше...

Посмотри что выдал мне собранный вчера приборчик:
http://forum.amadeus-project.com/index.php?showtopic=838&view=findpost&p=42663

Uf=775m, это означает, что при 0,775В транзистор уже начинает открываться.

Вот, другое дело - полевики, они как-раз управляются напряжением, и для открывания нужно 10...12В для популярной серии IRF. Но есть еще серия IRL которая и предназначена для работы с логич. уровнями.

Автор: NeWT 5.10.2010, 19:23

Блин, сколько информации smile.gif Подскажи что я делаю не так? mikroPascal Pro for PIC. По задумке должны мигать диоды с порта B, а если нажать на кнопку А0 (подать на неё 5В), то они должны замигать по другому в процессе держания кнопки. На деле же просто мигает первым вариантом и на кнопку не реагирует. +5В на пин точно по кнопке подаётся. МК PIC16F627. Демоплата.

Код
program LED_Blinking;

begin

  TRISB:= %00000000;       // set direction to be output
  TRISA:= %00001111;       // set direction to be input

  While TRUE do
    begin
      PORTB:= %00101010;       // Turn OFF diodes on PORTB
      Delay_ms(100);      // 1 second delay
      PORTB:= %00010101;       // Turn ON diodes on PORTB
      Delay_ms(100);      // 1 second delay

      while PORTA.RA0 do
       begin
       PORTB:= %00000000;       // Turn OFF diodes on PORTB
       Delay_ms(100);      // 1 second delay
       PORTB:= %00111111;       // Turn ON diodes on PORTB
       Delay_ms(100);      // 1 second delay
       end;

    end;                   // Endless loop
end.

Автор: SSh 5.10.2010, 19:42

С микропаскалем не знаком, хотя эти все компиляторы и похожи, но некоторые команды записываются по другому. Напр.заметил - while не ограничивается wend-oм. И еще PORTA.RA0 ? В паскале такая запись принята? В других компилляторах обозначается так PORTA.0
Далее - посмотри даташит на пик, не сидят ли на порту АЦП или компараторы? Если да - отключи. Притянут ли порт на землю?
А осцилляторы выставлены правильно?

Автор: SSh 5.10.2010, 19:57

Скачал Manual на Паскаль посмотрел. Цикл организован правильно, а вот обращение к порту надо PORTA.0

Автор: NeWT 5.10.2010, 20:20

Спасибо за подсказку, победил smile.gif Надо было действительно выключить компаратор:

Код
CMCON:= %00000111;

Автор: SSh 5.10.2010, 20:27

smile.gif Вот, начало положено. И совсем не сложно, так?

Автор: NeWT 5.10.2010, 20:32

Угу! smile.gif Просто в Паскале-то я нормально соображаю - хорошо на Делфях пишу, да тут от Паскаля только язык, а по сути всё равно нужно знать что для чего... Но начало положено smile.gif

Автор: SSh 5.10.2010, 20:38

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

Автор: NeWT 13.11.2010, 16:19

А как заставить выдавать нашу плату звук? Допустим есть излучатели звука - http://lib.chipdip.ru/054/DOC000054699.pdf Я так понял, что одни представляют из себя чисто динамик (отдельно нужно подавать на него колеблюющееся напряжение), а другие динамик вместе с генератором волны (и усилителем?)? Мне нужно, чтобы просто пищало (для начала). Что лучше выбрать - с генератором или просто излучатель - без? И какие варианты подключения? Наверное пока для меня самый интересный вариант, чтобы использовать "play_sound(freq, time)" процедуру в МикроПаскале, т. е. беру излучатель без генератора, смотрю, сколько А макс он ест (80мА вижу) и также через транзисторный ключ подключаю? А на вывод МК посылаю "play_sound" - меандр с заданной частотой? Или всё сложнее?

Автор: NeWT 13.11.2010, 16:26

От блин, а как подавать с ножки МК скажем "-5В"? smile.gif Это т. е. надо вторую ножку задействовать и подавать поочерёдно +5В? А одной ножкой можно обойтись? smile.gif Можно как-нить типа "DC Offset" сделать? smile.gif Или можно забить и колебать динамик только в одну сторону?
Чем отличаются пьезо от электромагнитных? smile.gif

Автор: SSh 13.11.2010, 17:09

Все верно, надо или взять со встроенным генератором и включать-выключать его подавая на него логич. уровень с вывода МК или чисто излучатель и подать на него однополярную (без -5В, только +) импульсную последовательность или тот же самый play_sound. 440 (880 и т.д.) Гц даст тебе ноту "Ля" smile.gif

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


Автор: NeWT 13.11.2010, 19:57

Т. е. и пьезо и магнитные бывают и с генератором и без? А электромагнитный излучатель без генератора - по сути просто маленький динамик, как во всех колонках-наушниках?

Автор: SSh 13.11.2010, 20:29

Все верно smile.gif

Автор: NeWT 13.11.2010, 20:39

Блин, спасибо, что ты есть!!! smile.gif Слушай, а можешь нарисовать самую, на мой взгляд, крутую модель - электромагнитный излучатель без генератора управляемый одной ножкой МК? И почему сюда нужно подавать однополярный сигнал? Я думал, что надо и минус тоже?..

Автор: SSh 13.11.2010, 21:10

Посмотри здесь, не только схема, но и примеры кода smile.gif
http://www.mikroe.com/eng/products/view/440/easybuzz-board/

В любом случае микродинамик можно подключать и без транзистора, но через разделительный конденсатор, а пьезо - сразу сажаем на порт.

A eще есть серия микросхем UM66TxxL - генераторы мелодий, если запитать от порта МК, то при подаче высокого уровня подключенный к выходу микродинамик (типа таких как используются например в модемах) начнет играть мелодию. Список мелодий можно посмотреть в даташите на микросхему.

Автор: NeWT 15.11.2010, 12:49

Нашёл на просторах инета такую схему, пишут, что очень хитрая и классная. Что скажешь? Я вот не втыкаю ваще почему так smile.gif

Автор: SSh 15.11.2010, 17:01

А черт его знает, что это за схема... Динамик включен в качестве смещения транзистора. Надо проанализировать чем она может быть так крута... Лучше по-моему использовать классику - как на ссылке.

Автор: NeWT 15.11.2010, 17:37

Из твоих слов понял только слово "смещение" smile.gif Может как раз это и сместит сигнал 0..5В до -2.5В..2.5В? Ну и усилит до (сколько там надо) -5В..5В? smile.gif

Автор: SSh 15.11.2010, 18:13

Нет, об отрицательном напряжении речь не идет. Смещение надо для перевода транзистора в активный режим, иначе он будет работать только в так называемом ключевом режиме - открыт-закрыт.
Если интересно - в двух словах поясню, Если база транзистора соединена непосредственно с портом МК (естественно через ограничительный резистор) то при отсутствии сигнала ток в цепи базы равен 0 и соотв. коллекторный ток тоже отсутствует. При поступлении сигнала - транзистор открывается и будет выдавать макс. коллекторный ток. Таким образом мы как-бы усиливаем дискретный сигнал, усиливать аналоговый таким образом нельзя т.к. из-за нелинейности ВАХ (вольт-амперной характеристики) транзистора на выходе получится неизвестно что. Вот для усиления аналоговых сигналов и надо сместить рабочую точку транзистора, т.е. организовать небольшой ток базы в отсутствии входного сигнала.

Автор: NeWT 18.11.2010, 10:51

Ну ладно, не будем экспериментировать smile.gif Тогда помоги плиз разобрать эту официальную схему:

C1 = 100nF - это понятно.
E1 = 10uF - это конденсатор? Почему Е?
Buzzer - это я так понял к любому пину МК? Что должен выдавать этот пин - постоянное напряжение или колеблющееся по play_sound?
PZ1 - пьезоизлучатель? Они полярные или нет? С генератором или без? VCC это питание как на МК - 5В или любое, на которое рассчитан пьезик?

Автор: SSh 18.11.2010, 11:28

10uF = 10мкФ. Допускается замена "мю" на "u".
А вот все остальное - это импровизация, "Е" - по-видимому от слова electrolytic, да и условное обозначение отличается от нашего (кстати и неполярный тоже)
Бузер подключается к любому пину, главное проинициализировать этот пин - Sound_Init(PORT, PIN). Работает от колеблющегося сигнала.
Пьезоизлучатель - любой (без генератора), подключать можно и к 5В и, если есть, к 12В.


Автор: NeWT 18.11.2010, 11:59

В схеме есть и 5В и 12В, т. е. я подключаю к тому напряжению, на которое рассчитан пьезик?

Автор: SSh 18.11.2010, 12:28

Да.

Автор: NeWT 12.12.2010, 19:17

А ты когда-нибудь работал по прерываниям? Допустим в основное время МК ничего не делает, а программа (кусок кода) срабатывает только когда например на входе появляется 1 вместо 0? Вроде так можно, читал в мануале, но хотелось бы примерчик работающий smile.gif Pic 12F675.

Автор: SSh 12.12.2010, 19:34

С аппаратными прерываниями (по входу INT, GP2 в 12F675) - просто пока такой необходимости не возникало, с прерываниями по таймеру - в примерах приведены образцы работающего кода:
Timer0 Interrupt
Timer1 Interrupt
Timer2 Interrupt

Для расчета прерываний по таймеру есть отличная программа, которая и код к тому же генерирует
 TMRCalc.zip ( 160,38 килобайт ) : 461



Автор: SSh 15.12.2010, 16:44

Сегодня перечитал даташит на указанную микруху.
Соотв. установкой регистра INTCON можно не только активировать GP2/INT но также вызывать прерывания и по изменению уровня сигнала на остальных входах GPIO.
И еще - по сигналу от компаратора или внутреннего АЦП а также по окончании записи во внутр. EEPROM.
Ну и естественно остаются прерывания по переполнению таймеров. Всего аж 7 (!) источников прерываний...

Автор: NeWT 15.12.2010, 17:01

Ну да, а вот как их использовать? Например установил я INTCON на прерывание по GP0. А самой программы типа while true do ... у меня и нет (она ведь теперь не нужна?). Я же должен описать что-то типа "on gp0 change do ..." вот как правильно? smile.gif

Автор: SSh 15.12.2010, 17:12

Конечно, не нужна. В MikroPascal-e (на нем пишешь если не ошибаюсь) да и в Си и бейсике есть специальная процедура interrupt куда передается управление при возникновении прерывания. А вот в теле этой процедуры и можешь писать те действия, которые надо выполнять при возникновании прерывания.
Вот пример из help - при каждом переполнении таймера TMR0 значение переменной counter увеличивается на единицу

procedure interrupt;
begin
counter := counter + 1;
TMR0 := 96;
INTCON := $20;
end;


Автор: SSh 17.12.2010, 9:02

Возвращаясь к адаптеру для PicKit2, упомянутом в сообщениях #16 (фото) и #20 (разводка)...
Если в разводке для PIC все ясно, то адаптер для прошивки EEPROM имеет некоторые особенности, а именно 2 джампера и резистор, предназначение которых не объяснено. Исправляю упущение smile.gif
Разводка составлена согласно документации на PicKit2, в которой приведена таблица подключения программируемых микросхем памяти 24хх, 25хх и 93хх.

Согласно этой таблице вывод 5 микросхемы 24хх должен подтягиваться к плюсу (pullup) а для остальных нет. Подтягивающий резистор - на 3...5,6кОм. Т.е. если программируем 24хх - джампер ставим, 25хх и 93хх - снимаем.


Нижний джампер - для выбора типа организации памяти в микросхеме 93хх, для 8-битной надо соединить верхние два контакта (вывод 6 микросхемы на общий провод), для 16-битной - нижние (6 - на питание). Следует иметь в виду что некоторые микросхемы из этой серии имеют только один тип организации памяти (или 16 или 8 бит), а некоторые могут быть запрограммированы и так и так.

Автор: jn79 17.12.2010, 10:43

Цитата(SSh @ 25.10.2009, 15:54) *
Как уже отмечалось, с PicKit-ом удобно использовать универсальный адаптер для прошивки отдельных МК и EEPROM.
Выкладываю разводку такого адаптера, вернее 2-х, один для пиков, другой для микросхем памяти.
 PickitHeader.rar ( 13,27 килобайт ) : 1126


Отличный адаптер - стал недавно обладателем pickit2 и занялся поиском универсального адаптера использующего ZIF панели с поддержкой максимального числа МК. Есть много других вариантов (на одной панельке например) но они по некоторым причинам не устраивали (часть выводов под нежелательным питанием, использование миропереключателей итд и тп )
Я так понимаю зеркалить надо
Какие контроллеры прошивали ?

Автор: SSh 17.12.2010, 12:09

На двух по-моему удобнее. Просто хоть один из ZIF-ов надо поставить как у меня - с широкими контактами.
Прошивал все, и пики в разных корпусах (40, 28, etc.) и все три вида памяти - на втором адаптере. Плюс, прошивал все обозначенное и внутрисхемно и для отладки использовал питание через PicKit2.
Адаптер не совместим с dsPIC-ами (сам PicKit- прошивает, но адаптер должен быть другим)
Встречалась мне схема на одном ЗИФ-е, что мне не понравилось - разные пики надо ставить вразнобой, во кстати и этот адаптер. Рабочий или нет - не знаю, не проверял и даже не вникал wink.gif
 Adapter.rar ( 46,52 килобайт ) : 537


Платы - да, надо зеркалировать.

Еще для программатора посоветую изготовить удлинитель, просто соединенные жгутом 6-контактные колодки папа и мама, не всегда удается подлезть к разъёму ICP...

Автор: NeWT 14.1.2011, 13:59

А можно ли при программировании, чтобы не запутаться в куче пинов, заранее обозначить как-нить так:

Код
Led1 := PORTA.0;
Led2 := PORTA.3;
Btn1 := PORTA.1;


А потом просто писать типа:

Код
if Btn1 then do
Begin
Led1:= 1;
Led2:= 0;
end;

Автор: SSh 14.1.2011, 14:53

В MikroBasic такая возможность есть, надо в начале программы записать что-то типа этого:

symbol Inputport = PORTB.0

Записывается именно в начале программы, до объявлений переменных и т.д.
В help-е на Паскаль я что-то не нашел такого, может в про версии присутствует (у меня её нет чтоб посмотреть)

Автор: NeWT 18.1.2011, 20:27

Спасиб smile.gif
А ты когда-нить паял ПИК в корпусе SSOP-20? Это вообще реально дома? smile.gif Я платы делаю лазерным принтером на фотобумагу, потом хлорное железо, дорожки в 0.3мм получаются чётко, а вот как запаять? Я дорожки потом лужу в кастрюле сплавом Розе. Достаточно ли будет только слоя лужения Розе? Т. е. я просто поставлю МК на площадку и прогрею все ноги паяльником?

Автор: Titus 18.1.2011, 20:38

Есть еще такие штуки как паяльные фены, вот им паять подобно одно удовольствие wink.gif
Для более крутых вещей (это уже ближе к матерям компов и тп) - инфракрасные паяльные станции.

Автор: NeWT 18.1.2011, 20:58

Ну такое покупать не хочу, дорого пока для меня smile.gif Паяльник нормальный тонкий, чистым жалом если поводить, припаяется к слою сплава Розе? smile.gif

Автор: Titus 18.1.2011, 21:13

Должно smile.gif
Кстати, паяльный фен - не такое уж и дорогое удовольствие, относительно, ессно, сравним по цене с неплохим паяльником с терморегулятором.

Автор: NeWT 19.1.2011, 12:04

Народ, ещё пару вопросиков smile.gif

1) Собираюсь переходить на SMD компоненты в дальнейшем. Для начала хочу закупить наборы резисторов. Как думаете, для наших с вами МК целей хватит "0805" (0.125Вт) или лучше остаться на 0.250Вт - "1206"? Вот считаю 0.125Вт как-то впритык хватает smile.gif Это же 25mА@5V или 10mA@12V... Хотя впринципе там где надо 0.25Вт можно буд выводные ставить в редких местах...

2) Собираюсь перейти на внешние кварцы для МК, но тут есть 3 ветки я так понял: Кварцевые генераторы, Кварцевые резонаторы и Керамические резонаторы. Что используется чаще и проще всего обычно? Вроде обычная схема это Osc1 и Osc2 от МК в этот "кварц" и от этих 2х ног ещё по малеькому конденсатору на землю? Этот "кварц" неполярен? Так что их трёх лучше?

Автор: SSh 19.1.2011, 12:30

1. Если речь идет только о МК, то и 0,125Вт за глаза хватит, большей мощности они и не выдают.
2. В тех схемах где не требуется жесткая стабилизация временных параметров можно вообще не ставить кварцев, частота внутр. генератора достаточна стабильна. Если-же все-таки нужен кварц - без разницы, ставь что удобно или что возможно достать. У меня, напр. нет 3-х ножечных, со встроенными конденсаторами, поэтому в основном применяю отдельный кварц + 2 конденсатора.

Автор: NeWT 19.1.2011, 12:47

Вот тут где ты говоришь "Кварц" это "Кварцевый генератор", Кварцевый резонатор" или "Керамический резонатор"? smile.gif Или "Керамический" тут вообще не при делах? Я хочу делать как в демосхеме - с двумя кондёрами и 2х-ножечным "кварцем".
Зачем они мне вдруг понадобились? Хочу сделать общение по RS-485 и где-то прочитал, что лучше использовать внешний более стабильный источник синхросигнала.
Вроде я хочу именно резонатор - http://www.chipdip.ru/catalog/quartz-resonators.aspx они дешевле smile.gif У него 2 ноги равноценны?

Автор: SSh 19.1.2011, 16:16

Кварц и кварцевый резонатор это одно и то же
Керамический резонатор - по сути тот же самый прибор, отличается некоторыми характеристиками, напр. большей нестабильностью частоты. Но зато размеры у последних меньше.
При включении в цепь ножки у них равноценны. Для синхронизации МК кварц соединяется между ножками OSC1 и OSC2 а конденсаторы между каждой из ножек и корпусом.
Если прибор 3-х выводный, то скорее всего он со встроенными конденсаторами, среднюю ножку сажаем на корпус, 2 остальных опять - как попало.

Кварцевый генератор - ясно из названия, генератор, частота которого стабилизирована кварцем могут быть как самодельными так и выпускаемые промышленностью. При использовании для синхронизации с МК выходной сигнал с генератора обычно подают на вывод OSC1.

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

Автор: NeWT 19.1.2011, 16:18

Терь всё понял! Спасибо! smile.gif

Автор: AlexGreat 19.1.2011, 17:21

Цитата(NeWT @ 18.1.2011, 20:27) *
Спасиб smile.gif
А ты когда-нить паял ПИК в корпусе SSOP-20? Это вообще реально дома? smile.gif Я платы делаю лазерным принтером на фотобумагу, потом хлорное железо, дорожки в 0.3мм получаются чётко, а вот как запаять? Я дорожки потом лужу в кастрюле сплавом Розе. Достаточно ли будет только слоя лужения Розе? Т. е. я просто поставлю МК на площадку и прогрею все ноги паяльником?


SSOP-20 совершенно беспроблемно паяется руками. А если будет жало "микроволна" то паяется еще проще. smile.gif Если душа иногда требует эстетики, то можно через трафарет паяльной пасты мазнуть, сверху чип, на подогревной столик и сверху горячим воздухом. Подогрев снизу, чтобы не было температурного шока и плату не коробило. Хотя в последнее время на пасту только QFN сажаю. А нормальные выводы и так беспроблемно паяются. Только флюс не жалеть в месте пайки.
Кстати что касается керамических резонаторов, то размеры у них как раз больше чем у кварцевых резонаторов, а вот точность и стабильность частоты гораздо хуже. Соответственно и стоимость меньше. Керамические фильтры да, размерами обычно меньше, но и по параметрам до кварцевых естественно не дотягивают. Примерно так. smile.gif

Автор: NeWT 19.1.2011, 17:42

Во блин, ну лан, попробуем smile.gif А то до этого я только PDIP'ы паял smile.gif Ну видать в SMD монтаже проще паять мелочь...

Автор: AlexGreat 19.1.2011, 17:44

Я 0402 руками паяю, и вроде ничего, пока не умер от этого... biggrin.gif

Автор: SSh 19.1.2011, 17:46

Про пайку мелких микросхем можно посмотреть здесь:
http://easyelectronics.ru/pajka-planarnyx-mikrosxem-samodelnoj-mikrovolnoj.html

Хотя я сам паяю обычным паяльником

Автор: NeWT 20.1.2011, 12:30

Блин, что-то я переоценил силы... 0.3мм дорожки от SSOP не переносятся у меня утюгом sad.gif Может текстолит был зафаканный...

Автор: NeWT 20.1.2011, 13:08

Ребят, никак не пойму. Допустим я выбрал кварцевый резонатор: http://www.chipdip.ru/product0/403019660.aspx.
Далее смотрим даташит с картинкой по подключению:

Смотрим таблицы: 14-1 для керамических резонаторов - не подходит. 14-2 для "Crystal Oscillator" - кварцевых генераторов? Тоже не подходит. А для Crystal Resonator нету. Далее там уже про другое в даташите. И в каких случаях надо резистор RS (и сколько?)? Или всё же моя таблица - 14-2 и я беру 15-30pF Mode HS?

Автор: dmitrij_b 20.1.2011, 13:48

Crystal Oscillator, в данном случае и есть кварц. wink.gif

Генератор, это отдельная схема, возможно застабилизированная кварцем. И подключается он по другому, всего на один вывод, скорее всего на OSC1.

Автор: NeWT 20.1.2011, 14:04

Ок, понял, а резюк RS нужен? smile.gif

Автор: SSh 20.1.2011, 16:07

Oscillator=Resonator
Резистор не нужен.
В таблице все четко прописано, для кварцевых резонаторов - для какой частоты какие фьюзы ставить.
Конденсаторы - ставь тоже как в таблице, я затоварился на 22пФ, везде ставлю их.
Дорожки делай 0,4мм

Автор: AlexGreat 20.1.2011, 23:41

Цитата(NeWT @ 20.1.2011, 12:30) *
Блин, что-то я переоценил силы... 0.3мм дорожки от SSOP не переносятся у меня утюгом sad.gif Может текстолит был зафаканный...


А с ЛУТом всегда так. чем плата меньше, тем дорожки тоньше и нормально получаются. Ну и FR-4 нужно внимательней смотреть, иногда попадается с фольгой на 18мкм, причем не лучшего качества, сделан так, что рельеф стеклоткани проступает. На таком ЛУТом 0,2/0,2 это сродни, как это... душевным терзаниям.. biggrin.gif Из того, что в Мск пробовал, лучшим оказался стеклотекстолит от Matsushita. Там все правильно сделано, и травится равномерно. Хотя для больших плат, на самом дел, пленочный фоторезист в помощь, но только правильный, например AGFA.

Автор: SSh 3.2.2011, 13:57

Где-то писал, но не помню... Про пайку мелких микросхем. На всякий случай продублирую....
Недавно попробовал новый способ - получилось. Суть в том, что во время пайки не мучаясь просто запаиваешь весь ряд, выводы и с дорожками на плате и с друг-другом. После чего расплавляя припой (насколько захватит жало) отсосом высасываем излишки. Никакой особой сноровки не требуется...

Автор: BoomeR 11.2.2011, 17:13

Здравствуйте! Прочитав вашу статью про МК, появилось оч большое желание по работать с ними. Уже успел научиться подключать термометр, дисплей, кнопки, динамик, но на данный момент хочу сделать тахометр, не подскажете какая команда в микро бейсике считает импульсы пришедшие на определенный порт? И как её использовать. И где можно достать список команд для микро бейсика на русском, инфы и примеров о нем в нете оч не хватает, а английский я не знаю, что бы в стандартном хелпе разбираться. Заранее спасибо.

Автор: Titus 11.2.2011, 18:08

BoomeR, велкам на форум, заполняй профиль плз wink.gif drinks.gif

Автор: SSh 11.2.2011, 18:53

В компилляторах микро... нет команд подсчитывающих импульсы или измеряющих их или частоту. Можно организовать измерение периода измерив отдельно высокий и низкий уровень входного сигнала, ну и из периода уже подсчитываем частоту. Но... получается так называемый breaking call, т.е. если импульсы на счетном входе отсутствуют программа останавливается и ждет пока не проскочит импульс. Для этого дела очень хорошо подходит PicBasic, там есть отдельная команда - PULSEIN.
Русских мануалов я не встречал, но в этих компилляторах и справка очень хорошо организована и при инсталляции устанавливается куча примеров - чуть ли не на все случаи жизни. Да и форум у них хороший. Плюс - на сайте есть множество примеров, присланных пользователями. Плюс - эта-же компания выпускает различные периферийные устройства (часы, термометры, акселерометры, короче все что угодно) и к каждому устройству приложены примеры, которые можно скачать с того-же сайта.
Если что - поможем smile.gif


Автор: BoomeR 11.2.2011, 18:59

Я по задумке хотел бы сделать типо бортового компьютера для машины, что бы там был вольтметр, термометр, часы, тахометр. То есть у меня не получится написать такой код на микро бейсике, так как если остановится двигатель и импульсы перестанут идти на МК, пик грубо говоря зависнет?

Автор: SSh 11.2.2011, 20:14

Нет, пик не зависнет по большому счету, просто выполнение программы притормозится до тех пор пока не пойдут импульсы. На практике - пока двигатель не заведется борткомпьютер или ничего не будет показывать или какие-то "старые" значения. Например, завели двигатель, БК начал показывать все параметры в реальном времени, заглушили - все показания остались такими, какими были в момент выключения зажигания. Или, в зависимости от структуры программы, скажем сначала идут процедуры измерения напряжения, часов и т.д. и в конце - тахометр. Выведутся все параметры а на тахометре программа затормозится до тех пор, пока на заведется движок.
Если же процедура тахометра первая в программе - то тогда вообще ничего не будет высвечиваться до пуска движка.

Автор: BoomeR 11.2.2011, 21:21

Ну да, это я и имел в виду... а можно по подробнее как в микро бейсике счет импульсов сделать, как вы сказали breaking call. Я подумал насчет того что бы не висла, просто пущю провод от замка зажигания к ПИКу, или еще лучше от контрольной лампы давления масла, когда движок заведется и появится давление масла, на этом проводе пропадет минус, и ПИК будет выполнять счет импульсов, а пока его нет, он эту часть программы будет обходить стороной smile.gif в этом случае даже при заглушенном моторе и включенном зажигании он будет отображать все что мне необходимо и без всяких остановок! smile.gif
И еще вопросик, поддерживает ли микробейсик отображение на знакосинтезирующем дисплее русские буквы, как не пытался, одни закорюки вместо букв sad.gif с английским все ок! дисплей точно поддерживает.

Автор: SSh 11.2.2011, 22:13

PulseIn Demo

Код
'(*
' * Project name:
'
' * Copyright:
'     (c) mikroElektronika, 2006
' * Revision History:
'     20050914 (MJ):
'       - initial release.
' * Description:
'     This code demonstrates using Pulse-In Function for counting pulses in given
'     time period. This a blocking call. This demo waits for input signal
'     (high level) to start counting pulses. It counts pulses for 1000 miliseconds.
'     Then it prints results on LCD which is connected on PORTB.
' * Test configuration:
'     MCU:             P16F877A
'     Dev.Board:       EasyPIC3
'     Oscillator:      HS, 8.000 MHz
'     Ext. Modules:    None
'     SW:              mikroBasic v5.0 or higher
' * NOTES:
'     Prototype:
'       function Pulse_In(dim byref port as byte, dim pin, state as byte, dim duration as word)as word
'
'     PORT  - assigns port for pulse-in function
'     PIN   - assigns pin for pulse-in function
'     STATE - defines logical state for counting pulses (LOW = 0 or HIGH = 1)
'     DURATION - Time in ms during which the pulses are being count
'
'     This function returns number of pulses in given time (DURATION), on given
'       PORT and PIN.
'     Tested on EasyPIC3 with P16F877A. With few modification it can be used
'       with almost every PIC MCU.
' *)
program pulsein_demo

dim counter,
    msec,
    num_impulse as word
    txt         as char[10]
    
sub procedure interrupt
   inc(counter)                               ' Increment value of counter on every interrupt
   if counter = 1 then                        ' Has 1ms elapsed?
     counter = 0                              ' Clear the counter
     inc(msec)                                ' Increment msec on every 1 ms
   end if
   TMR0 = 5
   ClearBit(INTCON, T0IF)                     ' Clear the TMR0IF flag
   SetBit(INTCON, T0IE)                       ' Enable TMR0 interrupt
end sub

sub function Pulse_In(dim byref port as byte, dim pin, state as byte, dim duration as word)as word
dim tmp as word                               ' Temporary variable
    old as byte                               ' Previous pin state value

  while TestBit(port, pin) = state            ' Wait for pulses
  wend                                        ' Note that the program will stop here
                                              '   if there are no pulses
  
  while TestBit(port, pin) <> state           ' Wait for rising (falling) edge
  wend                                        ' Note that the program will stop here
                                              '   if there are no pulses

  tmp  = 0                                    ' Clear temporary variable
  msec = 0                                    ' Clear number of ms
  old  = TestBit(port, pin)                   ' Get current pin state

  while duration > msec                       ' Check if duration is reached
     if (TestBit(port, pin)) <> old then      ' Check if pin state has changed
        inc(tmp)                              ' Increment number of pulses
        old = TestBit(port, pin)              ' Get current pin state
     end if
  wend

    result = (tmp >> 1) + 1                   ' Assign result value
end sub

main:
  OPTION_REG = 2                              ' Assign prescaler to TMR0 (1:8)
  TRISB  = $00                                ' Designate PORTB as output
  PORTB  = $FF                                ' Initialize PORTB

  TRISD  = $FF                                ' Designate PORTD as input (for signal)

  counter= $00                                ' Initialize the counter
  TMR0  = 5
  INTCON = $A0                                ' Enable TMRO interrupt

  msec = 0                                    ' Clear msec
  num_impulse = 0                             ' Clear num_impulse

  ADCON1 = $FF                                ' PORTB all digital
  CMCON  = $06                                ' Comparators off

  Lcd_Init(PORTB)                             ' Initialize LCD connected to PORTB
  Lcd_Cmd(LCD_CLEAR)                          ' Send command to LCD "clear display"
  Lcd_Cmd(LCD_CURSOR_OFF)                     ' Send command "cursor off"


  Lcd_Out(1, 1, "Waiting...      ")           ' Print txt to LCD
  num_impulse = Pulse_In(PORTD, 0, 1, 1000)   ' Count HI pulses on PORTD.0, for 1000ms
  WordToStr(num_impulse, txt)                 ' Convert results to string for LCD output
  Lcd_Out(1, 1, "Number of pulses")           ' Print txt to LCD
  Lcd_Out(2, 1, txt)                          ' Print number of pulses to LCD
  while 1 = 1
  wend                                        ' Wait forever (stop)
end.

Насчет кириллицы - все зависит от примененного ЖК индикатора, есть русифицированные а есть - нет.
Если нет - ничего не попишешь, в них вообще-то можно прописать символы, определенные пользователем, но всего 8 шт. Обычно эту возможность применяют для отображения нестанартных (отсутствующих в станартной таблице) символов.

Автор: BoomeR 11.2.2011, 23:01

SSh спасибо большое. Жаль что с английским не дружу dry.gif буду по тихоньку разбираться. Как я понял он будет делать счет импульсов за секунду и при этом задержка выполнения программы будет на секунду, а как сделать что бы он отображал количество импульсов в минуту и при этом не ждал и не считал импульсы целую минуту, что бы самая минимальная задержка была, и мог считывать от 2000 импульсов в минуту? wacko.gif Это понятно что полученное значение придется умножать на что то что бы получить в минутах и минуту не ждать, а потом выводить на дисплей, какой самый короткий период времени что бы он успевал считать, при кварце 20 000? wacko.gif

Автор: BoomeR 11.2.2011, 23:22

Если конечно что то не реальное говорю, вы меня поправьте, я в этом деле новичок, еще только разбираюсь smile.gif

Автор: SSh 11.2.2011, 23:31

Нет, не так. МК будет ждать импульсы до победного конца smile.gif Т.е. до тех пор пока они не поступят на вход
Вот в этих строках описывается, в вольном переводе - ждать пока не будет фронт, а потом снова ждать спада импульса. И в комментарии - программа останавливается здесь если нет импульсов

while TestBit(port, pin) = state ' Wait for pulses
wend ' Note that the program will stop here
' if there are no pulses

while TestBit(port, pin) <> state ' Wait for rising (falling) edge
wend


Автор: BoomeR 11.2.2011, 23:41

Что то я совсем ни чего не понял wacko.gif все таки мне наверно без тахометра придется обойтись sad.gif

Автор: SSh 11.2.2011, 23:55

Там все просто
while - ждать выполнения какого-либо условия.
wend - окончание цикла ожидания если условие выполняется, в противном случае снова переход на while.
Например, для постоянного выполнения программы можно записать что-то подобное

start:
.....
.....
программа
.....
.....
goto start

А можно и так
while 0=1
.....
.....
программа
.....
.....
wend

Т.к 0 никогда не станет равным единице, программа будет крутится бесконечно. Понятно? wink.gif

Или посмотри в сторону PicBasic. А еще лучше - здесь
http://forum.amadeus-project.com/index.php?showtopic=600
Индикатор расхода топлива, если вместо расхода измерять обороты то даже проще получится, там самая сложная часть - прогрессбар. Плюс измерение температуры и индикация времени (часы)
Есть и схема и исходники (прокомментированные)

Автор: BoomeR 12.2.2011, 0:51

SSh насчет программы немного начинаю понимать, буду разбираться. А на пик бейсике пробовал писать, что то вообще ни как, как то к микро привык. И хочется не что то готовое, а хочется что то самому сделать smile.gif разобраться как это работает и под себя подстроить. Как у меня вечная проблема с сабвуфером, послушаешь чуть чуть, потом машину не заведешь, и мне хочется в этот БК вольтметр, что бы настроить на самое низкое напряжение при котором стартер крутится, как напряжение чуть ниже опустилось и БК начал попискивать, что пора заводить машину smile.gif так же и с температурой двигателя smile.gif дисплей я собираюс 4-х строчный ставить (wh2004), что бы все нормально видно было, а не в куче smile.gif

Автор: SSh 12.2.2011, 1:13

Так я же не говорю "бери и используй". Как раз хорошая стартовая информация для того чтобы понять как это работает и подстроить под себя.
В первоначальном варианте кстати и вольтметр был, потом я эту подпрограмму изъял за ненадобностью (мне) wink.gif Но ввести легко - просто использовать один из входов как АЦП.
С температурой двигателя могу посоветовать подключиться непосредственно к датчику температуры ОЖ, т.е. и для температуры тоже использовать один из портов как АЦП.
Т.к. входное сопротивление МК очень велико, то он не будет оказывать никакого влияния на показания приборки.
А с прерыванием программы ты же не сможешь контроллировать ничего с заглушенным движком...

В любом случае я просто советую - решать тебе wink.gif
Под конец вопрос - а куда думаешь четырехстрочник ставить?

Автор: BoomeR 12.2.2011, 12:13

SSh, куда ставить я еще не придумал blush.gif а насчет того что бы при заглушеном двигателе программа не останавливалась нельзя ли что то типо того:

main:

if (Button(PORTx,x,1,1)) then ' Это провод с контрольного датчика давления масла, когда движок стоит, на нем"-", как только заведется и появится давление масла на этом проводе будет "+"

cюда вставить часть программы счатающюю импульсы


end if

И получится если двигатель заглушен, на ноге ПИКа будет минус, и он не будет тогда ждать импульсов. Если что то не так поправте smile.gif

Автор: SSh 12.2.2011, 12:16

Можно... Но в PicBasic-е все проще намного wink.gif

Автор: BoomeR 12.2.2011, 12:53

SSh спасибо! Теперь у меня есть надежды, что хоть что то, но должно получиться smile.gif а с ПИКБейсиком согласен что там все проще. Но мне чем заново осваивать Пик бейсик, проще будет разобраться со счетом импульсов в Микро.

Автор: SSh 12.2.2011, 13:19

Как тебе удобнее, конечно, так и делай smile.gif В любом случае, если будут вопросы - постараюсь помочь чем смогу.

Автор: NeWT 27.2.2011, 21:23

Странная проблемка вылезла blink.gif PIC12F675. Подключения: +5В питание, минус, MCLR на +5В через 10кОм и цифровой вход GP1 на который приходит или не приходит 4.4В. Так вот если отключить питание +5В, то МК продолжает работать на питании от GP1, где в этот момент уже почему-то не 4.4В, а 3.6В, а на Vcc при этом 2.8В откуда-то беруться... Что это? Как сделать, чтобы МК не питался от цифровых входов?

Автор: SSh 27.2.2011, 21:48

smile.gif Похожий случай был у Димы с AVR-ом.
МК потребляют так мало тока что логического уровня на входе им хватает для работы...

Автор: NeWT 27.2.2011, 22:09

Но что с этим делать!? Я не хочу, чтобы он продолжал работу от логического входа! Я хочу: нет питания - нет работы smile.gif

Автор: SSh 27.2.2011, 22:19

Попробуй подать сигнал на вход, по которому идет паразитное питание, через токоограничительный резистор.

Автор: NeWT 27.2.2011, 22:28

Да у меня там итак сначала 14В потом где-то 3кОм и 4.3В стабилитрон, т. е. какбы есть этот резистор...... А программно там ничё не переключается? smile.gif

Автор: SSh 27.2.2011, 22:32

Нет, программно ничего не сделаешь... А вот насчет резистора и стабилитрона не понял... А где второй резистор (нижнее плечо) ?

Автор: NeWT 27.2.2011, 22:55

Эммм... Я просто сделал, как ты учил, параметрический стабилизатор. 14В идут в МК через сопротивление, а к земле ножка МК притянута через стабилитрон и всё... Всегда работало... huh.gif

Автор: SSh 27.2.2011, 23:08

Неправильно wink.gif Это будет параметрическим стабилизатором если работает на нагрузку. А какая нагрузка порт МК? Практически никакая. Если тебе надо скинуть 14 (или сколько там было?) вольт до уровня МК, то делать это следует делителем напряжения, состоящим из 2-х резисторов. Соотношение номиналов примерно 2:1 (верхнее плечо к нижнему, напр. верх - 20к, низ 10к) Стабилитрон здесь выполняет сугубо защитную функцию, от случайных всплесков напряжения.

Автор: NeWT 27.2.2011, 23:13

Вот блин smile.gif Доделаю )))

Автор: ЯВА 10.3.2011, 21:14

Пробую писать в микрос. Вроде получается НО. Решил использовать структуры, компилирует нормально а прога не работает. Мож кто подскажет как правильно их использовать. Конкретно битовые поля.

Автор: SSh 11.3.2011, 7:25

Если компилирует нормально - значит с точки зрения компиллятора ошибок в синтаксисе программы нет (не путать с алгоритмом wink.gif). Если-же МК не дышит - вполне вероятно что неправильно установлены свойства проекта (биты конфигурации) или еще часто встречающиеся недосмотры - не отключены внутр. компараторы, неправильно объявлены порты (вход-выход-аналог-цифра) ну и т.д. причин может быть много.

Автор: ЯВА 11.3.2011, 20:08

Да нет . Когда заменяю структуру на ряд переменных всё гуд.
Делаю вывод что проблемы со структурой

Автор: BoomeR 28.4.2011, 21:13

SSh здравствуйте! Хотел вас спросить, вы выкладывали где нибудь примеры подключения термометра DS1820 к ПИКу с лсд дисплеем на микробэйсике? Мне для ПИКа 16F873, пол года назад писал, все получалось, а щя весь вечер мучаюс, ни как, компилятор все ошибки находит. Забыл все angry.gif если да, не могли бы дать ссылочку или здесь написать, заранее спасибо.

Автор: SSh 28.4.2011, 21:35

Есть на PicBasic в теме про индикатор расхода топлива
http://forum.amadeus-project.com/index.php?showtopic=600

На MikroBasic - должны быть исходники в моих архивах, кажется что-то делал, поищу...

Нашел... Тут не только термометр но и часы и вольтметр, просто надо повыкидывать ненужное
 Amadeus.rar ( 7,24 килобайт ) : 355


Кстати, наверное в этой же теме я уже это выкладывал...

Автор: BoomeR 28.4.2011, 21:45

Спасибо. Щя попробуем smile.gif я из хелпа брал готовую программу, только порты переписываю на другие и ошибка 78 327 Incompatible types ("array of byte" to "array of char") wacko.gif че только не делал...
А в этой теме не нашел....

Автор: Titus 28.4.2011, 21:58

BoomeR, хе, Шуя smile.gif
У вас 30 апреля будет гонка "Голубые Озера", пойдешь? Там будут 4 интересные машины wink.gif

Автор: BoomeR 28.4.2011, 22:17

Titus, про гонку не слышал, если узнаю где состоится, обязательно схожу! Спасибо good.gif

Автор: Titus 28.4.2011, 22:19

А вот:
http://www.freedrive.ru/ru/news/17-news/457--golubyje-ozora-2011-na-start
http://www.faspo.pskov.ru/node/2422

Автор: BoomeR 28.4.2011, 22:36

Что то я совсем ни че не понимаю. от Невеля до шуи км 800 наверно, а у них трасса всего в 300км. Или я что то путаю?

Автор: SSh 29.4.2011, 6:21

Ради интереса тоже взял из help-а - все скомпиллировалось без ошибок. Но процессор - 16F887, если у тебя 16F873 то надо пересмотреть и установки регистров, в данном случае - АЦП
В 16F873 нет ANSEL и ANSELH, здесь используется ADCON1, т.е. вместо

Код
ANSEL  = 0                         ' Configure AN pins as digital I/O
ANSELH = 0

Надо написать
Код
ADCON1 = %10000110       ' Set all pins as digital

С такой поправкой скомпиллировалось и для 16F877-го, неохота было править порты под 873-й, но это по сути тот-же МК, только более продвинутый - даже даташит на них общий...

Автор: SSh 29.4.2011, 6:33

Вдогонку...
Не вытерперл, подправил порты (вместо несуществующего в примененном МК порта Е на А) - скомпиллировал. Все нормально.
Осциллятор - 8 МГц, MikroBasic Pro V4.60
 1_Ware.zip ( 40,14 килобайт ) : 310

Автор: BoomeR 1.5.2011, 11:07

SSh, спасибо большое, все получилось! Я делал из вашего проекта amadeus, где термометр, часы, вольтметр, повыкидывал не нужное, даже порт термометра совпал с моим А5 smile.gif еще хочу подключить 3 светодиода, ну чтобы один горел до 30град. другой до 80, а последний с выше 80. Только не знаю с каким значением эту температуру сравнивать...

Автор: SSh 1.5.2011, 11:50

smile.gif
Сравнивать можно с любым, или с RAW -кодом (см. даташит на DS1820) или уже с перерасчитанным.

Автор: sanche29 26.5.2011, 21:37

Цитата(SSh @ 9.11.2009, 10:36) *
Ну как, кто-нибуть купил/получил PicKit? Что-то все молчат... dry.gif


Я купил!И адаптер спаял smile.gif

Автор: Uncle_Dizel 23.8.2011, 22:52

как на PicBasicPro можно реализовать RGB свет?

Автор: SSh 24.8.2011, 16:07

3 программных ШИМ-а

Автор: Uncle_Dizel 25.8.2011, 15:58

x var word
TRISIO = %110001
main:

For X = 0 to 255 step 5
pwm GPIO.1, X, 5
next
pause 1000
next x
end

это программа одного светодиода включение на pic 12 f629
просто если pic 12 f629 выполняет команду pwm он не может выполнять других действий , а как тогда быть с другими светодиодами?

Автор: SSh 25.8.2011, 16:22

Есть пики со встроенными (аппаратными) PWM. Напр. PIC16F737, имеет на борту 3 PWM модуля.
Запуск встроенного модуля подразумевает непрерывное выполнение программы.

Еще глянь здесь, правда не на PicBasic, но все-таки... В частности AN1074
http://www.gaw.ru/html.cgi/txt/publ/opto/led.htm

Автор: BoomeR 5.9.2011, 20:40

Здравствуйте, подскажите можно ли так делать PORTА. 1 = ( здесь имя переменной) значение у которой будет 1 или 0, будет ли так порт работать? МикроБейсик

Автор: SSh 5.9.2011, 20:50

Можно, если тип переменной выбран правильно (bit)

Автор: BoomeR 6.9.2011, 17:26

SSh, Вы ни когда не делали что-то, типо бегущей строки, я думал что все просто, электронную часть сделал, а вот с программной появилис проблемки, хотелось бы понять принцип действия её, или исходники программы посмотреть. PIC 16F876, микробейсик.

Автор: SSh 6.9.2011, 17:38

Нет, не делал... А на чем реализуется эта строка (LED матрицы, ЖК индикаторы, etc...)?

Автор: BoomeR 6.9.2011, 17:45

Светодиоды пиранья, 5х15. на транзисторах.

Автор: SSh 6.9.2011, 18:43

А дальше? Драйвера, сдвиговые регистры и т.д. Вообще мне часто попадались подобные устройства, просто за ненадобностью не читал...

http://www.google.com/search?hl=en&source=hp&biw=930&bih=495&q=%D0%B1%D0%B5%D0%B3%D1%83%D1%89%D0%B0%D1%8F+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0+%D0%BD%D0%B0+pic16f&oq=%D0%B1%D0%B5%D0%B3%D1%83%D1%89%D0%B0%D1%8F+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0+%D0%BD%D0%B0+pic16f&aq=f&aqi=&aql=&gs_sm=e&gs_upl=59l8168l0l8660l15l10l0l9l9l0l591l591l5-1l1l0

Автор: BoomeR 6.9.2011, 19:40

Мне хочется как можно проще, ПИК транзисторы и светодиоды, схему сам придумывал, работает! но получается выводить только строчки по горизонтали или по вертикали. Мне не нужно слова разные выводить, клавиатуры подсоединять, пик к компу...., просто с прошивкой пару слов залить и все. Так можно?

Автор: SSh 6.9.2011, 20:27

Так, навскидку, в любом случае придется применить сдвиговые регистры.
Вот здесь законченные конструкции, повыкидывай ненужное или подправь...
http://begstr.narod.ru/
http://monitor.net.ru/forum/topic208883-32.html
http://radionet.com.ru/shem/shem877.html
и таких еще очень много...

Автор: BoomeR 6.9.2011, 20:46

SSh, спасибо, буду пытаться...

Автор: Uncle_Dizel 3.10.2011, 21:08

еще раз про RGB я прото читал эт статью http://www.radiohlam.ru/teory/shim_3ch.htm
там код на асемблере , думаю как описать это на picbasic

Автор: SSh 3.10.2011, 21:22

Один из вариантов - переключать выходные уровни по прерыванию от внутр. таймера.
Или подобрать контроллер с соответствующим кол-вом ССР модулей на борту, напр. PIC16F737 содержит 3 таких модуля, а некоторые из серий PIC24 и dsPIC - до 8-и
Для этого случая в PicBasic есть команда HPWM.

Автор: BoomeR 3.1.2012, 21:20

SSh, вы ни когда не писали или не встречались с программами на микробэйсике под контроллер пик16ф873 для ключа iButton? Интересно как считывать с него код.

Автор: SSh 3.1.2012, 21:38

iButton работает по протоколу OneWare, MikroBasic имеет соотв. библиотеки.
Такой девайс у меня уже давно валяется - никак времени не выберу поковыряться, да в принципе не было пока необходимости.
А какой пик - не важно...

Автор: SSh 3.1.2012, 21:42

Посмотри еще здесь
http://www.mikroe.com/forum/search.php?keywords=ibutton&terms=all&author=&fid[]=142&sc=1&sf=all&sk=t&sd=d&sr=posts&st=0&ch=300&t=0&submit=Search

Автор: BoomeR 3.1.2012, 21:47

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

Автор: SSh 5.1.2012, 22:36

Готовая прога, правда на Паскале, но легко адаптировать для MikroBasic
http://www.mikroe.com/forum/viewtopic.php?p=17700#p17700

А вот для старой версии MB
http://www.mikroe.com/forum/viewtopic.php?t=107


Автор: Artem NN 14.2.2012, 9:47

Сергей (Ssh) привет!

Я нашел схемку LC-1

http://forum.amadeus-project.com/index.php?showtopic=537&st=1880&start=1880
чип atmega64
что можешь сказать по деталькам и чипу ?? Чем его шить ? что за что отвечает?

Автор: dmitrij_b 14.2.2012, 10:40

AVR-ки (в том числе меги) шьются хоть даже пятью проводами в LPT порт. Или, как недавно выяснилось, PicKit-ом вторым.

Автор: SSh 14.2.2012, 11:40

Если надо прошить всего раз, то как уже Дима сказал - 5 проводков+LPT порт. - http://www.getchip.net/posts/delaem-lpt-programmator-dlya-avr-mikrokontrollerov/
Проверить как работает PicKit к сожалению так и не удалось...
Еще, можно модифицированным программатором - http://forum.amadeus-project.com/index.php?showtopic=1278&view=findpost&p=27523, который позволяет помимо программирования также реанимировать атмеги со случайно сброшенным внутренним осциллятором.
Если-же хочется иметь что-то более фундаментальное, именно для прошивки AVR, то существуют множество схем USB программаторов, один из которых я и использую - http://forum.amadeus-project.com/index.php?showtopic=1278&view=findpost&p=26472 . Последний, кстати, тоже имеет средства для восстановления сброшенных фьюзов.

Автор: NeWT 12.4.2013, 14:02

Собираюсь на МК сделать это - http://forum.amadeus-project.com/index.php?showtopic=7777

Посоветуйте, как включать мощное реле (которое надо ещё найти) через МК smile.gif

Автор: aLife 29.11.2013, 21:50

всем привет
начал тему в другой ветке
http://forum.amadeus-project.com/index.php?showtopic=9283

но SSh послал меня сюда biggrin.gif за что ему огромное спасибо.
немного почитав ветку, написал программку в микробейсике.
Это моя первая проба пера, поэтому прошу взглянуть на допущенные ошибки.
места в которых я сомневаюсь выделил красным.

program cruise

dim btn as byte

'ONOFF > GPIO.0
'SETCOAST > GPIO.1
'RESACC > GPIO.2
'BUTTONS > GPIO.4 AN3
'CALL > GPIO.5


main:' Main program
TRISIO = %010000 ' GP4 вход, остальное выход
CMCON = %00000111' компоратор выключить
ADCON0 = %00001101 ' левое выравнивание, опорное напряжение vdd, AN3, преобразование не выполняется, включить АЦП
ANSEL = %01011000 ' Fosc/16 понятия не имею зачем, AN3 аналоговый,
GPIO = 0
CLEAR

while (TRUE)
btn = ADC_Read (0) ' считать заначение АЦП AN3 возможно ошибся с адресом в скобках
if btn <= 45 then
GPIO.0 = %1 'если нажата кнопка ON/OFF (АЦП 0-45) то на выходе GPIO.0 установить лог. 1
end if

if btn > 45 then
if btn <= 148 then
if GPIO.0 = %1 then 'если нажата кнопка CANCEL (АЦП 46-148) то проверяем состяние GPIO.0
GPIO.0 = 0 'если на выходе 1 то сбрасываем на 0
Delay_ms(200) 'ждем немного
GPIO.0 = %1 'и возвращаем 1 на место
end if
end if
end if

if btn > 148 then 'если нажата кнопка RES/ACC (АЦП 148-256)
if btn <= 256 then 'то на выходе GPIO.2 установить лог. 1
GPIO.2 = %1
end if
end if

if btn > 256 then 'если нажата кнопка RES/ACC (АЦП 256-377)
if btn <= 377 then 'то на выходе GPIO.5 установить лог. 1
GPIO.5 = %1
end if
end if

if btn > 377 then 'если нажата кнопка RES/ACC (АЦП 377-589)
if btn <= 589 then 'то на выходе GPIO.1 установить лог. 1
GPIO.1 = %1
end if
end if

if btn > 589 then ' если ничего не нажато
GPIO.1 = 0 ' то сбрасываем на 0 все выходы
GPIO.2 = 0 ' кроме GPIO.0
GPIO.5 = 0
end if

wend

end.

Автор: SSh 30.11.2013, 7:15

Так, на первый взгляд...
1. Переменная btn не может быть byte, т.к. принимает значения больше 255, тип должен быть word
2. Число в скобках функции АЦП означает номер канала, для AN3 должно быть ADC_Read(3)
3. Для установки порта знак процента не нужен, т.е. пишем так GPIO.0 = 1


Автор: aLife 30.11.2013, 9:24

Цитата(SSh @ 30.11.2013, 10:15) *
Так, на первый взгляд...
1. Переменная btn не может быть byte, т.к. принимает значения больше 255, тип должен быть word
2. Число в скобках функции АЦП означает номер канала, для AN3 должно быть ADC_Read(3)
3. Для установки порта знак процента не нужен, т.е. пишем так GPIO.0 = 1


Спасибо.
тогда еще вопросы smile.gif
1)можно ли со значением word производить математические операции? в данном случае сравнение?
2) как загрубить значение с АЦП с 10 до 8 бит?
3) по команде GPIO.0 = 1, вывод GPIO.0 переходит в лог. 1 и остается в таком состоянии до тех пор пока не будет соответствующей команды, все верно?

Автор: SSh 30.11.2013, 14:25

1. Конечно можно
2. Честно говоря не знаю, позволяют-ли это pic12-e. Надо будет попробовать в PicBasic-e, там разрядность выбирается одним оператором DEFINE.
3. Да, пока не сбросишь остаются в установленном состоянии.


Автор: aLife 3.12.2013, 9:39

Цитата(SSh @ 30.11.2013, 17:25) *
1. Конечно можно
2. Честно говоря не знаю, позволяют-ли это pic12-e. Надо будет попробовать в PicBasic-e, там разрядность выбирается одним оператором DEFINE.
3. Да, пока не сбросишь остаются в установленном состоянии.


Получилась вот такая программа (во вложении).
создаю проект, генерируется файл заливаю его в PIC. И ничего не происходит sad.gif
попробовал совсем простенькие прошивки, с текстом GPIO=1, чтобы просто зажечь светодиоды.
но ничего не происходит.
есть ли какие-нибудь нюансы компиляции в HEX ?

Использую программатор autoprog и его встроенный софт (раньше всегда использовал WinPic800 и JDM программатор). автопроговский софт почему-то не читает последние два байта (там где хранится калибровочное значение), но зато есть параметр (забыл как наз-ся, что-то типа конфигурация МК) состоящий почему-то из 14 бит, есть подозрение, что я нечаянно его затер, когда я разбирался с софтом. Самое интересное, что когда я его правлю и записываю в МК, то записываетя непонятно какое значение, а не то что что я написал.

Вообще пик со стертым/неправильным калибровочным значением может работать без внешнего тактового генератора?

PS сегодня вытащу из машины рабочую микросхемку и продолжу на ней эксперименты.
 Cruise.txt ( 2,11 килобайт ) : 541


Автор: SSh 3.12.2013, 10:56

Если выберу время проверю на макетнице, но быстро не обещаю, хотя и не исключаю wink.gif

Со стертой OSCCAL константой внутренний генератор работать будет

Автор: aLife 4.12.2013, 10:24

Цитата(SSh @ 3.12.2013, 13:56) *
Если выберу время проверю на макетнице, но быстро не обещаю, хотя и не исключаю wink.gif

Со стертой OSCCAL константой внутренний генератор работать будет


Разобрался я что за слово конфигурации PIC в автопроговском софте - это биты конфигурации, которые в winpic800 заполнялись чекбоксами.
Самое интерсное, что при ститирании МК софтина стирает и биты конфигурации, для того чтобы это понять надо считать биты конфигурации заново убедится что они стерты и заново записать. Причем в даташите на пик написно что есть три неиспользуемых бита и они должны считываться как единицы, а они считываются как нули.

а вот последние два байта, где храниться калибровка я по прежнему не нашел способа как считать smile.gif

А еще софт програматора не понимал hex, поэтому хексовые прошики он воспринимал как бинарники и что попало записывал.
надо экспортом подготавливать файлик, тогда все ок.

пока итог такой:
собрал тестовую схемку с одним светодиодом. загрузил готовую програмку из инета. работает - светодиод моргает
а вот мои программы работать не хотят sad.gif
написал простенькую программу типа GPIO = 1 задержка, GPIO = 0 .
но ничего не работает sad.gif
можешь выложить, если есть под рукой, тестовую програмку (моргание диодом) исходник микробайсиковый и хекс.
может у меня на стадии компиляции что-то не так или может я пишу плохо smile.gif

Автор: SSh 4.12.2013, 14:23

На MikroBasic ничего подходящего (готового) нет под рукой, есть мигалка на PicBasic Pro, здесь светодиоды подключены через транзисторные ключи, можно сажать и непосредственно на порты, если ограничить ток на уровне допустимого.
 FlashLight.rar ( 23,21 килобайт ) : 220


Видео работы где-то выкладывал, чтоб не искать...
https://www.youtube.com/watch?v=LxnY1Fkf9tE

Константу OSCCAL не затирают фирменные программаторы от Microchip, напр. PicKit (на видео виден кусочек smile.gif) Ну и считывают естественно. Помимо этого PicKit имеет средства восстановления указанной константы, правда не знаю насколько верно она восстанавливается, хотя могу и проверить wink.gif


Автор: aLife 4.12.2013, 21:58

Цитата(SSh @ 4.12.2013, 17:23) *
На MikroBasic ничего подходящего (готового) нет под рукой, есть мигалка на PicBasic Pro, здесь светодиоды подключены через транзисторные ключи, можно сажать и непосредственно на порты, если ограничить ток на уровне допустимого.
 FlashLight.rar ( 23,21 килобайт ) : 220


Видео работы где-то выкладывал, чтоб не искать...
https://www.youtube.com/watch?v=LxnY1Fkf9tE

Константу OSCCAL не затирают фирменные программаторы от Microchip, напр. PicKit (на видео виден кусочек smile.gif) Ну и считывают естественно. Помимо этого PicKit имеет средства восстановления указанной константы, правда не знаю насколько верно она восстанавливается, хотя могу и проверить wink.gif


заработало. проблема была связана с особенностями программатора.

Теперь вопрос как побороть дребезг кнопок?

Автор: SSh 4.12.2013, 22:15

Аппаратно - шунтированием кнопок небольшими емкостями или программно - введением задержек.
В PicBasic есть даже отдельная команда, учитывающая дребезг - BUTTON.
Или см. одноименную комаанду в MikroBasic.

Автор: aLife 4.12.2013, 22:27

Цитата(SSh @ 5.12.2013, 1:15) *
Аппаратно - шунтированием кнопок небольшими емкостями или программно - введением задержек.
В PicBasic есть даже отдельная команда, учитывающая дребезг - BUTTON.
Или см. одноименную комаанду в MikroBasic.

Button ведь работает только с логической кнопкой? а не АЦП как в моем случае?
и похоже дело не в дребезге, а в том, что в моей программе нет проверки какая клавиша была нажата, если нажать клавишу on\off, то выход преключится на 1 пройдет цикл
переключится на 0 и так до бесконечности пока не отпущу кнопку, а надо чтобы "залипало"

Автор: SSh 4.12.2013, 22:42

А, ну если для аналогового входа, то тогда дребезг подавлять, конечно, не надо.
Для того, чтобы состояние порта "залипало" можно ввести доп. переменную, которая устанавливается нажатием кнопки on-off, и сбрасывается только при отпускании этой кнопки. И устанавливать GPIO.0 только если переменная сброшена.

Автор: aLife 4.12.2013, 23:10

Цитата(SSh @ 5.12.2013, 1:42) *
А, ну если для аналогового входа, то тогда дребезг подавлять, конечно, не надо.
Для того, чтобы состояние порта "залипало" можно ввести доп. переменную, которая устанавливается нажатием кнопки on-off, и сбрасывается только при отпускании этой кнопки. И устанавливать GPIO.0 только если переменная сброшена.


ага, примерно так и сделал, и еще одну сделаю потом на кнопку cancel.

нравится мне это начинает smile.gif столько задумок в голове появилось

несколько раз начинал читать книжки по пикам и бросал. слишком много вводной информации.
а тут другое дело smile.gif все довольно непринужденно, легкий толчок к дальнейшему изучению.
в общем, спасибо тебе good.gif


Автор: SSh 5.12.2013, 6:17

drinks.gif smile.gif
А еще глянь на PicBAsic Pro. Все выложенные здесь на форуме проекты на нем. Имеет одно неоспоримое достоинство - команду определения длительности импульса - Pulsin, которая отсутствует в MikroBasic-e. Точность и диапазон измерений, конечно, невелики, но для кое-каких авто-устройств - самое то smile.gif

Автор: SSh 5.12.2013, 6:55

Кстати, если собираешься продолжать изучение или использование МК, то советую в первую очередь сменить программатор, хотя-бы на уже упоминавшийся здесь PicKit, или на один из многочисленных клонов, вон их сколько на http://www.ebay.com/sch/i.html?_odkw=pickit&_osacat=0&_from=R40&_trksid=p2045573.m570.l1313.TR8.TRC1.A0&_nkw=pickit&_sacat=0
Также, как вариант, можно и самому собрать http://labkit.ru/html/programmators_shm?id=86

Автор: aLife 16.12.2013, 10:43

Цитата(SSh @ 5.12.2013, 10:55) *
Кстати, если собираешься продолжать изучение или использование МК, то советую в первую очередь сменить программатор, хотя-бы на уже упоминавшийся здесь PicKit, или на один из многочисленных клонов, вон их сколько на http://www.ebay.com/sch/i.html?_odkw=pickit&_osacat=0&_from=R40&_trksid=p2045573.m570.l1313.TR8.TRC1.A0&_nkw=pickit&_sacat=0
Также, как вариант, можно и самому собрать http://labkit.ru/html/programmators_shm?id=86


Ну автопрог не так уж плох, единственный существенный минус - он не мой:) Скорее куплю готовый пиккит, т.к. собирать лайт версию по деньгам выйдет так же как купить готовый smile.gif

Еще несколько вопросов.

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


и еще один вопрос про энкодер механический.
появилась задача подключить микроконтроллер параллельно энкодеру, чтобы можно было регулировать громкость и крутилкой и через МК.
Я думал что энкодер посылает код грея, за 1 щелчек полный цикл (4 смены состояния). и что в состоянии покоя контакты разомкнуты. Но первый попавшийся мне энкодер за щелчек отрабатывает пол цикла, т.е. в одном положении контакты разомкнуты, на следующий щелчек замкнуты. Это стандартная ситуция? большинство энкодеров такие ? или мне просто повезло купить на пол цикла?

и еще вопрос.
есть ли какие-нибудь нюансы для внутрисхемного программирования? а то у меня пик в корпусе SO8, не хочу его выпаивать.

Автор: SSh 16.12.2013, 11:47

Конечно, замыкание проводков приводит к гораздо большему дребезгу, чем в случае с кнопкой. Помимо этого контакты кнопки подпружинены и поэтому обеспечивают более-менее одинаковое усилие контакта, и, тем самым, одинаковое переходное сопротивление.
Хороший алгоритм усреднения значения сигнала, поступающего на вход АЦП применен в моем http://forum.amadeus-project.com/index.php?showtopic=898. Вот подпрограмма на PicBasic

Код
ReadSensor:                ' Read position
for Counter = 0 to 12      ' 13 times
    ADCIN 0, Aver[Counter] ' Store all reading data in array
next Counter

    Counter=0
SortHall:                  ' Sort array by increasing order
    if Aver(Counter+1) < Aver(Counter) then
       Aver(Counter)     = Aver(Counter) ^ Aver(Counter+1)
       Aver(Counter+1+0) = Aver(Counter) ^ Aver(Counter+1)
       Aver(Counter)     = Aver(Counter) ^ Aver(Counter+1)
          if Counter > 0 then Counter=Counter-2
    endif
Counter=Counter+1
    if Counter < 12 then goto SortHall
Hall1 = Aver[6]            ' Take a middle result as position


По энкодерам, все, которые мне попадались - и из мышек и отдельные работали http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html

Внутрисхемное программирование в принципе ничем не отличается от обычного за исключением тех случаев, когда на выводах программирования висит какая-нибуть шунтирующая нагрузка. Например, опять-же в моем http://forum.amadeus-project.com/index.php?showtopic=600 дисплей подключен к МК через резисторы 1 кОм, хотя обычно соединяем непосредственно, без всяких резисторов. Дело в том, что для управления дисплеем используются выводы PGD и PGC контроллера и он отказался программироваться внутрисхемно;) Причем другой дисплей, даже аналогичный, вполне возможно, никак может и не влиять на это дело...

Автор: Rcus 16.12.2013, 12:22

А не проще использовать проверку установившегося состояния для устранения ошибочного определения нажатий?
Например так (да простят использование C, мне на нём проще изъясняться)

Код
key_mask_t keys_prev, keys, pressed_keys, released_keys;
unsigned key_debounce_decay;

key_mask_t key_mask_from_adc_result(adc_result_t code);
adc_result_t adc_run(adc_channel_t channel);

void keys_process() {
key_mask_t l_keys = key_mask_from_adc_result(adc_run(ADC_CHANNEL_KEYS));

keys_prev = keys;

if (l_keys != keys) key_debounce_decay = DEBOUNCE_KEYS_TIMER_INIT;
else if (key_debounce_decay) --key_debounce_decay;
else keys = l_keys;

pressed_keys = (keys_prev ^ keys) & keys;
released_keys = (keys_prev ^ keys) & keys_prev;
}

Автор: SSh 16.12.2013, 12:30

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

С другой стороны, ухудшив незначительно быстодействие можно и аппаратно поспособствовать уменьшению дребезга.

Автор: aLife 16.12.2013, 13:51

Цитата(SSh @ 16.12.2013, 15:47) *
Конечно, замыкание проводков приводит к гораздо большему дребезгу, чем в случае с кнопкой. Помимо этого контакты кнопки подпружинены и поэтому обеспечивают более-менее одинаковое усилие контакта, и, тем самым, одинаковое переходное сопротивление.
Хороший алгоритм усреднения значения сигнала, поступающего на вход АЦП применен в моем http://forum.amadeus-project.com/index.php?showtopic=898. Вот подпрограмма на PicBasic
Код
ReadSensor:                ' Read position
for Counter = 0 to 12      ' 13 times
    ADCIN 0, Aver[Counter] ' Store all reading data in array
next Counter

    Counter=0
SortHall:                  ' Sort array by increasing order
    if Aver(Counter+1) < Aver(Counter) then
       Aver(Counter)     = Aver(Counter) ^ Aver(Counter+1)
       Aver(Counter+1+0) = Aver(Counter) ^ Aver(Counter+1)
       Aver(Counter)     = Aver(Counter) ^ Aver(Counter+1)
          if Counter > 0 then Counter=Counter-2
    endif
Counter=Counter+1
    if Counter < 12 then goto SortHall
Hall1 = Aver[6]            ' Take a middle result as position


По энкодерам, все, которые мне попадались - и из мышек и отдельные работали http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html

Внутрисхемное программирование в принципе ничем не отличается от обычного за исключением тех случаев, когда на выводах программирования висит какая-нибуть шунтирующая нагрузка. Например, опять-же в моем http://forum.amadeus-project.com/index.php?showtopic=600 дисплей подключен к МК через резисторы 1 кОм, хотя обычно соединяем непосредственно, без всяких резисторов. Дело в том, что для управления дисплеем используются выводы PGD и PGC контроллера и он отказался программироваться внутрисхемно;) Причем другой дисплей, даже аналогичный, вполне возможно, никак может и не влиять на это дело...


Смысл кода не совсем понятен, я пока только микробейсик осваиваю smile.gif
вечером, дома возьму "учебники", попытаюсь понять. но предполагаю, что происходит усреднение значения АЦП по нескольким замерам, а потом уже с полученным значением что-то происходит.
У меня достаточно большой разброс значений ацп между разными кнопками, поэтому на каждую кнопку отведен большой диапазон. Но я опасаюсь, что при медленном нажатии на кнопку (кнопки - резиновые мембраны с токопроводящим пяточком) ацп из-за своего быстродействия сможет распознать неправильную команду раньше чем кнопка будет нажата полностью. Вот хотел бы просто удлинить время замера. В принципе вариант усреднения значений должен подойти.

по внутрисхемному. просто подключаюсь к МК и все? обвязка не мешает? конденсаторы по линии питания?




Автор: SSh 16.12.2013, 15:38

Считываются 13 значений (насколько я помню, именно столько места для переменных и оставалось в памяти) - переменная, естественно, заранее объявлялась в виде массива:

Код
Aver    VAR WORD[13]       ' Voltage (position) array)


Далее, считанные значения сортируются в порядке возрастания и берется среднее (не усредненное!!!), 6-е значение. Как уже отмечал, за несколько лет использования еще не было случая, чтобы зеркало не возвращалось в исходную позицию, считанную указанным способом )). Ну и алгоритм Rcus-a можно применить - на выбор...

ICP - мешает только шунтирование по линиям программирования. По линии питании, по крайней мере при использовании PicKit, ничего не мешает, в том числе и, скажем, выход кренки от которой запитана схема. Конденсаторы, естественно, никак не могут помешать smile.gif

Автор: aLife 16.12.2013, 16:43

Цитата(SSh @ 16.12.2013, 19:38) *
Считываются 13 значений (насколько я помню, именно столько места для переменных и оставалось в памяти) - переменная, естественно, заранее объявлялась в виде массива:
Код
Aver    VAR WORD[13]       ' Voltage (position) array)


Далее, считанные значения сортируются в порядке возрастания и берется среднее (не усредненное!!!), 6-е значение. Как уже отмечал, за несколько лет использования еще не было случая, чтобы зеркало не возвращалось в исходную позицию, считанную указанным способом )). Ну и алгоритм Rcus-a можно применить - на выбор...

ICP - мешает только шунтирование по линиям программирования. По линии питании, по крайней мере при использовании PicKit, ничего не мешает, в том числе и, скажем, выход кренки от которой запитана схема. Конденсаторы, естественно, никак не могут помешать smile.gif

Понял, интересно сколько времени занимает 13 измерений.
а если использовать мой вариант по двум измерениям, и если оба они попадают в диапазон значений одной той же кнопкиX , то считать что нажата кнопкаХ. какую задержку использовать между измерениями? 10ms нормально?

Автор: SSh 16.12.2013, 17:09

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

Автор: Rcus 16.12.2013, 18:46

Цитата(SSh @ 16.12.2013, 18:38) *
Далее, считанные значения сортируются в порядке возрастания и берется среднее (не усредненное!!!), 6-е значение. Как уже отмечал, за несколько лет использования еще не было случая, чтобы зеркало не возвращалось в исходную позицию, считанную указанным способом )). Ну и алгоритм Rcus-a можно применить - на выбор...

По-моему это вообще перпендикулярные вещи, приведённый мною алгоритм никак не затрагивается ни запуск ацп (adc_run) и постобработку его результатов, ни определение состояния кнопок из кода ацп (key_mask_from_adc_result). С небольшими изменениями его можно применять и для GPIO кнопок.

Автор: aLife 17.12.2013, 10:19

Цитата(SSh @ 16.12.2013, 21:09) *
Будет зависеть от дребезга, плюс у тебя ведь кнопки из токопроводящей резины, значит их переходное сопротивление также будет зависеть от силы нажатия...

С кнопками все работает как часы, но лучше перебдеть.
Сделал паузу между замерами 10мс, теперь и с проводками вместо кнопок работает без ложных срабатываний smile.gif
шился внутрисхемно, тоже без проблем, только питание надо было на схему подавать, при использовании питания программатора вылазила ошибка превышения тока.

Автор: aLife 19.1.2014, 15:47

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

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

Заголовок
GPIO.1 = 1
Delay_ms(3)
GPIO.1 = 0
Delay_ms(1)

потом 12 бит команды

где ноль выглядит след образом
GPIO.1 = 1
Delay_ms(1)
GPIO.1 = 0
Delay_ms(1)

а единица вот так
GPIO.1 = 1
Delay_ms(1)
GPIO.1 = 0
Delay_ms(2)

и посылка завершения
GPIO.1 = 1
Delay_ms(1)
GPIO.1 = 0
Delay_ms(30)

для нагладности вот картинка



сейчас в тестовом режиме использую построчное описание включения и выключения GPIO.1.
получается громоздко и не удобно .
Хотелось бы описать как отправляется ноль, а как единица, а потом уже просто давать команду "отправить 00011101001" или "отправить 0x0E9 "
но как это сделать?

Автор: SSh 19.1.2014, 16:09

Можно по UART-линии, используя соотв. библиотеку:
value = 0xE9
UART1_Write(value)

Или то-же самое для строки:
UART1_Write_Text(text)

Автор: aLife 19.1.2014, 17:42

Цитата(SSh @ 19.1.2014, 20:09) *
Можно по UART-линии, используя соотв. библиотеку:
value = 0xE9
UART1_Write(value)

Или то-же самое для строки:
UART1_Write_Text(text)


У этого МК (12F675) нет UART.
и я не совсем понимаю как через UART организовать нужные мне задержки. unknw.gif

Автор: SSh 19.1.2014, 18:11

Еще как вариант - организовать массив из 12 элементов и в цикле по очереди передавать содержимое. Ну а с задержками здесь, думаю, все ясно, вписываются в тело цикла.

Автор: aLife 7.3.2014, 15:36

доброго дня!
а как на микробэйсике отправить контроллер в сон с пробуждением по событию на одном из портов (нажатие кнопки)?

Автор: SSh 7.3.2014, 15:53

Такая команда есть в PicBasic, но пробуждение не по внешнему событию а спустя заданное время. В микробейсике придется использовать ассемблерный фрагмент, см. http://www.mikroe.com/forum/search.php?keywords=sleep&terms=all&author=&fid%5b%5d=97&sc=1&sf=all&sk=t&sd=d&sr=posts&st=0&ch=300&t=0&submit=Search

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