DNM |
Дата: Чт, 09.04.2015, 11:09 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
75
Замечания:
±
На сайте с 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
|
|
|
|
ADMIN |
Дата: Чт, 09.04.2015, 12:18 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Online
|
Судя по всему, блокирует строчка Repeat, так как нигде биту С ничего не присваивается. Этот бит должен быть где-то опрошен. Не так ли? А так получается, что создан бит в памяти МК и всегда равен нулю. Откуда бралась подпрограмма опроса DS18B20? Стоит внимательно посмотреть ее.
|
|
|
|
DNM |
Дата: Пт, 10.04.2015, 10:41 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
75
Замечания:
±
На сайте с 29.09.2011
Статус:
Offline
|
Цитата ADMIN ( ) Судя по всему, блокирует строчка Repeat, так как нигде биту С ничего не присваивается. Этот бит должен быть где-то опрошен. Не так ли? А так получается, что создан бит в памяти МК и всегда равен нулю. Откуда бралась подпрограмма опроса DS18B20? Стоит внимательно посмотреть ее. Спасибо! точно не помню где бралась подпрограмма, возможно здесь. попробую изменитьДобавлено (10.04.2015, 10:41) ---------------------------------------------
Цитата ADMIN ( ) Откуда бралась подпрограмма опроса DS18B20? отсюда http://www.picbasic.ru/publ/rabota_s_datchikom_ds18b20/2-1-0-60
Более подробно здесь: http://asemlab.net/
|
|
|
|