Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум Picbasic.ru » Электроника » Проблемы » Pic 16f877A и АЦП
Pic 16f877A и АЦП
--AndreY-- Дата: Вт, 14.09.2010, 16:26  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 14.09.2010
ivan_fd Дата: Ср, 15.09.2010, 10:06  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

А на самом порту AN0 у Вас какое напряжение, может оно при третьем цикле уже 5 В?
--AndreY-- Дата: Ср, 15.09.2010, 13:29  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 22.06.2010

Статус: Offline

Мерил тестором, относительно земли (минуса), оно постоянно, зависит от подстроечного резистора. Т.е. если выставить 3В то так 3В и остаётся. Единственное что (но это врядли) резестивный делитель запитан от +12 вольт. Напряжение он делит в нужных приделах от 2,46 до 5 вольт.
Хоть на что похожи симтомы, а том микроконтроллеры только начал осваивать и прям руки опускаются когда начинает что-то не получатся.
То в начале из-за конденсаторов на кварцевом резонаторе работать схема не хотела (светодиод не моргал). Они оказались малым номиналом 15пФ, с 30пФ всё заработало отлично.
anatol Дата: Ср, 15.09.2010, 13:54  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

add=add+adval
а где сброс add .
--AndreY-- Дата: Ср, 15.09.2010, 14:38  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 22.06.2010

Статус: Offline

portb = %11111111
add=0
Pause 5000

Вторая строчка после метки main
Вы про это спрашиваете или сброс add в цикле должен происходить? Если в цикле, тогда вопрос а зачем он там?

anatol Дата: Ср, 15.09.2010, 15:26  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Вы правы, не обратил внимания на установку переменной в ноль.

Добавлено (15.09.2010, 15.26.40)
---------------------------------------------
Еще один момент - в делителе не слишком высокоомные резисторы стоят и поточнее вот это "но проблема в том что первый цикл она отрабатывает как надо, на втором значения становятся больше, а на третьем максимальные"

Alexandr280480 Дата: Вт, 25.01.2011, 19:34  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 96
Репутация: 0   ±
Замечания:   ±
На сайте с 23.01.2010

Статус: Offline

Всем привет!
Вопрос больше к железу наверное, задумал проект паяльной станции на 16F877A+4 семисегментных индикатора, програмку накидал, вроде понятно кроме одного: у индикаторов катодное управление, можно ли управление (лог.0) "повесить" прямо на вывод порта, например С (как у меня), а что-то через р-n-p транзистор в протеусе индикация одни восьмерки...Может кто сталкивался с таким.


Купить за деньги может ВСЁ,
А ты попробуй сделай САМ!!!
DAlexV Дата: Вт, 25.01.2011, 20:17  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (Alexandr280480)
а что-то через р-n-p транзистор в протеусе индикация одни восьмерки...
Для имитации в протеусе достаточно заменить транзистор на лог. элемент NOT или использовать транзисторный ключ ULN2803. Он нормально моделируется. И уменьшить ток в свойствах индикаторов(см. в приложенной схеме). Успехов wink
Прикрепления: v3.dsn (253.5 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Alexandr280480 Дата: Чт, 27.01.2011, 09:31  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 96
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 43   ±
Замечания:   ±
На сайте с 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
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Учитывайте, что 200мА это максимальный суммарный ток всех разрядов всех портов. а на одинрразряд любого порта можно давать не более 25мА. Таким образом нагрузив 8 разрядов одного порта по 25 мА, больше грузить другие разряды других портов нельзя. ...Хотя радиолюбители обычно грузят, "НО НЕ ДОЛГО!" happy smile wacko %)

Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Пт, 28.01.2011, 08:22
ЯНДЕКС Дата: 28.01.2011
Alexandr280480 Дата: Пт, 28.01.2011, 21:41  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 96
Репутация: 0   ±
Замечания:   ±
На сайте с 23.01.2010

Статус: Offline

terrarus, я не пойму Вашe фразу "...200мА это максимальный суммарный ток всех разрядов всех портов"?
terrarus, я с порта В на индикатор даю 10мА на сегмент, а катодом управляю (порт С), т.о. ток максимум 70мА, по времени 5 мС при этом порт D не нагружен никак.

Matrix252005, на стр.144 разве не то???
Тогда, что это за параметр указан -200мА, у меня было сомнение что не так...

Ну что посоветуете, как быть???


Купить за деньги может ВСЁ,
А ты попробуй сделай САМ!!!
brown Дата: Сб, 29.01.2011, 00:17  |                                                                                                                Сообщение # 13
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Сегментами управляй прямо с порта, а разрядами через транзисторные ключи по порту С
Quote (Alexandr280480)
а катодом управляю (порт С),

В файле все наоборот, но в принципе разберетесь.
Прикрепления: 7LED.pdf (21.0 Kb)


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
Сообщение отредактировал brown - Сб, 29.01.2011, 00:29
Alexandr280480 Дата: Вс, 30.01.2011, 11:34  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 96
Репутация: 0   ±
Замечания:   ±
На сайте с 23.01.2010

Статус: Offline

Всем пример, прошу взглянуть, и высказать свое мнение...Сделал именно "нулевым управлением", правда при моделировании в Протеусе, на индикаторах иногда (не всегда) проскакивает какая-то бяка, точнее нужная цифра и какой-нибудь ненужный сегмент...Может кто знает почему так происходит, кстати без транзисторных ключей, все нормально...
Прикрепления: primer.7z (24.9 Kb)


Купить за деньги может ВСЁ,
А ты попробуй сделай САМ!!!
DAlexV Дата: Вс, 30.01.2011, 12:44  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (Alexandr280480)
Может кто знает почему так происходит, кстати без транзисторных ключей, все нормально...
Протеус это симулятор. И некоторые элементы у него не имеют аналоговых характеристик. Подай например на светодиод напрямую 200 вольт и он будет светиться, хотя по логике он должен сказать пшшшш или бах. То же касаемо и проца. Так что лучше всего перестраховаться не же ли потом бежать в магазин за новым камнем. Каждый сегмент через резистор для ограничение по току, а общий(разряд) через управляющий транзистор.
Что же касаемо
Quote (Alexandr280480)
при моделировании в Протеусе, на индикаторах иногда (не всегда) проскакивает какая-то бяка, точнее нужная цифра и какой-нибудь ненужный сегмент
Это срабатывает статичность вывода в протеусе. Лечилься изменением частоты смены разрядов или гашением сегментов перед сменой разрядов. В реале этого не наблюдается.

P/S. Alexandr280480, прошу пользоваться стандартными архиваторами (WinRar, WinZip). Не у всех есть такие редкие. Успехов wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Форум Picbasic.ru » Электроника » Проблемы » Pic 16f877A и АЦП
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: