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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: ivan_fd  
Вольтметр на pic16F676
monlis Дата: Пт, 02.04.2010, 20:57  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 17.03.2010

Статус: Offline

Господа программисты помогите новенькому освоить этот маленький контроллер ! Надо на picbasic написать программу для этого ! Помогите кто чем может ! Даташит есть на него русский ! Я не могу организовать 7-и битную шину для него ! Результат надо вывести на 3-х сегментный индикатор Е 30361 Вот схема !
Прикрепления: 7311020.jpg (54.7 Kb)
ЯНДЕКС Дата: 02.04.2010
brown Дата: Пт, 02.04.2010, 23:02  |                                                                                                                Сообщение # 2
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

monlis, у нас на форуме заведено рисовать схемы в Proteus, чтобы можно было проверить работоспособность программы. Советую всем новичкам придерживаться этого правила!
По поводу вопроса: попробуйте проанализировать и подогнать под свою задачу этот проект


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
vv Дата: Сб, 03.04.2010, 23:51  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 132
Репутация: 6   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 2   ±
Замечания:   ±
На сайте с 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
Репутация: 17   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Я пытаюсь освоить АЦП в PIC. Смотрел много в интернете проектов вольтметра. Не могу понять алгоритм измерения вольт при помощи PIC.
Надеюсь на Вашу помошь уважаемые форумчане.
А именно мне не понятно как замерять от 0 до 200 вольт напряжение если на ножку контролёра нельзя подавать такое количество напряжения.
Подозреваю что нужна какая то схема подключения.
Есле же надо "срубать" напряжение, то как подбирается формула для вывода точных данных на, для простоты пока на LCD?
Вот как то так.
С уважением Alexej79.
Romario4840 Дата: Вт, 19.07.2011, 00:49  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 23
Репутация: 0   ±
Замечания:   ±
На сайте с 26.06.2009

Статус: Offline

Alexej79 Вам бы до МК книги по радиоэлектронике почитать. Вопрос решается делителем напряжения из резисторов.
mikhail09p Дата: Вт, 19.07.2011, 09:50  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

monlis,вот рабочий проэкт. Запустите в Протеусе и увидите, как он работает. Это вольтметр, амперметр.
Пришлось повозится из Float , Word. Памяти контроллера не хватало.
Прикрепления: _676.rar (86.7 Kb)
Alexej79 Дата: Вт, 19.07.2011, 23:01  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Quote (Romario4840)
Alexej79 Вам бы до МК книги по радиоэлектронике почитать

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

Теперь остаётся актуальным вопрос как полученные данные от АЦП преобразовать в число соответствующее вольтам и вывести на LCD?

Прикрепления: 9416464.jpg (16.7 Kb)
ADMIN Дата: Ср, 20.07.2011, 07:59  |                                                                                                                Сообщение # 11
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

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

Кстати, работает до сих пор без проблем
Прикрепления: 7204135.jpg (132.7 Kb)
ЯНДЕКС Дата: 20.07.2011
mikhail09p Дата: Ср, 20.07.2011, 13:25  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (Alexej79)
Теперь остаётся актуальным вопрос как полученные данные от АЦП преобразовать в число соответствующее вольтам и вывести на LCD?

Alexej79, а что, не судьба программу посмотреть, там как раз LСD? wacko
Alexej79 Дата: Ср, 20.07.2011, 20:03  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Quote (mikhail09p)
не судьба программу посмотреть

Программу то посмотреть не составило труда, а вот разобраться что к чему вот тут не судьба.
Непонятно как преобразовать данные полученые с АЦП в данные для вывода на LCD в виде вольт.
Вот строчка, как я понял, с той программы которая делает преобразование.
Code
U = U / 2        '    30 вольт

У меня так ничего не выходит пишет неточные данные.
Набросал проект на МК 18F2550. И что интересно работает в протеусе. Странно но я невключил АЦП.
Выкладываю файлы.

Изменил разряднось АЦП с 10 на 8 и стало вроде совподать, но всё одно не точно. Да и коофицент деления поставил 50,6 (тупо слизал с другой программы)
Прикрепления: ADC.bas (1.8 Kb) · start.dsn (95.0 Kb)

Сообщение отредактировал Alexej79 - Ср, 20.07.2011, 22:46
mikhail09p Дата: Пт, 22.07.2011, 19:47  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Спасибо за кусок программы. Вроде как начинаю разбираться.
Как я заметил вот эти три строчки
Code

Declare Adin_Res 12 ' 10-bit result required  
Declare Adin_Tad FRC ' RC OSC chosen  
Declare Adin_Stime 50

Это дублируются те параметры которые устанавливаются по умолчанию. Я их с программы выкинул. Без них работает. Не знаю правильно ли это или нет?
Вот с этим написанием тоже не понятно.
Code

ADCON1 = %10000010

Много раз встречал такое написание, но так и не разобрался что к чему. Есть лёгкие намёки только. Если возможно поподробнее буду очень признателен.
В своей программе я вообще каким то непонятным образом обошёлся без конфигурации регистров ADCON0, ADCON1, ADCON2.
Пологаю что они по умолчанию тоже установленны и для моих условий этого достаточно.

Вот в этом месте я прописываю не 1024,
Code

II=1024

а 65535. Почему так, пока объяснить затрудняюсь. Думаю это зависит от разрядности АЦП, но я могу и ошибаться.
Ну и ещё никак не могу подобрать правильные номиналы резисторов для деления напряжения по формуле в посте 10 в этой ветке.
Нужно измерять входящее напряжение до 25 воль и ток до 1 А.
Ещё раз всем спасибо.
С уважением Alexej79
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: