Pic Basic pro для начинающих
|
|
ivan_fd |
Дата: Вт, 27.09.2011, 10:14 | Сообщение # 676 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Специально для Вас написал, с проектом Протеуса. Разрядность 9 бит.
В коде init1820: и есть процедура инициализации, импульс сброса и т .....
Сообщение отредактировал
ivan_fd - Вт, 27.09.2011, 10:33
|
|
|
|
ADMIN |
Дата: Вт, 27.09.2011, 10:49 | Сообщение # 678 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
В даташите указано, что после команды $4E нужно послать импульс сброса. Вот здесь пример, правда на не русском. Уверен - дело в этом импульсе, тоже когда-то мучался, но потом разобрался. Правда проект тот найти не могу.
|
|
|
|
доцент2 |
Дата: Ср, 28.09.2011, 16:00 | Сообщение # 679 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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 бит.
Сообщение отредактировал
доцент2 - Ср, 28.09.2011, 19:04
|
|
|
|
ivan_fd |
Дата: Ср, 28.09.2011, 19:01 | Сообщение # 682 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
вот еще одна картинка
|
|
|
|
ivan_fd |
Дата: Ср, 28.09.2011, 23:30 | Сообщение # 685 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Вы можете прикрепить полностью проект? С файлами Протеуса.
|
|
|
|
MasterPic |
Дата: Чт, 29.09.2011, 08:08 | Сообщение # 686 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
если в протеусе меняются байты скратчпад, то попробуй считать его в какую нибудь переменную. Если считается тот, что записан, то, наверное модель датчика глючит
|
|
|
|
доцент2 |
Дата: Чт, 29.09.2011, 15:51 | Сообщение # 687 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
что значит считать в переменную? считать из памяти датчика? а потом как я ее посмотрю. к сожалению PICBasic это не VisualBasic где можно в процессе отладки посмотреть содержание любой переменной. я пока не знаю может в протеусе можно переменные посмотреть? не получается прикрепить файл протеуса, пишет "не допустимый формат изображения"
Сообщение отредактировал
доцент2 - Чт, 29.09.2011, 15:56
|
|
|
|
ivan_fd |
Дата: Чт, 29.09.2011, 16:27 | Сообщение # 688 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
На файлообменник положите.
|
|
|
|
доцент2 |
Дата: Чт, 29.09.2011, 18:13 | Сообщение # 689 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
я ни когда не выкладывал ничего на файлообменники, поэтому не знаю как.
|
|
|
|
MasterPic |
Дата: Чт, 29.09.2011, 19:07 | Сообщение # 690 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Quote (доцент2) что значит считать в переменную? считать из памяти датчика? а потом как я ее посмотрю. к сожалению PICBasic это не VisualBasic где можно в процессе отладки посмотреть содержание любой переменной. я пока не знаю может в протеусе можно переменные посмотреть? не получается прикрепить файл протеуса, пишет "не допустимый формат изображения"
Да, считать из памяти датчика и вывести на индикатор. Это же не трудно. Так можно понять - или некорректно записывается в датчик, или сам датчик не реагирует на изменение конфигурационного регистра(точнее, модель датчика в протеусе). Если писать в протоне, то в протеусе можно смотреть значения переменных при отладке
|
|
|
|