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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Проблема с конвертацией результата от ds1307
Проблема с конвертацией результата от ds1307
MiXaS Дата: Чт, 15.01.2015, 19:19  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата tesla88 ()
Ребята подскажите как из переменной типа Float выделить целое значение и записать его в переменную типа byte
   можно просто преравнять байт = флоат. Байты будут только целые, только с округлением по правилам математики.
AndrF Дата: Чт, 15.01.2015, 19:26  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Правила бывают разные. К примеру, в Visual Basic-e используется банковское округление. Что интересно, не все об этом догадываются...
tesla88 Дата: Чт, 15.01.2015, 19:32  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

AndrF ссылка почему то не работает. можете перезалить?

Добавлено (15.01.2015, 19:32)
---------------------------------------------
Да мне надо вывести десятичное значение температуры с ds18b20, там результат получается типа float а мне нужен целый результат для отображения на мойх часах ( 4 семисигментных индикатора, собственно проэк воложен выше.

AndrF Дата: Чт, 15.01.2015, 19:38  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

я делал так: переменную флоат умножал на 10(или 100, смотря сколько знаков надо), потом как говорил выше, а потом через DIG Выводил уже в нужный знакомест.
Сообщение отредактировал MiXaS - Пт, 16.01.2015, 01:30
tesla88 Дата: Сб, 17.01.2015, 13:36  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

Спасибо MiXaS за совет ,  учел нюансы , пишу дальше, по завершении думаю выложить в данную тему весь проект, может кому будет полезно.
ЯНДЕКС Дата: 17.01.2015
AndrF Дата: Вс, 18.01.2015, 09:02  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

По поводу логического анализатора - попался бюджетный вариант

Поиск выводит на http://sigrok.org/wiki/Lcsoft_Min

В общем, ничего больше сказать не могу - изучайте...
tesla88 Дата: Вс, 18.01.2015, 09:19  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

В общем заказал себе вот такую штуку http://almatao.kz/ru/item/37965207312 , через две недели приедет, посмотрю , и отпишусь)
tesla88 Дата: Вс, 18.01.2015, 22:24  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 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
'!!!!!!!!!!!!!!!!!!!!
Прикрепления: __.bas (9.9 Kb) · 7237368.dsn (137.7 Kb)
MiXaS Дата: Пн, 19.01.2015, 09:27  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата tesla88 ()
DelayMS 1000           ' это крайне плохо и лучше так не делать ( временная мера)))) 


Может быть с этим связано?
ivan_fd Дата: Пн, 19.01.2015, 12:44  |                                                                                                                Сообщение # 26
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Нормально все срабатывает. Так как написано в программе. Вы просто флаг прерывания ставите не
там где нужно.

Ваш код написан, мягко говоря, не очень. Зачем Вам для обработки клавиш использовать прерывания?

И еще, для температуры совсем не обязательно переменную типа float.

Сообщение отредактировал ivan_fd - Пн, 19.01.2015, 14:43
tesla88 Дата: Пн, 19.01.2015, 16:54  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

ivan_fd я с вами согласен , код пока сырой и требует доработки, причесывать я его буду немного позже, а обработка кнопок по прерыванию нужна для моментальной реакции на их нажатие, если есть другие варианты решения этой задачи то я был бы вам благодарен за пример, а что касается кривого кода, то я самоучка и многих правил и решений еще не постиг, всё приходит с опытом, а он без ( без корявой практики увы невозможен)
ivan_fd Дата: Пн, 19.01.2015, 20:37  |                                                                                                                Сообщение # 28
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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 
исполняются очень долго. Так быть не должно. 

Еще посмотрите как можно работать с датчиком температуры.
Прикрепления: TermoHolod.bas (6.1 Kb)
xvovanx Дата: Вт, 20.01.2015, 12:02  |                                                                                                                Сообщение # 29
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 326
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата ivan_fd ()
Еще посмотрите как можно работать с датчиком температуры

Поясните пожалуйста то место, где используете массив для конвертации, интересно стало. Я как и все подругому - по понятному как и я чайникам biggrin )
Прикрепления: 7729751.jpg (26.1 Kb) · 9604236.jpg (63.7 Kb)

Сообщение отредактировал xvovanx - Вт, 20.01.2015, 12:12
ivan_fd Дата: Вт, 20.01.2015, 15:23  |                                                                                                                Сообщение # 30
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Проблема с конвертацией результата от ds1307
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: