Проблема с конвертацией результата от ds1307
|
|
MiXaS |
Дата: Чт, 15.01.2015, 19:19 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата tesla88 ( ) Ребята подскажите как из переменной типа Float выделить целое значение и записать его в переменную типа byte можно просто преравнять байт = флоат. Байты будут только целые, только с округлением по правилам математики.
|
|
|
|
AndrF |
Дата: Чт, 15.01.2015, 19:26 | Сообщение # 17 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
145
Замечания:
±
На сайте с 03.02.2012
Статус:
Offline
|
Правила бывают разные. К примеру, в Visual Basic-e используется банковское округление. Что интересно, не все об этом догадываются...
|
|
|
|
tesla88 |
Дата: Чт, 15.01.2015, 19:32 | Сообщение # 18 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
AndrF ссылка почему то не работает. можете перезалить? Добавлено (15.01.2015, 19:32) --------------------------------------------- Да мне надо вывести десятичное значение температуры с ds18b20, там результат получается типа float а мне нужен целый результат для отображения на мойх часах ( 4 семисигментных индикатора, собственно проэк воложен выше.
|
|
|
|
AndrF |
Дата: Чт, 15.01.2015, 19:38 | Сообщение # 19 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
145
Замечания:
±
На сайте с 03.02.2012
Статус:
Offline
|
Посмотрел - у меня ссылка работает... Ну смотрите так:
http://www.hantek.ru/products/mso5102d.html
На ebay они где-то от 25 тыс руб.
Добавлено (15.01.2015, 19:38) --------------------------------------------- Цитата tesla88 ( ) Да мне надо вывести десятичное значение температуры с ds18b20, там результат получается типа float а мне нужен целый результат для отображения на мойх часах ( 4 семисигментных индикатора, собственно проэк воложен выше. Так то типовая задача - проектов термометров с DS18B20 на данном сайте достаточно - откройте код любого и посмотрите как там реализовано - громадная часть вопросов отпадет.
Вот когда приходится использовать пример из проекта Andurino - тогда уже посложней. Хотя и к этому привыкаешь...
Сообщение отредактировал
AndrF - Чт, 15.01.2015, 19:40
|
|
|
|
MiXaS |
Дата: Пт, 16.01.2015, 01:30 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
я делал так: переменную флоат умножал на 10(или 100, смотря сколько знаков надо), потом как говорил выше, а потом через DIG Выводил уже в нужный знакомест.
Сообщение отредактировал
MiXaS - Пт, 16.01.2015, 01:30
|
|
|
|
tesla88 |
Дата: Сб, 17.01.2015, 13:36 | Сообщение # 21 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Спасибо MiXaS за совет , учел нюансы , пишу дальше, по завершении думаю выложить в данную тему весь проект, может кому будет полезно.
|
|
|
|
AndrF |
Дата: Вс, 18.01.2015, 09:02 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
145
Замечания:
±
На сайте с 03.02.2012
Статус:
Offline
|
По поводу логического анализатора - попался бюджетный вариант
Поиск выводит на http://sigrok.org/wiki/Lcsoft_Min
В общем, ничего больше сказать не могу - изучайте...
|
|
|
|
tesla88 |
Дата: Вс, 18.01.2015, 09:19 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
В общем заказал себе вот такую штуку http://almatao.kz/ru/item/37965207312 , через две недели приедет, посмотрю , и отпишусь)
|
|
|
|
tesla88 |
Дата: Вс, 18.01.2015, 22:24 | Сообщение # 24 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Люди добрые прошу вашей помощи, почти дописал программу часов и осталось только работу кнопок в меню описать, но вот ведь не задача - подпрограмма обработки прерываний срабатывает почему то не сразу а через энное количество времени, первый раз такое вижу ( на то они и прерывания что бы мгновенно прервать выполнение основной программы). ниже кусок кода и проект целиком.
Device 16F876A
'-------------------------------- -----Предустановки--------------------------------------------- Xtal 4 Declare All_Digital = 1 Declare CCP1_Pin PORTC.2 'Вывод для HPWM модуля CCP1 Declare CCP2_Pin PORTC.1 'Вывод для HPWM модуля CCP2
Declare SDA_Pin PORTC.4 Declare SCL_Pin PORTC.3 '-------------------------------------Настройки портов---------------------------------------------- TRISA = %00000011 TRISB = %00001111 TRISC = %00000001 PORTB = %00000000 PORTC = %00000000
'-------------------------------НАСТРОЙКА ПРЕРЫВАНИЙ ПО ПОРТУ B.0----------------------------------- On_Interrupt GoTo OBRABOTCHIK ' Если приозошло прирывание то перейти к указаной метке
Symbol INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT) Symbol GIE = INTCON.7 ' Бит глобального разрешения прерываний Symbol INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT) OPTION_REG = %10000000 ' Фронт прерывания - передний, отключим PULLUP PIE1.0 = 1 INTCON.6 = 1 'Разрешим прерывание от периферийных устройств микроконтроллера GIE = 1
'-----------------------------------Конфигурация переменных----------------------------------------- Symbol DS PORTC.5 'Вход данных для сдвигового регистра Symbol SH_CP PORTC.7 'Вход тактовых импульсов для сдвигового регистра Symbol ST_CP PORTC.6 'Защелка сдвигового регистра Dim Value As Byte 'Переменная для преобразования табличной конвертации Dim n As Byte 'Переменная для выделения из числа цифры разряда Dim i As Word 'Переменная организации счетчика цифр Dim j As Word 'Переменная организации счетчика задержки Dim ckl As Byte Symbol setup = PORTB.1 Symbol up = PORTB.2 Symbol down = PORTB.3 Symbol enter = PORTB.4 Symbol rtc_read = %11010001 ' Адрес часов для чтения Symbol rtc_write = %11010000 ' Адрес часов для записи
TRISA.1 = 1 Symbol Dy = PORTA.0 ' Подключить DS18B20 к выводу PORTA.4 Symbol Dd = PORTA.1 ' Подключить DS18B20 к выводу PORTA.4 Dim R_Temp As Word ' Переменная для получения значения температуры ' отдельными двумя байтами Dim Temp As Float ' Переменная для преобразования значения ' температуры в данные с плавающей запятой Dim TempIND As Float ' Переменная для вывода на индикацию значени ' температуры Dim C As Bit ' Переменная для хранения бита сигнализации ' окончания преобразования Dim SEC As Byte Dim SEC1 As Byte Dim MINU As Byte Dim MINU1 As Byte Dim CHAS As Byte Dim CHAS1 As Byte Dim DNI As Byte Dim DNI1 As Byte Dim MES As Byte Dim MES1 As Byte Dim GOD As Byte Dim GOD1 As Byte
Dim hr As Byte ' часы в формате DS1307 Dim hr1 As Byte ' часы в десятичном формате
Dim tmp01 As Byte Dim tmp02 As Byte Dim tmp As Byte Dim tmp1 As Byte Dim temperatura As Byte Dim temperatura1 As Dword 'КАРТА АДРЕСАЦИИ ПАМЯТИ DS1307 Dim ADDRES_0 As Byte Dim ADDRES_1 As Byte Dim ADDRES_2 As Byte Dim ADDRES_3 As Byte Dim ADDRES_4 As Byte Dim ADDRES_5 As Byte Dim ADDRES_6 As Byte Dim ADDRES_7 As Byte '||||||||||||||||||||||||||||||| Dim x As Byte Dim y As Byte
y = 0 x = 127 ADDRES_0 = $00 ADDRES_1 = $01 ADDRES_2 = $02 ADDRES_3 = $03 ADDRES_4 = $04 ADDRES_5 = $05 ADDRES_6 = $06 ADDRES_7 = $07
HPWM 1, 255 , 1000 'Сгенерировать ШИМ сигнал для засветки индикатора PORTC.2 = 1
in: ;HBStart BusOut rtc_write, $07, [%00010000] ' ТАКТЫ BusOut rtc_write, $01, [%01011001] ' МИНУТЫ BusOut rtc_write, $02, [%00100011] ' ЧАСЫ BusOut rtc_write, $04, [%10011000] ' ДНИ BusOut rtc_write, $05, [%00000001] ' МЕСЯЦ BusOut rtc_write, $06, [%00010101] ' ГОД
;HBStop
GoSub Ind '-------------------------------------Главная программа--------------------------------------------- Start: INTE = 1 GoSub TERMO_ConvertD GoSub TERMO_ConvertY GoSub read_time GoTo Start
'!!!!!!!!!!!!!!!!!! OBRABOTCHIK: Context Save If INTF = 1 Then 'Если было прерывание по INT INTF = 0 'сбросим флаг прерывания от INT INTE = 0 ' сбросим Бит разрешения прерывания по PORTB.0(INT) If setup = 0 Then SHOut DS, SH_CP, MsbFirst, [$A3] SHOut DS, SH_CP, MsbFirst, [$9C] SHOut DS, SH_CP, MsbFirst, [$A3] SHOut DS, SH_CP, MsbFirst, [$9C] PulsOut ST_CP, 10 DelayMS 1000 ' это крайне плохо и лучше так не делать ( временная мера)))) 'IF up = 0 THEN GOSUB 'IF down = 0 THEN GOSUB 'IF enter = 0 THEN GOSUB End If End If Context Restore Retfie '!!!!!!!!!!!!!!!!!!!!
|
|
|
|
MiXaS |
Дата: Пн, 19.01.2015, 09:27 | Сообщение # 25 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата tesla88 ( ) DelayMS 1000 ' это крайне плохо и лучше так не делать ( временная мера))))
Может быть с этим связано?
|
|
|
|
ivan_fd |
Дата: Пн, 19.01.2015, 12:44 | Сообщение # 26 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Нормально все срабатывает. Так как написано в программе. Вы просто флаг прерывания ставите не там где нужно.
Ваш код написан, мягко говоря, не очень. Зачем Вам для обработки клавиш использовать прерывания?
И еще, для температуры совсем не обязательно переменную типа float.
Сообщение отредактировал
ivan_fd - Пн, 19.01.2015, 14:43
|
|
|
|
tesla88 |
Дата: Пн, 19.01.2015, 16:54 | Сообщение # 27 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
ivan_fd я с вами согласен , код пока сырой и требует доработки, причесывать я его буду немного позже, а обработка кнопок по прерыванию нужна для моментальной реакции на их нажатие, если есть другие варианты решения этой задачи то я был бы вам благодарен за пример, а что касается кривого кода, то я самоучка и многих правил и решений еще не постиг, всё приходит с опытом, а он без ( без корявой практики увы невозможен)
|
|
|
|
ivan_fd |
Дата: Пн, 19.01.2015, 20:37 | Сообщение # 28 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
tesla88, скажите, зачем в часах моментальная реакция на нажатие.
Я у себя делаю так: Код Scan_Key:
If ENT = 0 Then DelayMS 200 ENT_BUT = true Else ENT_BUT = false EndIf
If LEFT = 0 Then DelayMS 200 LEFT_BUT = true Else LEFT_BUT = false EndIf
If RIGTH = 0 Then DelayMS 200 RIGTH_BUT = true Else RIGTH_BUT = false EndIf
Return Это сама процедура опроса клавиш.
Ее вызываем в основном цикле.
Но скажу еще раз. У вас код написан неверно. Процедуры TERMO_ConvertD, TERMO_ConvertY, read_time исполняются очень долго. Так быть не должно.
Еще посмотрите как можно работать с датчиком температуры.
|
|
|
|
xvovanx |
Дата: Вт, 20.01.2015, 12:02 | Сообщение # 29 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
328
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата ivan_fd ( ) Еще посмотрите как можно работать с датчиком температуры Поясните пожалуйста то место, где используете массив для конвертации, интересно стало. Я как и все подругому - по понятному как и я чайникам )
Сообщение отредактировал
xvovanx - Вт, 20.01.2015, 12:12
|
|
|
|
ivan_fd |
Дата: Вт, 20.01.2015, 15:23 | Сообщение # 30 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
xvovanx, можно использовать и такой код:
Код TempC = Temp_read >> 4 Float1 = Temp_read & $0F Float0 = (Float1 * 625) / 1000 Массив там используется только для определения дробной части (десятых градуса). Так вот, если верить протеусу, (может и реальном железе будет по другому), то при минусовых температурах десятые врут. Посмотрите отладчиком, там все видно. Но если использовать 9 битную точность, то нужды в таком коде нету никакой.
Сообщение отредактировал
ivan_fd - Вт, 20.01.2015, 15:34
|
|
|
|