Вольтметр на pic16F676
|
|
monlis |
Дата: Пт, 02.04.2010, 20:57 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 17.03.2010
Статус:
Offline
|
Господа программисты помогите новенькому освоить этот маленький контроллер ! Надо на picbasic написать программу для этого ! Помогите кто чем может ! Даташит есть на него русский ! Я не могу организовать 7-и битную шину для него ! Результат надо вывести на 3-х сегментный индикатор Е 30361 Вот схема !
|
|
|
|
brown |
Дата: Пт, 02.04.2010, 23:02 | Сообщение # 2 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
monlis, у нас на форуме заведено рисовать схемы в Proteus, чтобы можно было проверить работоспособность программы. Советую всем новичкам придерживаться этого правила! По поводу вопроса: попробуйте проанализировать и подогнать под свою задачу этот проект
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
vv |
Дата: Сб, 03.04.2010, 23:51 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
132
Замечания:
±
На сайте с 13.11.2009
Статус:
Offline
|
В программе пишешь функцию, которая в зависимости от значения разряда "зажигает " нужную цифру. Я бы писал примерно так Code
Symbol A = PORTC.0 SYMBOL B = PORTC.1 SYMBOL C = PORTC.2 SYMBOL D = PORTC.3 SYMBOL E = PORTC.4 SYMBOL F = PORTC.5 SYMBOL G = PORTA.5 SYMBOL Seg1 = PORTA.0 SYMBOL Seg2 = PORTA.1 SYMBOL Seg3 = PORTA.2 N var byte
TRISC = %00000000 TRISA = %00001000
main: Seg1=0 seg2=1 seg3=1 gosub Decod
Seg1=1 seg2=0 seg3=1 gosub Decod
Seg1=1 seg2=1 seg3=0 gosub Decod
goto main
Decod: select case N case 0 A=0 B=0 C=0 D=0 E=0 F=0 G=1 case 1 A=0 B=1 C=1 D=0 E=0 F=0 G=0 case 2 A=1 B=1 C=1 D=1 E=0 F=0 G=1 case 4
case 5
case 6
case 7
case 8
case 9
end select Return
END
Получаешь значение разряда, включаешь нужный разряд Seg и декодируешь в подпрограмме... Сложностей никаких...
|
|
|
|
monlis |
Дата: Пн, 05.04.2010, 19:59 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 17.03.2010
Статус:
Offline
|
Ув. brown извените за мою картинку но с протеусом я ещё на знакомился пока, но я наверстаю ! Огромное спасибо vv за вариант обдумаю его ! Добавлено (05.04.2010, 19.59.39) --------------------------------------------- Товарищи ! Написал прогу просто отображение числа 123 на индикаторе! Но в пиксимуляторе переключаються все сегменты 111,222,333 как заставить его работать правильно ??? Помогите ! Вот прога! OPTION_REG = %10001000 DEFINE OSC 4 SYMBOL C = PORTC SYMBOL A5 = PORTA.5 N var byte W0 VAR BYTE TRISC = %000000 TRISA = %001000 main: W0 = 123 N = W0 DIG 0 PORTA.0 = 0 PORTA.1 = 1 PORTA.2 = 1 gosub Decod N = W0 DIG 1 PORTA.0 = 1 PORTA.1 = 0 PORTA.2 = 1 gosub Decod N = W0 DIG 2 PORTA.0 = 1 PORTA.1 = 1 PORTA.2 = 0 gosub Decod goto main Decod: select case N case 0 C = %111111 A5 = 0 case 1 C = %000110 A5 = 0 case 2 C = %011011 A5 = 1 CASE 3 C = %001111 A5 = 1 case 4 C = %100110 A5 = 1 case 5 C = %011011 A5 = 1 case 6 C = %111101 A5 = 1 case 7 C = %000111 A5 = 0 case 8 C = %111111 A5 = 1 case 9 C = %101111 A5 = 1 end select Return END
|
|
|
|
Yrok |
Дата: Пн, 05.04.2010, 21:15 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Привет всем!! monlis, а скажите уважаемый кто за вас будет гасить сегменты и делать паузы???? Во первых принято сначала загонять отображаемый символ , а уж потом засвечивать разряд, т.е. в вашем случае вот эту строку gosub Decod лучше разместить за N = W0 DIG 0 (по остальным разрядам то же самое). А во вторых после того как вы зажжете сегмент --нужно сделать паузу примерно 20-30 мсек(это делается для того чтобы глаз нормально зафиксировал картинку--зрение у нас такое) --потом желательно потушить сегмент--сделать опять паузу 50-100 мсек(время не горения должно быть больше времени горения) и уже потом зажигать следующий сегмент --предварительно загнав на разряды новый символ--вот так то. P.S. Паузы на горения и не горения можно подобрать для исключения эффекта моргания.
|
|
|
|
terrarus |
Дата: Вт, 06.04.2010, 09:26 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
monlis, все что описал уважаемый Yrok абсолюно верно, а называется это все "динамической индикацией". Для того чтобы сделать индикацию на семисегментных светодиодных индикторах нужно понимать как это должно работать. Однако начинающему достаточно сложно в этом разобраться, поэтому настоятельно советую Вам использовать жидкокристаллические знакоразрядные (ЖКИ или они еще называются LCD) индикаторы типа WH1602 или DV-1624 - по 16 алфвитно-цифровых знаков в двух строках, или им подобдные. При первоначально кажущейся сложности они проще в выводе на них информации примерно раз в 100 по сравнению с 7-сегментными, для начинающего просто кладезь. Очень хорошо описан вывод информации на ЖКИ в книге Чака Хелибайка ПРОГРАММИРОВАНИЕ PIC-МИКРОКОНТРОЛЛЕРОВ НА PicBasic, или а книге В. Хилинского Программирование PIC-контроллеров, или в переводе мануала PicBasic Pro компилятор Кострикова С. Все эти книги есть на нашем сайте в каталоге файлов. Скачайте их. Это все книги по программированию на PicBasicPRO. Можно еще посмотреть на ресурсе http://terrarus.ucoz.ru/proton_plus_ide/index.html . Здесь в свободном доступе находится книга которую я Анатолий Медведев и Владимир Хилинский еще только пишем, но готовые её части уже доступны для всех. И называется она " Программирование PIC-микроконтроллеров в PROTON+IDE на PicBasic ". PROTON+IDE на PicBasic это один из диалектов языка Basic, логическое продолжение PicBasicPRO. Здесь очень много примеров по использованию ЖКИ. И всего другого. Успехов в освоении!
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Вт, 06.04.2010, 09:32
|
|
|
|
Alexej79 |
Дата: Пн, 18.07.2011, 23:13 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Я пытаюсь освоить АЦП в PIC. Смотрел много в интернете проектов вольтметра. Не могу понять алгоритм измерения вольт при помощи PIC. Надеюсь на Вашу помошь уважаемые форумчане. А именно мне не понятно как замерять от 0 до 200 вольт напряжение если на ножку контролёра нельзя подавать такое количество напряжения. Подозреваю что нужна какая то схема подключения. Есле же надо "срубать" напряжение, то как подбирается формула для вывода точных данных на, для простоты пока на LCD? Вот как то так. С уважением Alexej79.
|
|
|
|
Romario4840 |
Дата: Вт, 19.07.2011, 00:49 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
23
Замечания:
±
На сайте с 26.06.2009
Статус:
Offline
|
Alexej79 Вам бы до МК книги по радиоэлектронике почитать. Вопрос решается делителем напряжения из резисторов.
|
|
|
|
mikhail09p |
Дата: Вт, 19.07.2011, 09:50 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
monlis,вот рабочий проэкт. Запустите в Протеусе и увидите, как он работает. Это вольтметр, амперметр. Пришлось повозится из Float , Word. Памяти контроллера не хватало.
|
|
|
|
Alexej79 |
Дата: Вт, 19.07.2011, 23:01 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Quote (Romario4840) Alexej79 Вам бы до МК книги по радиоэлектронике почитать Спасибо за "информативный" ответ. Весь день сегодня почитал статьи по радиоэлектронике. С делителем напряжения разобрался. Нашёл формулу расчёта, схему подключения и всё такое. Мож кому пригодится. Теперь остаётся актуальным вопрос как полученные данные от АЦП преобразовать в число соответствующее вольтам и вывести на LCD?
|
|
|
|
ADMIN |
Дата: Ср, 20.07.2011, 07:59 | Сообщение # 11 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Вот здесь проект - двухканальный измеритель напряжения - мой бывший начальник создал силовую часть блока питания, я сделал к нему индикацию - плюс-минус 15 вольт. Правда, это было уже давно. И на комментарии я тогда мало обращал внимания. Если надо, попробую вспомнить и написать. Вот так он выглядел: Кстати, работает до сих пор без проблем
|
|
|
|
mikhail09p |
Дата: Ср, 20.07.2011, 13:25 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (Alexej79) Теперь остаётся актуальным вопрос как полученные данные от АЦП преобразовать в число соответствующее вольтам и вывести на LCD? Alexej79, а что, не судьба программу посмотреть, там как раз LСD?
|
|
|
|
Alexej79 |
Дата: Ср, 20.07.2011, 20:03 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Quote (mikhail09p) не судьба программу посмотреть Программу то посмотреть не составило труда, а вот разобраться что к чему вот тут не судьба. Непонятно как преобразовать данные полученые с АЦП в данные для вывода на LCD в виде вольт. Вот строчка, как я понял, с той программы которая делает преобразование. У меня так ничего не выходит пишет неточные данные. Набросал проект на МК 18F2550. И что интересно работает в протеусе. Странно но я невключил АЦП. Выкладываю файлы.
Изменил разряднось АЦП с 10 на 8 и стало вроде совподать, но всё одно не точно. Да и коофицент деления поставил 50,6 (тупо слизал с другой программы)
Сообщение отредактировал
Alexej79 - Ср, 20.07.2011, 22:46
|
|
|
|
mikhail09p |
Дата: Пт, 22.07.2011, 19:47 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Device = 16F874A Declare Xtal 20 Declare LCD_DTPin PORTB.4 Declare LCD_ENPin PORTB.1 Declare LCD_RSPin PORTB.0 Declare LCD_Lines 2 Declare Adin_Res 12 ' 10-bit result required Declare Adin_Tad FRC ' RC OSC chosen Declare Adin_Stime 50 Dim I As Dword ' Ток Dim U As Dword ' Напряжение Dim In1 As Float Dim Un1 As Float Dim II As Word ' Create adval to store result Dim In As Word Dim UU As Word ' Create adval to store result Dim Un As Word
TRISA = %11111111 ' Установка PORTA все входы ADCON1 = %10000010 II=1024 In=5 ' Максимальное значение тока In1 = II/In UU=1024 Un=50 ' Максимальное значение напряжения Un1 = UU/Un
loop: I = ADIn 0 ' Чтение АЦП А.0 U = ADIn 1 ' Чтение АЦП А.1
TempI = I / In1 TempU = U / Un1 Print At 1, 1, "I=",Dec TempI, "A " ,"U=",Dec TempU,"V" GoTo loop
Вот, разбирайтесь. Тут немного есть лишних переменных, но зато так яснЕй, что для чего.
|
|
|
|
Alexej79 |
Дата: Сб, 23.07.2011, 13:43 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Спасибо за кусок программы. Вроде как начинаю разбираться. Как я заметил вот эти три строчки Code Declare Adin_Res 12 ' 10-bit result required Declare Adin_Tad FRC ' RC OSC chosen Declare Adin_Stime 50 Это дублируются те параметры которые устанавливаются по умолчанию. Я их с программы выкинул. Без них работает. Не знаю правильно ли это или нет? Вот с этим написанием тоже не понятно. Много раз встречал такое написание, но так и не разобрался что к чему. Есть лёгкие намёки только. Если возможно поподробнее буду очень признателен. В своей программе я вообще каким то непонятным образом обошёлся без конфигурации регистров ADCON0, ADCON1, ADCON2. Пологаю что они по умолчанию тоже установленны и для моих условий этого достаточно.
Вот в этом месте я прописываю не 1024, а 65535. Почему так, пока объяснить затрудняюсь. Думаю это зависит от разрядности АЦП, но я могу и ошибаться. Ну и ещё никак не могу подобрать правильные номиналы резисторов для деления напряжения по формуле в посте 10 в этой ветке. Нужно измерять входящее напряжение до 25 воль и ток до 1 А. Ещё раз всем спасибо. С уважением Alexej79
|
|
|
|