Пишем программу для Вольтметра 0-30Вольт
|
|
Gysmi |
Дата: Пн, 26.12.2011, 18:00 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
48
Замечания:
±
На сайте с 23.12.2011
Статус:
Offline
|
Нашёл простую схемку вольтметра на PIC16f676,хочу собрать на pic16f73,правда там ЦАП 8 битный Задача научиться составлять несложную программку.Надо всё разжевать и с большими подробностями написать программу,кто силён?Работаем все вместе
|
|
|
|
Gysmi |
Дата: Пн, 26.12.2011, 18:10 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
48
Замечания:
±
На сайте с 23.12.2011
Статус:
Offline
|
На 73 реально собрать?
|
|
|
|
DAY |
Дата: Вт, 27.12.2011, 00:20 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
21
Замечания:
±
На сайте с 09.03.2011
Статус:
Offline
|
Это мой вольтметр. Подсвечивает немного разряды соседние, но я его закинул пока. все просто и тупо. надо только смотреть мануал по командам. Может мне кто подскажет, как из байта записать нужный бит в конкретную ногу МК. например из %00001000 записать еденицу в porta.2
Code Define ADC_BITS 10 ' Задать число разрядов в результате Define ADC_CLOCK 3 ' Выбрать источник тактового сигнала (3 = RC) Define ADC_SAMPLEUS 50 ' Задать время преобразования в микросекундах '------------------------------------------------------------------------------ TRISA = %00000001 ' Установить PORTA TRISC = %00000000 ADCON0 = %10000001 CMCON0 = 7 ANSEL = 1 volt var Word seg var Byte cifra var Byte a var Word b var Byte c var Byte n var Byte '------------------------------------------------------------------------------ main: ADCIN 0, volt Adcin 0, a volt = (volt + a)/2 For c = 0 To 8 GoSub loop Next c GoTo main loop:
For n = 0 To 2 cifra = volt Dig n GoSub decoder pause 2 Low PORTA.5:Low PORTA.4:Low PORTC.5 PORTA = b << 1 PORTC = b >> 2 If n = 0 Then High PORTA.5:Low PORTA.4:Low PORTC.5 If n = 1 Then High PORTA.4:Low PORTA.5:Low PORTC.5 If n = 2 Then High PORTC.5:Low PORTA.5:Low PORTA.4 Next n
Return decoder: LookUp cifra, [$C0, $F9, $A4, $B0, $99, $92, $82, $F8, $80, $90, $BF, $FF ], b ' таблица 0 1 2 3 4 5 6 7 8 9 - off Return
Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.
|
|
|
|
retas |
Дата: Вт, 27.12.2011, 00:33 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
DAY!, смотри оператор GetBit (но это в Протоне!!!).
|
|
|
|
rvstar |
Дата: Вт, 27.12.2011, 00:35 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
69
Замечания:
±
На сайте с 09.10.2007
Статус:
Offline
|
OUTPUT PORTA.2 a VAR BYTE a = %00001000
PORTA.2 = a.3
Сообщение отредактировал
rvstar - Вт, 27.12.2011, 00:37
|
|
|
|
Gysmi |
Дата: Вс, 01.01.2012, 13:36 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
48
Замечания:
±
На сайте с 23.12.2011
Статус:
Offline
|
DAY,спасибо за программу! Добавлено (01.01.2012, 13.36.31) --------------------------------------------- Какое назначение переменных-a,b,c,n ? Хорошо бы ещё коментарии к каждой строке сделать
|
|
|
|
доцент2 |
Дата: Вс, 08.01.2012, 11:48 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
294
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
может и мне кто поможет. решил для вольтметра написать програмку, чтобы потренироваться. при работе на LCD все работает без проблем, а вот с LED возникли проблемы. для отображения результатов использовал трех- разрядный семи сегментный индикатор. индикация по замыслу должна работать от прерывания по таймеру 0. В качестве примера набросал схемку без делителей на входе АЦП при этом значение напряжения от 0 до 5 вольт. Для отображения точки использовал транзистор. При подключении его базы к общему выводу второго разряда последний гаснет? Далее, в протеусе симуляция длиться около 2...3 секунд и программа виснет. Может что-то упустил при "оформлении" прерывания?
|
|
|
|
Gysmi |
Дата: Вс, 08.01.2012, 18:58 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
48
Замечания:
±
На сайте с 23.12.2011
Статус:
Offline
|
А первая программка попроще будет
Сообщение отредактировал
Gysmi - Вс, 08.01.2012, 18:59
|
|
|
|
доцент2 |
Дата: Вс, 08.01.2012, 21:07 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
294
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
знаю, что проще. но я хотел на прерывании сделать динамическую индикацию. упростил немного выбор включения разряда индикатора и програмка пошла нормально работать. прошло около часа запустил в Протеусе и опять началось... работает около трех секунд и виснет. Может сам Протеус глючит, кто с этим сталкивался может подскажете в чем дело!?
|
|
|
|
ivan_fd |
Дата: Пн, 09.01.2012, 15:19 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
PicBsicPro сейчас у меня нету. Но так на первый взгляд: зачем Вы вызываете в подпрограмме прерывания, процедуру convert , которая находится в этой же процедуре прерывания? Зачем Вам Select case cifra в процедуре прерывания, сформируйте значение сегментов до прерывания.
|
|
|
|
доцент2 |
Дата: Пн, 09.01.2012, 19:49 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
294
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
у меня есть вариант такие. мне интересно было рассмотреть разные варианты, пускай и слишком мудреные. Но почему виснет программа отработав НОРМАЛЬНО 2...3 секунды. Вот это для меня пока вопрос. Может в протеусе настроить надо что-то?
|
|
|
|
ivan_fd |
Дата: Пн, 09.01.2012, 21:17 | Сообщение # 12 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Я Вам написал, что Вы сделали неправильно, и никакие это не мудреные варианты - это неправильно.
А на счет Протеуса, сейчас поставил PBP, скомпилировал. Так у меня она не виснет. Только не мешало бы вот это дописать - ansel = %00001000
Сообщение отредактировал
ivan_fd - Пн, 09.01.2012, 21:18
|
|
|
|
доцент2 |
Дата: Пн, 09.01.2012, 22:10 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
294
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
ivan_fd Я скачал перевод даташид на pic16f676, там в ANSEL записали все что относиться к ADCON1 поэтому у меня и закралась ошибочка. СПАСИБО ОГРОМНОЕ, теперь работает. А что касается текста програмки - если заработала значит все правильно, просто некрасиво написано и если проект серьезный могут вылезти неприятности. На данном этапе я просто хотел разобраться с таймером. Если интересно вот более лучший вариант (интересно ваше мнение).
|
|
|
|
ivan_fd |
Дата: Пн, 09.01.2012, 23:55 | Сообщение # 14 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Немного лучше но все же, в прерывании делать паузы pauseus 1500 не хорошо. Вы в прерывании выводите все три цифры за одно прерывание, а нужно выводить сначала одну, потом вторую, третью и снова сначала. Удачи!
|
|
|
|
доцент2 |
Дата: Ср, 11.01.2012, 22:18 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
294
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
собрал вольтметр в железе на макетке. программа без прерываний. в протеусе все работает нормально, а в железе не хочет. на индикаторе постоянно высвечивается "4.5". при замыкании входа АЦП (вывод 3) на массу - "0.0". при подключении батарейки на 3V к делителю - схема вообще не реагирует, а непосредственно к выводу АЦП показывает значения примерно 18.6. регулировка подстроечником на показания почти не влияет. пробовал два контроллера результат один и тотже. подскажите в чем может быть причина.
|
|
|
|