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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
18F4550 + DS18B20 + USB
DNM Дата: Чт, 09.04.2015, 11:09  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 75
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Датчик на RB0

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

Declare Reminders = off
' select MCU and clock speed
Device = 18F4550
Xtal = 48

Config_Start
PLLDIV =  5 ; Divide by 5 (20 MHz oscillator input)
CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
'CPUDIV = OSC3_PLL4 ; [OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]
USBDIV = 2 ; USB clock source comes from the 96 MHz PLL divided by 2
'FOSC = HS
FOSC = HSPLL_HS ; HS oscillator, PLL enabled, HS used by USB
FCMEN = OFF ; Fail-Safe Clock Monitor disabled
IESO = OFF ; Oscillator Switchover mode disabled
PWRT = On ; PWRT enabled
BOR = On'OFF ; Brown-out Reset disabled in hardware and software
BORV = 3'2 ;
VREGEN = On ; USB voltage regulator enabled
WDT = OFF ; HW Disabled - SW Controlled
WDTPS = 32768'2 ; 1:2
MCLRE =  On ; MCLR pin enabled; RE3 input pin disabled
LPT1OSC = OFF ; Timer1 configured for higher power operation
PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CCP2MX = On 'off ; CCP2 input/output is multiplexed with RB3
STVREN = On ; Stack full/underflow will not cause Reset
LVP = OFF ; Single-Supply ICSP disabled
XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

' ================================Настройка LCD ===============================================

Declare LCD_Type=0         ' Тип ЖКИ - буквенно-цифровой
Declare LCD_DTPin PORTB.4         ' Порт данных ЖКИ
Declare LCD_ENPin PORTB.3         ' Управление цепью E
Declare LCD_RSPin PORTB.2         ' Управление цепью RS
Declare LCD_Interface 4           ' 4-х битная разрядность шины данных
Declare LCD_CommandUs 2000        ' Задержка перед посылкой команды
Declare LCD_DataUs 50             ' Задержка перед посылкой данных
Declare LCD_Lines 2               ' Количество строк ЖКИ

' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file
USB_Descriptor = "USBProjectDESC.inc"

' USB Buffer...
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Symbol DQ = PORTB.0 ' Подключить DS18B20 к выводу PORTB.0
Dim R_Temp As Word
' Переменная для получения значения температуры
' отдельными двумя байтами
Dim Temp As Float
' Переменная для преобразования значения
' температуры в данные с плавающей запятой
Dim TempIND As Float
' Переменная для вывода на индикацию значени
' температуры
Dim C As Bit
' Переменная для хранения бита сигнализации
' окончания преобразования
Dim i As Byte                                   ' index for loops and arrays
Dim temp_byte As Byte
Dim prom1 As Byte
Dim prom2 As Byte
Dim prom3 As Byte
Dim datt As Byte

Dim    USBBuffer [USBBufferSizeMax]As Byte
' зададим переменные для преобразования...
Dim USB_BUFFER As string*20
Dim AD_RESULT As ADRESL.Word
Dim VALUE As Word
Dim VOLTS As Byte
Dim MILLIVOLTS As Byte
Dim d1 As Float
' some useful flags...
Dim PP0 As Byte System        ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0  ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6     ' is USB attached

' --------------------------------------------Создание символа знака градуса ---------------------------------------
Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00 ' Поcлать на ЖКИ команду создания знака градуса,
' чтобы можно было на ЖКИ при печати цифры 8    видеть
' символ градуса
' ----------------------------------------------------------Заставка-------------------------------------------------------
Cls ' Очистить дисплей ЖКИ
Print At 1, 1, "1-Wire - DS18B20" ' Отобразить на жки надпись 1-Wire - DS18B20

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so                       *
' ************************************************************
GoSub AttachToUSB

'настроим АЦП
Adin_Res    10

Adin_Tad    FRC

Adin_Stime 100

TRISA.0=1    'порт A0 - аналоговый вход
TRISB=0
ADCON1=%10001110   'как аналоговый вход
ADCON2=%10000000

ProgramLoop:

'GoSub DoUSBIn
GoSub DoUSBOut
GoTo ProgramLoop

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
'DoUSBIn:
'   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
'   Return

' ************************************************************
' * transmit data                                            *
' ************************************************************
DoUSBOut:
GoSub   TERMO_Convert
Print At 2, 1, "T = ", Dec2 TempIND, " ", 8, "C " ' Отобразить на ЖКИ результаты измерений
'USB_BUFFER = Str$(Dec1,VOLTS)+"."+Str$(Dec2,MILLIVOLTS) 'два знака после запятой

USBBuffer[0] = 0
USBBuffer[1] = R_Temp.LowByte      ' значение температуры
USBBuffer[2] = R_Temp.HighByte     ' значение температуры

USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut    'строка передачи данных через USB
Return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
AttachToUSB:
Repeat
USBPoll
Until PP0 = ATTACHED_STATE
Return

TERMO_Convert: ' Метка начала подпрограммы измерения температуры
OWrite DQ, 1, [$CC,$44]
' Послать датчику DS18S20 команду старта измерения
' температуры
Repeat ' Начать внутренний цикл
DelayMS 25 ' Ждать окончания преобразования пока не придет бит,
ORead DQ, 4, ' сигнализирующий об окончании преобразования
Until C > 0
' Выйти из цикла если от DS18S20 поступил бит конца
' преобразования.
OWrite DQ, 1, [$CC,$BE]
' Послать команду чтения из ОЗУ датчика DS18S20
' значения температуры
ORead DQ, 2, [R_Temp.LowByte, R_Temp.HighByte]
' Прочитать значение температуры и записать
' полученные два байта данных в переменную R_Temp
' типа Word, младщий байт в R_Temp.LowByte и
' старший байт в R_Temp.HighByte
Temp = R_Temp
' Поместить в переменную Temp содержимое
' переменной R_Temp
TempIND = Temp / 16
' Разделить значение переменной Temp на 16 и
' результат поместить в переменную TempIND
If R_Temp > 64654 Then TempIND = Temp / 16 - 4095.93
Return ' Возврат из подпрограммы


Более подробно здесь: http://asemlab.net/
Сообщение отредактировал DNM - Пт, 10.04.2015, 10:46
ЯНДЕКС Дата: 09.04.2015
ADMIN Дата: Чт, 09.04.2015, 12:18  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Online

Судя по всему, блокирует строчка Repeat, так как нигде биту С ничего не присваивается. Этот бит должен быть где-то опрошен. Не так ли? А так получается, что создан бит в памяти МК и всегда равен нулю. Откуда бралась подпрограмма опроса DS18B20? Стоит внимательно посмотреть ее.
DNM Дата: Пт, 10.04.2015, 10:41  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 75
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Цитата ADMIN ()
Судя по всему, блокирует строчка Repeat, так как нигде биту С ничего не присваивается. Этот бит должен быть где-то опрошен. Не так ли? А так получается, что создан бит в памяти МК и всегда равен нулю. Откуда бралась подпрограмма опроса DS18B20? Стоит внимательно посмотреть ее.
Спасибо! точно не помню где бралась подпрограмма, возможно здесь. 
попробую изменить

Добавлено (10.04.2015, 10:41)
---------------------------------------------

Цитата ADMIN ()
Откуда бралась подпрограмма опроса DS18B20?
отсюда wink
http://www.picbasic.ru/publ/rabota_s_datchikom_ds18b20/2-1-0-60


Более подробно здесь: http://asemlab.net/
  • Страница 1 из 1
  • 1
Поиск: