Пост N: 103
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 19:08. Заголовок: Re:
Alberto пишет:
цитата:
Зачем Вам их сдвигать влево?
При измерении минусовой температуры происходит ошибка с половинками градуса, это третий бит LSB, а он, теряется при преобразовании в положительное число, или, преобразуется не корректно. Выше, об этом уже писалось, просмотрите всю тему. А вообще, этот вопрос уже решен, только другим способом, но и этот вариант интересен, если увеличить точность
Пост N: 117
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 30.03.07 19:47. Заголовок: Re:
vintik пишет:
цитата:
это третий бит LSB, а он, теряется при преобразовании в положительное число
почему? Вот кусок кода
SDVIG: clrf Flag ; Очистить регистр флагов btfsc Temp_LSB,3 ; Определить знак температуры. Бит 3 регистра Temp_LSB равен "0"? bsf Flag,0 ; "НЕТ" - установить признак отрицательной температуры (бит 3 = "1") ; "ДА" - программа выполняется дальше bcf Temp_LSB,0 ; Обнулить биты 0-3 регистра Temp_LSB bcf Temp_LSB,1 ; bcf Temp_LSB,2 ; bcf Temp_LSB,3 ;
swapf Temp_LSB,F ; Поменять местами полубайты байта Temp_LSB swapf Temp_MSB,W ; Поменять местами полубайты байта Temp_MSB с сохранением ; результата в регистре W
addwf Temp_LSB,F ; Сложить значение в регистре Temp_LSB с содержимым ; регистра W с сохранением результата в нем же, т.е. ; своеобразный аналог четырех сдвигов вправо обоих регистров
где видно что сначала определяется признак наличия половинки градуса и при его наличии выставляется флаг (bsf Flag,0). Другое дело что текст описания не откорректирован, это моя вина, просто как я уже писал Винда у меня испанская и в MPLAB'е у меня вот такая картинка и ничего поделать не могу (компьютер на работе, винда лицензионная, испанская). Как Вы проверяли программу? Я прогнал в MPLAB'е, никаких проблем. Ничего не теряется. Вкратце опишу процедуру преобразования отрицательных чисел (считаем что по биту 7 байта Temp_MSB знак уже определен): имеем -25,0625 - это 1111 1110 0110 11111 инвертируем его: 0000 0001 1001 0000 инкрементируем: 0000 0001 1001 0001 определяем наличие половинки градуса (бит 3 байта Temp_LSB, выделено красным), выставляем признак наличия (bsf Flag,0), меняем местами тетрады обоих байтов: 0001 0000 0001 1001, из них берем то, что выделено красным, получаем 0001 1001 - это 25. Где Вы увидели потерю половинки байта? Проделайте те же процедуры для любого другого значения... и привидите мне аргументированное (с примерами) возражение. Еще раз прошу прощения за то, что не исправил комментарии, но это объективные причины и тут я бессилен.
Пост N: 104
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 20:49. Заголовок: Re:
Не знаю что происходит, но, при охлаждении датчика температура высвечивается в порядке: -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 В исходнике (DS1820.asm) такого нет, работает корректно: -1,0 -1,5 -2,0 -2,5 -3,0 -3,5
Поверте мне наслово.
И дело не в комментариях, а в работе, извините, если чемто огорчил, но в математике пока никакой, надеюсь пока
Пост N: 105
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 21:25. Заголовок: Re:
RW1ZK, вот ссылка на адаптированный под DS18B20 исходник, попробуйте его, что он Вам покажет, и сравните с работой сегоднешнего. Я свой охлаждал в морозилке, или нагревал паяльником.
Пост N: 30
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 30.03.07 21:28. Заголовок: Re:
vintik пишет:
цитата:
А чтож верно, Вы в морозилку датчик помещали!??
Увы, нет. Конструкция осталась на служебном месте и проверить смогу только в понедельник вечером. Таблица кодировки отрицательных чисел следующая: -0.5 -> FFF8H -1.0 -> FFF0H -1.5 -> FFE8H -2.0 -> FFE0H -2.5 -> FFD8H -3.0 -> FFD0H И так далее... Ниже злополучный кусок кода. Подставляя в Temp_MSB и Temp_LSB значения от FFF8H и меньше всё получается верно. Скрытый текст
;*********************************************************************************************** movlw b'11111000' ; Загрузим movwf Temp_LSB ; регистры movlw b'11111111' ; movwf Temp_MSB ; ;*********************************************************************************************** ; Определение знака температуры (+ или -) и признака символов .0 или .5 ;*********************************************************************************************** btfsc Temp_MSB, 7 ; В бите 7 старшего байта 1 или 0 ? goto MINUS ; 1, переход в п/п MINUS bsf Znak, 0 ; выводится + goto PLUS ; MINUS bcf Znak, 0 ; выводится - ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в Temp_LSB ; признак символа "5" в _5, 0 ;*********************************************************************************************** comf Temp_MSB, f ; Инвертируем все биты Temp_MSB comf Temp_LSB, f ; и Temp_LSB incf Temp_LSB, f ; увеличим на 1 Temp_LSB btfsc STATUS, Z ; Есть перенос? incf Temp_MSB, f ; Да, увеличим на 1 Temp_MSB PLUS clrf _5 ; Очистим регистр признака 0.5 btfsc Temp_LSB, 3 ; Бит 3 Temp_LSB = 1? bsf _5, 0 ; Да, признак 0.5 градуса swapf Temp_LSB, w ; Поменяем метами п/б Temp_LSB -> W andlw 0FH ; Убьём старший п/б W movwf Temp_LSB ; И скопируем W -> Temp_LSB swapf Temp_MSB, w ; Поменяем п/баты Temp_MSB -> W addwf Temp_LSB, f ; Результат преобразования в Temp_LSB
Прогоните в MPLAB. Конечный результат соответствует исходному коду. P.S. Файл скачал, можно убивать.
Пост N: 55
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг:
0
Отправлено: 31.03.07 02:38. Заголовок: Re:
Уважаемые коллеги. Перечитал то что написано, после чего настроение резко улучшилось, так как я убедился в том, что происходит не “тусовка”, а предметный разговор думающих людей, которые реально стремятся решить конкретную техническую задачу и разговаривают на одном языке, причем, вполне корректно. Между прочим, это достаточно большая редкость и это нужно всячески ценить. То, что имеются какие-то “непонятки” и люди еще до конца “не притерлись” друг к другу, абсолютно нормально и естественно (эти дела “с реактивным свистом” не делаются). Я бы сильно удивился, если бы этого не было. Так или иначе, именно это и есть реальная работа (нормальный, рабочий процесс), которая рано или поздно принесет свои “девиденды”. Не ошибается только тот, кто не работает. Банально? Вне всякого сомнения, но это и есть истина, только уставшая. “Первопроходцем” быть всегда трудно, и для этого, как минимум, нужно иметь “хулиганские” задатки и быть не из робкого десятка. А вот это уже очень серьезно и весомо. Это называется “бойцовским” характером, который в магазине не купишь ни за какие деньги, но который каждый в себе может воспитать, если не будет шарахаться от каждого чиха и не будет занимать наблюдательную (выжидательную) позицию. Ну получил “фингал”. Эка невидаль. Весь мир на “фингалах” учится, потому и развивается. Так, по определению, лучше всего “мозги прошибает”. Те, кто не понимают этой аксиомы, многое теряют. Для того чтобы ее по-настоящему понять, нужно заполучить целую “партию фингалов” (по другому как-то не получается), причем, с олимпиийским спокойствием и осознанным “бросанием на амбразуру”. Потом их будет меньше. Лично мне, очень приятно видеть этот процесс “вживую” в том смысле, что из этого однозначно будет толк (он, кстати, уже есть). Пожелание: обратите внимание на словосочетание “олимпийское спокойствие” и побольше внимания четкой, ясной и однозначной аргументации, так как много “недоразумений” возникает из-за “разнобоя”, связанного с неоднозначностью и недомолвками.
Пост N: 165
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг:
0
Отправлено: 31.03.07 18:00. Заголовок: Re:
Alberto пишет:
цитата:
что значит подружить
Программа "Cyra.exe " не русифицирует винду, а просто исправляет кодировку. Она вносит небольшие изменения в реестр, позволяющие использовать кодировку "Windows-1251". Поможет ли это в Вашем случае, я не знаю, но попробовать стоит. Если не поможет, есть ещё один способ - просто перетащить шрифты с Русской винды в Испанскую. Сделать это можно с помощью проги "PBFSetup.exe" , но предварительно нужно сохранить шрифты из испанской винды, на всякий случай. Скачать архив
Пост N: 121
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 31.03.07 18:20. Заголовок: Re:
Пётр пишет:
цитата:
просто перетащить шрифты с Русской винды в Испанскую
это не помогло. Спасибо за программу , сейчас качаю. Буду пробовать. Есть еще один выход: поставить две винды, но тогда шефа могут поставить в "интересную позу" за использование пиратской копии , а потом он тоже самое сделает со мной , а это уже совсем не смешно .
Пост N: 31
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 03.04.07 12:57. Заголовок: Re:
Заметил ещё один глюк программы ds1820.asm. При выводе температуры меньше 10 градусов остаётся незначащий ноль. Для его гашения необходимы изменения в тексте программы: Скрытый текст
;*********************************************************************************************** ; Вывод (или нет) на индикацию символа "1" (выводится при Т=100 градусов и выше) ;*********************************************************************************************** btfss Flag, 7 ; Бит №7 регистра Flag =0 или =1 ? goto C_00_99 ; Если =0, то символ "1" на индикацию не выводится movlw 31H ; Если =1, то символ "1" (31H) bsf PORTA, RS ; на индикацию выводится call ENTER_BF ; "Плавающая" задержка со стробом под вывод ; данных на индикацию goto plus_0 ; Если температура больше 100, то выводим второй байт ;*********************************************************************************************** ; Вывод на индикацию двух символов результата измерения (в диапазоне от 0 до 99 градусов) ;*********************************************************************************************** C_00_99 movlw 30H ; Гасим xorwf LED1, w ; незначащий btfsc STATUS, Z ; ноль goto minus_0 ; Вывод второго байта без незначащего нуля plus_0 movf LED1, w ; Вывод на индикацию байта, bsf PORTA, RS ; записанного в регистре LED1 call ENTER_BF ; "Плавающая" задержка со стробом под вывод ; данных на индикацию minus_0 movf LED0, w ; Вывод на индикацию байта, bsf PORTA, RS ; записанного в регистре LED0 call ENTER_BF ; "Плавающая" задержка со стробом под вывод ; данных на индикацию ;***********************************************************************************************
Пост N: 56
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг:
0
Отправлено: 03.04.07 15:05. Заголовок: Re:
Иван, это не глюк. Просто, на этом этапе работы, я не ставил себе целью гашение незначащих нулей. Обычно, такого рода “обслуга” задействуется на конечной стадии конструирования устройства, после того, как все более “глобальные” задачи последовательно решены. Так что Вы сработали на опережение, что, как сами понемаете, вовсе не есть плохо. Я же планирую сначала перевести программы DS1820_3 и _4 на шаг измерения 0,1 градус и после этого погасить незначащие нули. Если Ваша процедура оптимальна, то она будет использована. Спасибо за активное участие в обсуждении заявленной темы. Успехов Вам в работе!
Пост N: 108
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 03.04.07 15:46. Заголовок: Re:
Тоже пытался убрать:
Решил проблему через флаги, чистит нули и с передеди и с зади: Скрытый текст
;--------------------------------------------------------------------------------------------- ; Порязрядное распределение полубайтов. ;--------------------------------------------------------------------------------------------- swapf LED0,W ; Запись старшего полубайта LED0 andlw 0Fh ; в младший полубайт LED1 movwf LED1 ; btfss Status,Z ;Если байт LED1 =/= 0, то отмечаем Flag,2 = 1 bsf Flag,2 ; для последующего удаления незначащего "0" в десятках movfw LED0 ; Запись младшего полубайта LED0 andlw 0Fh ; в младший полубайт LED0 movwf LED0 ; goto ASC ; Переход в ПП ASC. ;---------------------------------------------------------------------------------------------
;============================================================================================= ; Вывод на индикацию двух символов результата измерения (в диапазоне от 00 до 99 градусов). ;============================================================================================= C_00_99 movf LED1,W ; Вывод на индикацию байта, btfsc Flag,7 ;Если есть сотня градусов, то независимо, goto ED1 ;выводится "0" цифра десятков btfss Flag,2 ;Если Flag,2 = 0, то цифра десятков goto ED ; на табло не выводится ED1 bsf PortA,RS ; записанного в регистре LED1. call ENTER_BF ; задержка со стробом под вывод ; данных на индикацию. ED movf LED0,W ; Вывод на индикацию байта, bsf PortA,RS ; записанного в регистре LED0. call ENTER_BF ; задержка со стробом под вывод ; данных на индикацию. ;=============================================================================================
Пост N: 38
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 10.04.07 14:01. Заголовок: Re:
Сваял программу (на основе рассылки в рамках самоучителя) для чтения и вывода на ЖКИ содержимого ПЗУ температурных датчиков серии DSxxxx. Со своим датчиком DS18B20 проверил, работает ОК. Скрытый текст
;*********************************************************************************************** ; Read_PZU.asm Программа считывания данных из ПЗУ датчиков температуры DS..... ; и вывода на ЖКИ HD44780 (4-x разрядный интерфейс) ; в формате HEX (COD->XX XX XX XX XX XX XX XX<-CRC) ;*********************************************************************************************** ; Вывод DQ DS..... подключается к выводу RA4 ; Между RA4 и шиной питания резистор 4,7-5,1 кОм ; DS..... с активным питанием ; вывод 1 - общий ; вывод 2 - сигнальный, ; вывод 3 - питание (+5в) ;*********************************************************************************************** list p=16f84a ; Используется PIC16f84A #include <p16f84A.inc> ; Файл, описывающий специфические переменные, ; соответствующие процессору __CONfIG 03FF1H ; WDT выключен, бит защиты не установлен ;*********************************************************************************************** N EQU 0CH ; Счетчик битов, регистр временного хранения N1 EQU 0DH ; Счетчик байтов Temp EQU 0EH ; Многофункциональный регистр временного хранения Count EQU 0FH ; Счетчик количества проходов задержки 10 мкс Buff1 EQU 10H ; Байт типа устройства Buff2 EQU 11H ; 1-й байт серийного номера Buff3 EQU 12H ; 2-й байт серийного номера Buff4 EQU 13H ; 3-й байт серийного номера Buff5 EQU 14H ; 4-й байт серийного номера Buff6 EQU 15H ; 5-й байт серийного номера Buff7 EQU 16H ; 6-й байт серийного номера Buff8 EQU 17H ; Байт контрольной суммы (CRC) LED0 EQU 18H ; Младший байт выводимого числа LED1 EQU 19H ; Старший байт выводимого числа DQ EQU 4 ; Бит порта A для управления DS18B20 RW EQU 0 ; Вывод RA0 - линия RW RS EQU 1 ; Вывод RA1 - линия RS E EQU 2 ; Вывод RA2 - линия Е BF EQU 7 ; Флаг занятости BF RB7 ;*********************************************************************************************** ORG 0x000 ; Вектор сброса процессора ; Начальный адрес clrf PORTA ; Сброс защёлок порта А clrf PORTB ; и порта В bsf STATUS, RP0 ; 1-й банк clrf PORTA ; Выводы портов А clrf PORTB ; и портов В на выход bcf STATUS, RP0 ; 0-й банк ;*********************************************************************************************** ; Инициализация DS..... ;*********************************************************************************************** DQ_INIT call PIN_HI ; Установка вывода в высокоимпедансное состояние: за счет ; подтягивающего резистора, на линии устанавливается 1 call PIN_LO ; Установка на линии нуля movlw .60 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=60х10=600мкс.) call PIN_HI ; Установка вывода в высокоимпедансное состояние: за счет ; подтягивающего резистора, на линии устанавливается 1 movlw .7 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=7х10=70мкс.) ;*********************************************************************************************** ; Определение отклика на импульс сброса ;*********************************************************************************************** btfsc PORTA, DQ ; На линии DQ 0 или 1 (отклик есть или нет)? goto DQ_INIT ; Если отклика нет (1), то снова начинается ; исполнение процедуры инициализации movlw .50 ; Если отклик есть, то установка ; количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=50х10=500мкс.) ;*********************************************************************************************** ; Передача команды Read ROM для чтения ПЗУ DS..... ;*********************************************************************************************** movlw 033H ; Запись команды чтения ПЗУ (Read ROM) movwf Temp ; в регистр Temp movlw .8 ; Запись количества бит передаваемого movwf N ; байта в регистр N METKA_1 rrf Temp, f ; Сдвиг вправо содержимого передаваемого байта btfss STATUS, C ; В бите С "лежит" 0 или 1 ? goto OUT_0 ; Если С=0, то переход в ПП передачи нуля goto OUT_1 ; Если С=1, то переход в ПП передачи единицы METKA_2 decfsz N, f ; Уменьшение на 1 содержимого счетчика битов goto METKA_1 ; Если результат не =0, то переход на метку METKA_1 ;*********************************************************************************************** ; Чтение 8 байтов из ПЗУ DS..... ;*********************************************************************************************** movlw Buff1 ; В FSR записывается адрес movwf FSR ; регистра Buff1 movlw .8 ; Определение количества movwf N1 ; считываемых байтов SNOVA movlw .8 ; Запись количества бит принимаемого movwf N ; байта в регистр N clrf Temp ; Очистка регистра принимаемого байта IN_BYTE call PIN_LO ; Формирование на линии уровня 0 call PIN_HI ; Формирование на линии уровня 1 nop ; Калибровочный NOP ;*********************************************************************************************** ; Запись, в бит С, уровня текущего бита, выдаваемого DS..... в линию ;*********************************************************************************************** btfss PORTA, DQ ; На линии 0 или 1 ? bcf STATUS, C ; Если на линии 0, то в бите С выставляется 0 btfsc PORTA, DQ ; Если на линии 1 (а также после исполнения предыдущей ; команды), то еще одна проверка состояния линии bsf STATUS, C ; Если на линии 1, то в бите С выставляется 1 ; Если на линии 0 (а также после исполнения предыдущей ; команды), то программа исполняется далее ;*********************************************************************************************** ; Последовательное заполнение битами регистра Temp ;*********************************************************************************************** rrf Temp, f ; Сдвиг содержимого регистра Temp вправо (через C) movlw .4 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=4х10=40мкс.) decfsz N, f ; Уменьшение на 1 содержимого счетчика битов goto IN_BYTE ; Если результат не=0, то переход ; на прием следующего бита movf Temp, w ; Если =0, то копирование принятого байта в регистр w movwf INDF ; Копирование содержимого регистра w ; в текущий регистр Buff... incf FSR, f ; Запись в fSR адреса следующего регистра Buff... decfsz N1, f ; Декремент счетчика байтов goto SNOVA ; Приняты все байты? Нет, продолжим goto INIT_LCD ; Да, вывод в ЖКИ ;*********************************************************************************************** ; Передача бита с уровнем "0" ;*********************************************************************************************** OUT_0 call PIN_LO ; Переход в ПП установки уровня 0. Начало передачи movlw .6 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=6х10=60мкс.) call PIN_HI ; Переход в ПП установки уровня 1. Конец передачи goto METKA_2 ; Переход на исполнение процедуры декремента ; и анализа содержимого счетчика битов ;*********************************************************************************************** ; Передача бита с уровнем "1" ;*********************************************************************************************** OUT_1 call PIN_LO ; Переход в ПП установки уровня 0. Начало передачи call PIN_HI ; Переход в ПП установки уровня 1. (передача 1) movlw .6 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=6х10=60мкс.) goto METKA_2 ; Переход на новый цикл передачи бита ;*********************************************************************************************** ; Инициализация ЖКИ ;*********************************************************************************************** INIT_LCD movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки, 5х7 точек call ENTER_BF ; "Плавающая" задержка со стробом под команду 00101000 movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки, 5х7 точек call ENTER_BF ; "Плавающая" задержка со стробом под команду 00101000 movlw b'00001100' ; Установка: дисплей включен, видимое отображение ; курсора выключено call ENTER_BF ; "Плавающая" задержка со стробом под команду 00001100 movlw b'00000001' ; Установка: очистка дисплея со сбросом данных, ; установка курсора в начало 1-й строки call ENTER_BF ; "Плавающая" задержка со стробом под команду 00000001 ;*********************************************************************************************** ; Вывод в первую строку надписи "COD->" ;*********************************************************************************************** movlw .5 ; Количество выводимых в строку movwf Count ; символов в Count WR_1 movf Count, w ; Копируем Count в w sublw .5 ; 5-Count call TEXT ; В п/п TEXT bsf PORTA, RS ; Вывод на индикацию текущего символа call ENTER_BF ; Задержка decfsz Count, f ; Вывод следующего goto WR_1 ; символа ;*********************************************************************************************** ; Вывод первых четырёх принятых байтов ;*********************************************************************************************** movlw .4 ; Определение количества movwf N1 ; считываемых байтов movlw Buff1 ; В FSR записывается адрес movwf FSR ; регистра Buff1 call OUTPUT ; В п/п преобразования и вывода на ЖКИ ;*********************************************************************************************** ; Вывод во вторую строку последних четырёх байтов ;*********************************************************************************************** movlw b'11000000' ; Выбор ячейки DD RAM с адресом 40Н call ENTER_BF ; 2-я строка 1-е слева знакоместо movlw .4 ; Определение количества movwf N1 ; считываемых байтов movlw Buff5 ; В FSR записывается адрес movwf FSR ; регистра Buff5 call OUTPUT ; В п/п преобразования и вывода на ЖКИ ;*********************************************************************************************** movlw b'11001011' ; Выбор ячейки DD RAM с адресом 4ВН call ENTER_BF ; 2-я строка 12-е слева знакоместо ;*********************************************************************************************** ; Вывод во вторую строку надписи <-CRC ;*********************************************************************************************** movlw .5 ; Количество выводимых в строку movwf Count ; символов в Count WR_2 movf Count, w ; Копируем Count в w sublw .5 ; 5-Count call TEXT1 ; В п/п TEXT1 bsf PORTA, RS ; Вывод на индикацию текущего символа call ENTER_BF ; Задержка decfsz Count, f ; Вывод следующего goto WR_2 ; символа ;*********************************************************************************************** goto $ ; Баста карапузики! ;*********************************************************************************************** ; п/п преобразования данных в код ЖКИ HD44780 ;*********************************************************************************************** OUTPUT movf INDF, w ; Скопируем данные в w movwf N ; и во временный регистр N andlw 0FH ; Убьём старший п/байт movwf LED0 ; Младший п/байт в LED0 movlw 0AH ; Запись в регистр w числа 0AH subwf LED0, w ; Вычесть из w значение LED0 btfsc STATUS, C ; Выводим цифру или символ? goto ASC_LED0 ; Символ movlw 30H ; Запись в регистр w числа 30H iorwf LED0, f ; Логическое "ИЛИ" содержимого w и LED0 METKA_3 swapf N, w ; Поменяем местами п/байты временного регистра N andlw 0FH ; Убьём старший п/байт movwf LED1 ; Младший п/байт в LED1 movlw 0AH ; Запись в регистр w числа 0AH subwf LED1, w ; Вычесть из w значение LED1 btfsc STATUS, C ; Выводим цифру или символ? goto ASC_LED1 ; Символ movlw 30H ; Запись в регистр w числа 30H iorwf LED1, f ; Логическое "ИЛИ" содержимого w и LED1 goto DISPLAY ; Проверка и преобразование закончено, на вывод ASC_LED0 movlw 37H ; Запись в регистр w числа 37Н addwf LED0, f ; Для выводимого символа значение LED0 увеличть на 37Н goto METKA_3 ; Проверка для LED1 ASC_LED1 movlw 37H ; Запись в регистр w числа 37Н addwf LED1, f ; Для выводимого символа значение LED1 увеличть на 37Н return ; Возврат из п/п ;*********************************************************************************************** ; п/п вывода преобразованных данных на ЖКИ ;*********************************************************************************************** DISPLAY movf LED1, w ; вывод bsf PORTA, RS ; готовых call ENTER_BF ; данных movf LED0, w ; на bsf PORTA, RS ; индикацию call ENTER_BF ; Задержка movlw 20H ; Вывод на индикацию bsf PORTA, RS ; символа "пусто" call ENTER_BF ; Задержка incf FSR, f ; Запись адреса следующего регистра Buff... decfsz N1, f ; Декремент счётчика байтов. Всё вывели? goto OUTPUT ; Нет, продолжим return ; Возврат из п/п ;*********************************************************************************************** ; ПП "плавающей" задержки на основе анализа состояния флага занятости BF ;*********************************************************************************************** ENTER_BF movwf Temp ; Переправка старшего п/байта регистра W на линии movwf PORTB ; RB4...7 ;*********************************************************************************************** ; Запуск в работу старшего п/байта (строб) ;*********************************************************************************************** nop ; Задержка в 1 м.ц bsf PORTA, E ; Установка на линии Е "1" nop ; Задержка в 1 м.ц bcf PORTA, E ; Установка на линии Е "0" swapf Temp, w ; Смена п/байтов с сохранением результата операции в W movwf PORTB ; Переправка младшего п/байта регистра W на линии ; RB4...7 ;*********************************************************************************************** ; Запуск в работу младшего п/байта (строб) ;*********************************************************************************************** nop ; Задержка в 1 м.ц bsf PORTA, E ; Установка на линии Е "1" nop ; Задержка в 1 м.ц bcf PORTA, E ; Установка на линии Е "0" ;*********************************************************************************************** ; Проверка состояния флага занятости BF ; Подготовка к проверке ;*********************************************************************************************** bsf STATUS, RP0 ; Переход в 1-й банк movlw b'11110000' ; Запись в W "11110000" movwf PORTB ; RB4...7 работают на вход, а RB0...3 работают на выход bcf STATUS, RP0 ; Переход в 0-й банк bcf PORTA, RS ; Установка на линии RS "0" (режим команд) bsf PORTA, RW ; Линия RW в "1" (режим чтения данных) nop ; Задержка в 1 м.ц bsf PORTA, E ; Установка на лини Е "1" POVTOR nop ; Задержка в 1 м.ц ;*********************************************************************************************** btfsc PORTB, BF ; Проверка состояния флага занятости BF goto POVTOR ; Если BF=1, то продолжение задержки до тех пор, пока ; BF не установится в "0" (программа исполняется далее) clrf PORTA ; Сброс в "0" всех защелок порта А (RW=0, RS=0, E=0) bsf STATUS, RP0 ; Переход в 1-й банк clrf PORTB ; Все выводы порта В работают на выход bcf STATUS, RP0 ; Переход в 0-й банк return ; Возврат по стеку ;*********************************************************************************************** ; Формирование на линии уровня "1" за счет подтягивающего резистора ;*********************************************************************************************** PIN_HI bsf STATUS, RP0 ; Переход в банк 1 bsf PORTA, DQ ; Настройка вывода RA4 на работу "на вход" bcf STATUS, RP0 ; Переход в банк 0 return ; Возврат по стеку ;*********************************************************************************************** ; Формирование на линии уровня "0" средствами микроконтроллера ;*********************************************************************************************** PIN_LO bcf PORTA, DQ ; Установка 0 на выходе защелки вывода RA4 bsf STATUS, RP0 ; Переход в банк 1 bcf PORTA, DQ ; Настройка вывода RA4 на работу "на выход" bcf STATUS, RP0 ; Переход в банк 0 return ; Возврат по стеку ;*********************************************************************************************** ; Подпрограмма задержки ;*********************************************************************************************** PAUSE_X movwf Count ; Копирование количества проходов из w в Count ;*********************************************************************************************** ; Пауза в 10 мкс. ;*********************************************************************************************** PAUSE_10 nop ; goto $+1 ; Одноразрядный, goto $+1 ; вычитающий goto $+1 ; счетчик decfsz Count, f ; с "врезкой" goto PAUSE_10 ; return ; Возврат по стеку ;*********************************************************************************************** TEXT addwf PCL, f ; Приращение РС на величину содержимого w retlw 43H ; "C" retlw 4FH ; "O" retlw 44H ; "D" retlw 2DH ; "-" retlw 3EH ; ">" ;*********************************************************************************************** TEXT1 addwf PCL, f ; Приращение РС на величину содержимого w retlw 3CH ; "<" retlw 2DH ; "-" retlw 43H ; "C" retlw 52H ; "R" retlw 43H ; "C" ;*********************************************************************************************** END ; Конец программы
Пост N: 109
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 10.04.07 18:25. Заголовок: Re:
RW1ZK пишет:
цитата:
Сваял программу (на основе рассылки в рамках самоучителя) для чтения и вывода на ЖКИ содержимого ПЗУ температурных датчиков серии DSxxxx. Со своим датчиком DS18B20 проверил, работает ОК.
ЗдОрово Заготовки действительно суперские, а самое главное универсальные. можно ваять чего хош Тоже, сдалал термометр-термостат, на основе материалов самоучителя, управляется одной кнопкой. Жаль, что нет возможности обмена файлами, всетаки копировать текст, а потом его корректировать, не совсем то
Пост N: 110
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 10.04.07 19:19. Заголовок: Re:
Полностью солидарен с Вами ( _vintik@mail.ru ), ICQ не имею, и не жалею об этом Вышлите Ваш файл пожалуйста, а то я его скопировал, а он весь получился в одну строчку, и набирать... ну уж очень большой кусок
Пост N: 112
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 11.04.07 09:05. Заголовок: Re:
А я сам, сначала не понял, а когда стал разбираться, то увидел, что из первой четверки теряются два байта. Заменил в; п/п преобразования данных в код ЖКИ HD44780 return на goto, и все заработало
Пост N: 113
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 11.04.07 09:23. Заголовок: Re:
RW1ZK пишет:
цитата:
прикрепить изображение?
Так, вот же он, "мужик в пиджаке" Четырнадцатый с права, потом на открывшемся окошке, указываете путь к рисунку на ПК, затем в левом нижнем углу жмете "загрузить" и после загрузки на сервер, выбираете вариант вывода Вашего рисунка.
Пост N: 60
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг:
0
Отправлено: 11.04.07 19:15. Заголовок: Re:
Иван, а не желаете ли Вы опубликовать свою программу в "Практикуме..."? Если такое желание есть, то готовьте документацию и пришлите ее мне. Авторство - Ваше. P.S. Хорошая работа.
Пост N: 116
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 13.04.07 13:06. Заголовок: Re:
ikarab пишет:
цитата:
Альберто, процесс еще не дошел до стадии цепной реакции (контуры обозначены не до конца). По моим прикидкам, она начнется с п/раздела 5/4 и далее. Может быть будет некоторая задержка с "перевариванием" информации, но это совершенно естественно. Люди не роботы.
Процесс идет и даже вырывается на белый свет
Немного флейма, Хочу поблагодарить за реальную помощь! Dmitry Dubrovenko - всяческая поддержка на форуме Alberto - много полезных программ Пётр - рограмма перевода текста для HD44780 RW1ZK - программа перевода 2\НЕХ для HD44780 Roslik - программа перевода 2\10
Пост N: 190
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг:
1
Отправлено: 14.04.07 11:30. Заголовок: Re:
vintik пишет:
цитата:
Загвоздка получается в сравнении измеренной отрицательной и установленной положительной
А в чём собственно проблема, ведь сравнивать можно косвенным методом. Если 7 бит установлен в 1, значит температура отрицательная если сброшен, положительная.
Пост N: 119
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 14.04.07 11:59. Заголовок: Re:
Заработало! С помощью седьмых битов старших регистров изм. данных и уст. порога, все решилось. Достаточно было расписать логику на бумаге, так что спасибо Петр, за хороший совет, данный вовремя. Причем, проблемы с минусами, вообще не затронулись. Все уже крутится в железе.
Пост N: 50
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
1
Отправлено: 20.04.07 18:19. Заголовок: Re:
Кто разобрался в кодировании значений порогов температуры (регистры TH, TL EEPROM)? Читаю datasheets... 7-й бит ... 0 -> температура положительная, 1 -> температура отрицательная. Остаются биты 6-0. Максимальное число = 127. Смотрю листинг программы DS1820_a.asm. Значение верхнего порога TH: +25 градусов Цельсия ->32H, перевожу в десятичный вид -> 50. Вывод: необходимое значение температуры умножить на 2 и загнать его в регистр TH или TL (по необходимости). А что в сухом остатке... Т.к. максимально возможное число для 7-ми бит (в восьмом знак температуры) равно 127-ми, то получается, что есть возможность установить максимально возможный предел в 63,5 градуса? Что-то не так... Help...
Пост N: 149
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 23.04.07 13:56. Заголовок: Re:
Вообще то в данном случае (DS1820_a.asm) регистры TH и TL не используются по своему прямому назначению (команда Alarm Search (ECh)). В данном случае они были использованы как энегронезависимая память находящаяся непосредственно в датчике (зачем добру пропадать). Здесь просто считывается число из одного из регистров (или TH, или TL: в данный момент под рукой нет листинга программы DS1820_a.asm, поэтому точно сказать не могу) и сравнивается с измеренной температурой. Отсюда и указанный Вами предел. В родном применении точность сравнения была в 1 градус, т.е. бит 7 знак температуры, а оставшиеся биты сама температура с точностью в один градус (111 1111 = 127).
Пост N: 153
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 24.04.07 13:18. Заголовок: Re:
Меня попросили еще раз выложить исходник с исправлениями для работы с датчиком DS18B20, выложил сюда: http://up-file.com/download/ec0bc3882311/DS18B20.zip.html правда хочу напомнить, что это версия без гашения левого незначащего нуля и с разрешением в 0,5 градуса. Все изменения выделены, так что при желании можно те же изменения внести в более новые исходники из рассылки.
Пост N: 156
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 25.04.07 19:42. Заголовок: Re:
RW1ZK пишет:
цитата:
Здесь полная версия термометра с гашением незначащих нулей и разрешением в 0.5 градуса для DS18B20. http://slil.ru/24284622
только что посмотрел Вашу программу и нашел одну ошибку (сам ее допустил, поэтому сразу обратил внимание), она уже обсуждалась здесь, поэтому повторяться не буду (для наводки Ваше сообщение от 30.03.07, сообщение Винтика и мое от того же числа). Это относится к неправильной работе при отрицательных температурах. Поищите, я на эти грабли уже наступил, хороший урок был . Почему не говорю где ошибка? Я так понимаю, что мы здесь новички в программировании, поэтому (лично мне) интереснее найти самому, если будут проблемы (сомневаюсь, но всяко бывает) - помогу.
Пост N: 57
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
1
Отправлено: 25.04.07 20:48. Заголовок: Re:
Alberto пишет:
цитата:
и нашел одну ошибку
Вот я и говорю, там есть над чем поработать. А если серьёзно, то исправленная версия осталась на рабочем компе. Завтра выложу, если всё ещё есть необходимость. Банальная невнимательность! Вот так всегда, когда в наличии несколько компов... Честно говоря, этот проект мной практически заброшен. Жду, когда прийдёт мой заказ из чипинфо (ещё 4 датчика DS18B20). Потом будет продолжение. А пока разработка синтезатора на SAA1057 для FM приёмника и не только... В наличии есть 2 кварцевых фильтра на 25 мгц. Один с полосой пропускания 60 кгц, второй - 15 кгц. Хочу ещё собрать приёмник на 137 мгц для приёма спутников погоды серии NOAA.
Пост N: 157
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 26.04.07 12:50. Заголовок: Re:
RW1ZK пишет:
цитата:
если всё ещё есть необходимость
думаю что имея все подсказки можно дать человеку и самому разобраться - это и полезнее и интереснее. Если будут затруднения, то другое дело. RW1ZK пишет:
цитата:
разработка синтезатора... собрать приёмник на 137 мгц для приёма...
А вот это для меня китайская грамота , может просто потому, что никогда не интересовало.
Пост N: 58
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
1
Отправлено: 26.04.07 15:41. Заголовок: Re:
Alberto пишет:
цитата:
и самому разобраться
Добро, на этом и остановимся... Alberto пишет:
цитата:
это для меня китайская грамота
Приёмник-ничего сложного. Сложнее разобраться с синтезатором. Пока на пике был RC генератор, схема синтезатора работала без проблем. Сейчас на пик поцепил кварц и схема заткнулась. Пока разбираюсь... Достала меня эта SAA1057!
Все даты в формате GMT
3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет