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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ivan_fd  
Pic Basic pro для начинающих
ivan_fd Дата: Вт, 27.09.2011, 10:14  |                                                                                                                Сообщение # 676
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (доцент2)
OWOut PORTB.7, 1, [$CC, $44] ' Start (посылаем импульс
' сброса измерительного устройства и запуск преобразования)

Где Вы в этой строчке видите импульс сброса?
Quote (доцент2)
зачем городить забор из прерываний?


Какие прерывания, Вы о чем?

Quote (доцент2)
если нужна задержка для работы измерителя, то можно ли просто поставить паузу?


Можно поставить паузу в соответсвии с розрядностью.
ivan_fd Дата: Вт, 27.09.2011, 10:32  |                                                                                                                Сообщение # 677
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Специально для Вас написал, с проектом Протеуса. Разрядность 9 бит.

В коде init1820: и есть процедура инициализации, импульс сброса и т .....
Прикрепления: 3464882.zip (56.0 Kb)

Сообщение отредактировал ivan_fd - Вт, 27.09.2011, 10:33
ADMIN Дата: Вт, 27.09.2011, 10:49  |                                                                                                                Сообщение # 678
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

В даташите указано, что после команды $4E нужно послать импульс сброса.
Вот здесь пример, правда на не русском. Уверен - дело в этом импульсе, тоже когда-то мучался, но потом разобрался. Правда проект тот найти не могу.
доцент2 Дата: Ср, 28.09.2011, 16:00  |                                                                                                                Сообщение # 679
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

да вот ини прерывания
write1820:
; T0IE = 0 ' Виключити переривання по TMR0 For i = 1 To 8 ' 8 bits to a byte
If command.0 = 0 Then
GoSub write0 ' Write a 0 bit
Else
GoSub write1 ' Write a 1 bit
EndIf
command = command >> 1 ' Shift to next bit
Next i
; T0IE = 1 ' Виключити переривання по TMR0
Return

спасибо всем буду разбираться.

Добавлено (28.09.2011, 15.59.57)
---------------------------------------------
посмотрев примеры выдернул несколько кусков:
предположим мне надо считать данные с измерителя только один раз подключенного к пин 7 PORTB.
1. это инициализация
init_DS18S20:
Output PORTB.7 ' Make Pin Output
PORTB.7=0 ' OneWire line Low
PauseUs 480 ' Keep down for 480 µS
Input PORTB.7 ' Make Pin Input
PauseUs 70 ' Wait 70 µS
2. конфигурирование
OWOUT DQ, 1, [$CC,$4E, 0, 0, $3F]' допустим для 10 битного преобразования
3. читаем данные
OWOut PORTB.7, 1, [$CC, $44]
OWOut PORTB.7, 1, [$CC, $BE] 'команда на считывание памяти (первые два байта)

OWIn PORTB.7, 0, [temperatura.LOWBYTE, temperatura.HIGHBYTE]
4. расчет результата...(для каждой размерности преобразования свои расчеты)
в протеусе читает как 12 битное преобразование.
правильная ли последовательность или я чего-то упустил? может это протеус не впорядке?

Сообщение отредактировал доцент2 - Ср, 28.09.2011, 16:02
MasterPic Дата: Ср, 28.09.2011, 16:15  |                                                                                                                Сообщение # 680
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 186
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Ты после строки
OWOUT DQ, 1, [$CC,$4E, 0, 0, $3F]' допустим для 10 битного преобразования
сделай еще раз это:

Output PORTB.7 ' Make Pin Output
PORTB.7=0 ' OneWire line Low
PauseUs 480 ' Keep down for 480 µS
Input PORTB.7 ' Make Pin Input
PauseUs 70 ' Wait 70 µS

И в протеусе смотри в меню debug - scratchpad термодатчика, меняются ли данные.
доцент2 Дата: Ср, 28.09.2011, 18:47  |                                                                                                                Сообщение # 681
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

сделал меняется байт (см.рисунок)
для 9 bit 1F - 31
для 10 bit 3F - 63
для 11 bit 5F - 95
для 12 bit 7F - 127

в программе расчет забит под 12 бит, и при изменении конфигурации по
идеи показания индикатора должны меняться, а этого не происходит.
(расчет под другую размерность я хочу зобить после того как смогу переключить этот измеритель).

сейчас попробовал использовать только одну строчку
OWOUT PORTB.7, 1, [$CC, $4E, 0, 0, $7F]
без дополнительной инициализации
биты меняются так же, а значение индикатора остается таким же как и при 12 бит.
Прикрепления: 4495242.jpg (130.7 Kb)

Сообщение отредактировал доцент2 - Ср, 28.09.2011, 19:04
ЯНДЕКС Дата: 28.09.2011
ivan_fd Дата: Ср, 28.09.2011, 19:01  |                                                                                                                Сообщение # 682
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (доцент2)
правильная ли последовательность или я чего-то упустил? может это протеус не впорядке?


Не правильно!!! Вы смотрели пример который я Вам дал?

gosub init1820
OWOUT DQ, 1, [$CC,$4E, 0, 0, $3F]' допустим для 10 битного преобразования
gosubinit1820 ' ВОТ ЭТО ДОЛЖНО БЫТЬ
OWOut PORTB.7, 1, [$CC, $44]
OWOut PORTB.7, 1, [$CC, $BE] 'команда на считывание памяти (первые два байта)

OWIn PORTB.7, 0, [temperatura.LOWBYTE, temperatura.HIGHBYTE]

init1820:

PORTB.7 0
DelayUS 500 ' Wait > 480us
Input PORTB.7 ' Release data pin (set to input for high)
DelayUS 100 ' Wait > 60us
Return
доцент2 Дата: Ср, 28.09.2011, 19:13  |                                                                                                                Сообщение # 683
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

это я попробовал в первую очередь, эффект почему-то такой же.
может в протеусе, что-то не так?
вот сам текст программы. конфигурация для 9-бит,
а счет для 12-бит, но показания индикатора как при 12 бит.

@ device pic16F84A
define osc 4
Cnt var word 'переменная счета
Digit var byte '
Pattern var byte 'переменная для хранения 7-ми сегментного кода
odin var byte 'переменная для хранения 7-ми сегментного кода для первого разряда
dva var byte 'переменная для хранения 7-ми сегментного кода для второго разряда
tri var byte 'переменная для хранения 7-ми сегментного кода для третьего разряда
chetire var byte 'переменная для хранения 7-ми сегментного кода для четвертого разряда
digit1 var porta.0 ' 1-й разряд индикатора
digit2 var porta.1 ' 2-й разряд индикатора
digit3 var porta.2 ' 3-й разряд индикатора
digit4 var porta.3 ' 4-й разряд индикатора
dit var byte ' промежуточная переменная для гашения незначащих нулей
i var byte
'+++++++++++++++++++++ переменные температуры ++++++++++++++++++++++++++++++++++
temperatura Var word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' значение, оставшееся в счетчике в конце измерения
count_per_c Var Byte ' количество импульсов на один градус для данной температуры
control_izmer var byte
Temperatuta_ostatok var byte
Temperatuta_znak var byte
Temp var word
terme var byte
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TRISA=0 'устанавливаем все выводы порта А на выход
TRISB=$80 'устанавливаем выводы порта В с 0 по 6 на выход, 7 на вход
'**************** Прерывания **************
INTCON=%10100000 'разрешить все прерывания и прерывание по переполнению таймера TMR0
OPTION_REG=%10000000 'подключить предделитель с коэффициентом 1:1
TMR0=100 'инициализация таймера (значение таймера Freq=6 410,25641Hz; Period=0,156 ms)

on interrupt goto Isr'при возникновении прерывания перейти на метку Isr
INTCON=%10100000 'включить прерывания по переполнению TMR0
Loop:
'+++++++++++++++++++++ измерение температуры +++++++++++++++++++++++++++++++++++
gosub init_DS18S20
OWOUT PORTB.7, 1, [$CC,$4E, 0, 0, $1F]' для 9 битного преобразования
gosub init_DS18S20
OWOut PORTB.7, 1, [$CC, $44] ' Start (посылаем импульс
' сброса измерительного устройства)
proverka:
owin PORTB.7,4,[control_izmer] 'проверяем, не закончился ли процесс измерения
if control_izmer=0 then proverka
OWOut PORTB.7, 1, [$CC, $BE] 'команда на считывание памяти (первые два байта)

'+++++++++++++++++++ процедура пересчета температуры ++++++++++++++++++++++++
'++++++++++++++++++++++++++ DS18B20 ++++++++++++++++++++++++++++++++++
'+++++++++++++++ 12-ти битовое представление температуры +++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
OWIn PORTB.7, 0, [temperatura.LOWBYTE, temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]
Temperatuta_znak=temperatura.Bit12 ' определяем знак температуры, если 0 то "+", 1 то "-"
if Temperatuta_znak=0 then
temperatura = 10*(temperatura>>3)/2 ' если "+" то расчет ведется так (точность до 0.5)
else
temperatura =5+10*((temperatura^$ffff)>>3)/2 ' если "-" то расчет ведется так (точность до 0.5)
endif

pause 1
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++ сдесь блок по "расчленению" изренной темпер. ++++++++++++++++++
+++++++++++ на отдельные цифры , типа первая, вторая и т.д.+++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
goto loop
'++++++++++++++++++ инициализация измерителя ++++++++++++++++++++++++
init_DS18S20:
Output PORTB.7 ' Make Pin Output
PORTB.7=0 ' OneWire line Low
PauseUs 500 ' Keep down for 500 µS
Input PORTB.7 ' Make Pin Input
PauseUs 100 ' Wait 100 µS
return
'************ отключаем обработку прерывания ***************
disable
Isr:
TMR0=100 ' значение таймера Freq=6 410,25641Hz; Period=0,156 ms

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++ сдесь блок вывода на динамич.индикацию ++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INTCON.2=0 'флаг прерывания по переполнению (0-переполнение было;
'1-произошло переполнение TMR0 [сброс програмно])
resume 'возврат к основной программе откуда она была выведена для
'для обработки прерывания
enable 'включить обработку прерывания

convert:
lookup Digit,[$40,$79,$24,$30,$19,$12,$02,$78,$00,$10,$7f,$3f], Pattern
return
end

Сообщение отредактировал доцент2 - Ср, 28.09.2011, 20:12
доцент2 Дата: Ср, 28.09.2011, 20:58  |                                                                                                                Сообщение # 684
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

вот еще одна картинка
Прикрепления: 1581900.jpg (121.6 Kb)
ivan_fd Дата: Ср, 28.09.2011, 23:30  |                                                                                                                Сообщение # 685
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Вы можете прикрепить полностью проект? С файлами Протеуса.
MasterPic Дата: Чт, 29.09.2011, 08:08  |                                                                                                                Сообщение # 686
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 186
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

если в протеусе меняются байты скратчпад, то попробуй считать его в какую нибудь переменную. Если считается тот, что записан, то, наверное модель датчика глючит
доцент2 Дата: Чт, 29.09.2011, 15:51  |                                                                                                                Сообщение # 687
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

что значит считать в переменную? считать из памяти датчика?
а потом как я ее посмотрю. к сожалению PICBasic это не VisualBasic
где можно в процессе отладки посмотреть содержание любой переменной.
я пока не знаю может в протеусе можно переменные посмотреть?
не получается прикрепить файл протеуса, пишет "не допустимый формат изображения"

Сообщение отредактировал доцент2 - Чт, 29.09.2011, 15:56
ivan_fd Дата: Чт, 29.09.2011, 16:27  |                                                                                                                Сообщение # 688
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

На файлообменник положите.
доцент2 Дата: Чт, 29.09.2011, 18:13  |                                                                                                                Сообщение # 689
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 293
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

я ни когда не выкладывал ничего на файлообменники, поэтому не знаю как.
MasterPic Дата: Чт, 29.09.2011, 19:07  |                                                                                                                Сообщение # 690
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 186
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Quote (доцент2)
что значит считать в переменную? считать из памяти датчика? а потом как я ее посмотрю. к сожалению PICBasic это не VisualBasic где можно в процессе отладки посмотреть содержание любой переменной. я пока не знаю может в протеусе можно переменные посмотреть? не получается прикрепить файл протеуса, пишет "не допустимый формат изображения"


Да, считать из памяти датчика и вывести на индикатор. Это же не трудно. Так можно понять - или некорректно записывается в датчик, или сам датчик не реагирует на изменение конфигурационного регистра(точнее, модель датчика в протеусе).
Если писать в протоне, то в протеусе можно смотреть значения переменных при отладке
Поиск: