Pic 16f877A и АЦП
|
|
--AndreY-- |
Дата: Вт, 14.09.2010, 16:26 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 22.06.2010
Статус:
Offline
|
Для АЦП задействован резестивный делитель, напряжение меняется в приделах от 2,46 до 5 вольт. Програмка писалась вначале на протоне (ацп вообще отказался работать) потом на picbasice в микрокодстудио. Там заработала, но проблема в том что первый цикл она отрабатывает как надо, на втором значения становятся больше, а на третьем максимальные. Пробовал тестировать програмку в протеусе работает как надо. На RB0 подключён светодиод. Code Define ADC_BITS 8 ' Определяем количество разрядов в результате АЦП. Define ADC_CLOCK 3 ' Устанавливаем источник синхронизации (3 = RC). Define ADC_SAMPLEUS 50 ' Устанавливаем время преобразования. adval var byte ' Создаем переменную adval для хранения результата преобразования ad var byte ' Создаем переменную adval для хранения результата преобразования add var word ' ---[ Инициализация]------------------------- Init: PortB = $00 ' Устанавливаем все выводы PORTB в 0 (все светодиоды не горят). TrisB = %00000000 ' Устанавливаем все выводы PORTB в состояние выход. TRISA = %11111111 ' Все выводы PORTA на вход. ADCON1 = %00000010 ' Устанавливаем все выводы PORTA как аналоговые. ' ---[ Основная программа ]--------------------------
for ad =1 to 5 Pause 1000 portb = %11111111 Pause 1000 portb = %00000000 next ad
main: portb = %11111111 add=0 Pause 5000
'Цикл измерения АЦП
for ad =1 to 10 ADCIN 0, adval ' Читаем канал А0, а результат преобразования сохраняем в переменную adval. add=add+adval pause 50 next ad adval=add/10
if adval < 30 then goto a10' Если результат преобразования меньше 30, if adval < 50 then goto a20' Если результат преобразования меньше 50, if adval < 70 then goto a30' Если результат преобразования меньше 70, if adval < 90 then goto a40' Если результат преобразования меньше 90, if adval < 110 then goto a50' Если результат преобразования меньше 110, if adval < 150 then goto a60' Если результат преобразования меньше 150,
for ad =1 to 100 Pause 100 portb = %00000000 Pause 100 portb = %11111111 next ad
goto main
a10: for ad =1 to 2 Pause 500 portb = %00000000 Pause 500 portb = %11111111 next ad goto main
a20: for ad =1 to 5 Pause 500 portb = %00000000 Pause 500 portb = %11111111 next ad goto main
a30: for ad =1 to 10 Pause 500 portb = %00000000 Pause 500 portb = %11111111 next ad goto main
a40: for ad =1 to 15 Pause 500 portb = %00000000 Pause 500 portb = %11111111 next ad goto main
a50: for ad =1 to 20 Pause 500 portb = %00000000 Pause 500 portb = %11111111 next ad goto main
a60: for ad =1 to 25 Pause 500 portb = %00000000 Pause 500 portb = %11111111 next ad goto main
Сообщение отредактировал
--AndreY-- - Вт, 14.09.2010, 16:28
|
|
|
|
ivan_fd |
Дата: Ср, 15.09.2010, 10:06 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
А на самом порту AN0 у Вас какое напряжение, может оно при третьем цикле уже 5 В?
|
|
|
|
--AndreY-- |
Дата: Ср, 15.09.2010, 13:29 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 22.06.2010
Статус:
Offline
|
Мерил тестором, относительно земли (минуса), оно постоянно, зависит от подстроечного резистора. Т.е. если выставить 3В то так 3В и остаётся. Единственное что (но это врядли) резестивный делитель запитан от +12 вольт. Напряжение он делит в нужных приделах от 2,46 до 5 вольт. Хоть на что похожи симтомы, а том микроконтроллеры только начал осваивать и прям руки опускаются когда начинает что-то не получатся. То в начале из-за конденсаторов на кварцевом резонаторе работать схема не хотела (светодиод не моргал). Они оказались малым номиналом 15пФ, с 30пФ всё заработало отлично.
|
|
|
|
anatol |
Дата: Ср, 15.09.2010, 13:54 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
add=add+adval а где сброс add .
|
|
|
|
--AndreY-- |
Дата: Ср, 15.09.2010, 14:38 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 22.06.2010
Статус:
Offline
|
portb = %11111111 add=0 Pause 5000 Вторая строчка после метки main Вы про это спрашиваете или сброс add в цикле должен происходить? Если в цикле, тогда вопрос а зачем он там?
|
|
|
|
anatol |
Дата: Ср, 15.09.2010, 15:26 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Вы правы, не обратил внимания на установку переменной в ноль. Добавлено (15.09.2010, 15.26.40) --------------------------------------------- Еще один момент - в делителе не слишком высокоомные резисторы стоят и поточнее вот это "но проблема в том что первый цикл она отрабатывает как надо, на втором значения становятся больше, а на третьем максимальные"
|
|
|
|
Alexandr280480 |
Дата: Вт, 25.01.2011, 19:34 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
96
Замечания:
±
На сайте с 23.01.2010
Статус:
Offline
|
Всем привет! Вопрос больше к железу наверное, задумал проект паяльной станции на 16F877A+4 семисегментных индикатора, програмку накидал, вроде понятно кроме одного: у индикаторов катодное управление, можно ли управление (лог.0) "повесить" прямо на вывод порта, например С (как у меня), а что-то через р-n-p транзистор в протеусе индикация одни восьмерки...Может кто сталкивался с таким.
Купить за деньги может ВСЁ, А ты попробуй сделай САМ!!!
|
|
|
|
DAlexV |
Дата: Вт, 25.01.2011, 20:17 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (Alexandr280480) а что-то через р-n-p транзистор в протеусе индикация одни восьмерки... Для имитации в протеусе достаточно заменить транзистор на лог. элемент NOT или использовать транзисторный ключ ULN2803. Он нормально моделируется. И уменьшить ток в свойствах индикаторов(см. в приложенной схеме). Успехов
Прикрепления:
v3.dsn
(253.5 Kb)
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
Alexandr280480 |
Дата: Чт, 27.01.2011, 09:31 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
96
Замечания:
±
На сайте с 23.01.2010
Статус:
Offline
|
DAlexV, спасибо! Ну а всё-таки, можно или нет? Я прочитал в DataSheete...цитирую Максимальный выходной ток стока портов ввода/вывода PORTA, PORTB и PORTE.........................................200мА Максимальный выходной ток истока портов ввода/вывода PORTA, PORTB и PORTE.......................................200мА Максимальный выходной ток стока портов ввода/вывода PORTC и PORTD.......................................................200мА Максимальный выходной ток истока портов ввода/вывода PORTC и PORTD.....................................................200мА У меня в устройстве, при индикации "8" - 70мА, а при других цифрах и того меньше... Добавлено (27.01.2011, 09.31.10) --------------------------------------------- Да кстати, где бы взять модели отечественных элементов для протеуса? Заранее благодарю!!!
Купить за деньги может ВСЁ, А ты попробуй сделай САМ!!!
|
|
|
|
Matrix252005 |
Дата: Чт, 27.01.2011, 10:44 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток. Alexandr280480, а можно узнать, откуда Вы это взяли, что "Максимальный выходной ток стока портов ввода/вывода ....200мА "??? На сколько я знаю, она всегда было 25мА!!! Вот выписка из DATASHEETа: http://www.terrarus.ucoz.ru/proton_....87x.pdf Quote Повышенная нагрузочная способность портов ввода/вывода - 25мА
THE TRUTH IS OUT THERE.
С уважением, Николай.
Сообщение отредактировал
Matrix252005 - Чт, 27.01.2011, 10:45
|
|
|
|
terrarus |
Дата: Пт, 28.01.2011, 08:21 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Учитывайте, что 200мА это максимальный суммарный ток всех разрядов всех портов. а на одинрразряд любого порта можно давать не более 25мА. Таким образом нагрузив 8 разрядов одного порта по 25 мА, больше грузить другие разряды других портов нельзя. ...Хотя радиолюбители обычно грузят, "НО НЕ ДОЛГО!" %)
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Пт, 28.01.2011, 08:22
|
|
|
|
Alexandr280480 |
Дата: Пт, 28.01.2011, 21:41 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
96
Замечания:
±
На сайте с 23.01.2010
Статус:
Offline
|
terrarus, я не пойму Вашe фразу "...200мА это максимальный суммарный ток всех разрядов всех портов"? terrarus, я с порта В на индикатор даю 10мА на сегмент, а катодом управляю (порт С), т.о. ток максимум 70мА, по времени 5 мС при этом порт D не нагружен никак. Matrix252005, на стр.144 разве не то??? Тогда, что это за параметр указан -200мА, у меня было сомнение что не так... Ну что посоветуете, как быть???
Купить за деньги может ВСЁ, А ты попробуй сделай САМ!!!
|
|
|
|
brown |
Дата: Сб, 29.01.2011, 00:17 | Сообщение # 13 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Сегментами управляй прямо с порта, а разрядами через транзисторные ключи по порту С Quote (Alexandr280480) а катодом управляю (порт С), В файле все наоборот, но в принципе разберетесь.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
Сообщение отредактировал
brown - Сб, 29.01.2011, 00:29
|
|
|
|
Alexandr280480 |
Дата: Вс, 30.01.2011, 11:34 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
96
Замечания:
±
На сайте с 23.01.2010
Статус:
Offline
|
Всем пример, прошу взглянуть, и высказать свое мнение...Сделал именно "нулевым управлением", правда при моделировании в Протеусе, на индикаторах иногда (не всегда) проскакивает какая-то бяка, точнее нужная цифра и какой-нибудь ненужный сегмент...Может кто знает почему так происходит, кстати без транзисторных ключей, все нормально...
Купить за деньги может ВСЁ, А ты попробуй сделай САМ!!!
|
|
|
|
DAlexV |
Дата: Вс, 30.01.2011, 12:44 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (Alexandr280480) Может кто знает почему так происходит, кстати без транзисторных ключей, все нормально... Протеус это симулятор. И некоторые элементы у него не имеют аналоговых характеристик. Подай например на светодиод напрямую 200 вольт и он будет светиться, хотя по логике он должен сказать пшшшш или бах. То же касаемо и проца. Так что лучше всего перестраховаться не же ли потом бежать в магазин за новым камнем. Каждый сегмент через резистор для ограничение по току, а общий(разряд) через управляющий транзистор. Что же касаемо Quote (Alexandr280480) при моделировании в Протеусе, на индикаторах иногда (не всегда) проскакивает какая-то бяка, точнее нужная цифра и какой-нибудь ненужный сегмент Это срабатывает статичность вывода в протеусе. Лечилься изменением частоты смены разрядов или гашением сегментов перед сменой разрядов. В реале этого не наблюдается. P/S. Alexandr280480, прошу пользоваться стандартными архиваторами (WinRar, WinZip). Не у всех есть такие редкие. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|