2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
विषयवस्तुसारणी
१.१ सॉफ्टवेयर तथा हार्डवेयर वातावरणस्य सूचना
२.१ हार्डवेयर इन्टरफेस् सर्किट्
2.2 FSB DS18B20 इत्यस्य IO विन्यस्यति
2.3 Keil परियोजना सञ्चिकाः जनयन्तु
३.२ DS18B20 चालकस्य कार्यान्वयनम्
Renesas R7FA8D1BH (Cortex®-M85) पृष्ठद्वयस्य कूदकार्यं प्राप्तुं DS18B20 तथा ADC नियन्त्रयति
अयं लेखः मुख्यतया Renesas R7FA8D1BH (Cortex®-M85) कृते डिजाइनं कृतं व्यापकं अनुप्रयोगप्रकरणं परिचययति: एकं बसप्रोटोकॉलं कार्यान्वितुं R7FA8D1BH इत्यस्य IO प्रयोक्तुं तथा च ds18b20 चालनस्य कार्यस्य साक्षात्कारः मुख्यतया तापमानमूल्यं पठितुं मूल्यं च स्वरूपयति स्क्रीन् मध्ये OLED इत्यत्र प्रदर्शयति। तापमानदत्तांशः क्रमिकपोर्ट् टर्मिनल् मार्गेण सीरियल पोर्ट् टर्मिनल् प्रति अपि प्रेष्यते ।
सॉफ्टवेयर तथा हार्डवेयर सूचना | संस्करण सूचना |
---|---|
रेनेसास एमसीयू | R7FA8D1BH |
केइल | एमडीके आर्म ५.३८ |
FSP संस्करणम् | 5.3.0 |
त्रुटिनिवारणसाधनम्: N32G45XVL-STB | DAP-LINK इति |
लेखकः Wildfire Yaoyang विकास बोर्ड_Renesas RA8 इत्यस्य उपयोगं कर्तुं चयनं कृतवान् अस्य बोर्डस्य मुख्यं नियन्त्रण MCU R7FA8D1BHECBD अस्ति, तथा च 7FA8D1BHECBD इत्यस्य मूलं ARM Contex-M85 अस्ति ।
R7FA8D1BHECBD चिप् कृते, प्रयुक्तः कोरः Cortex®-M85 Core अस्ति, ST-LINK-V2 अथवा J-LINK-V9 डाउनलोड् करणं तथा त्रुटिनिवारणकार्यं समर्थयति नास्ति ।अनेकप्रयत्नानन्तरं लेखकः तत् प्राप्नोत्N32G45XVL-एसटीबीबोर्डेन सह यत् DAP-LINK आगच्छति तत् R7FA8D1BHECBD डाउनलोड् कृत्वा त्रुटिनिवारणं कर्तुं शक्नोति ।
अधोलिखितं चित्रं N32G45XVL-STB विकासबोर्डस्य भौतिकचित्रम् अस्ति:
DS18B20 इत्यस्य अन्तरफलकपरिपथं Yaoyang Development Board_Renesas RA8 इत्यत्र डिजाइनं कृतम् अस्ति, यत् DS18B20 इत्यस्य DQ नियन्त्रणसंकेतरूपेण P809 अन्तरफलकस्य उपयोगं करोति ।
P809 इत्येतत् सामान्य IO अन्तरफलकरूपेण विन्यस्यताम्, ततः कोडमध्ये IO इत्यस्य आउटपुट् अथवा आउटपुट् स्थितिं गतिशीलरूपेण विन्यस्यताम्
FSP इत्यस्य पैरामीटर् विन्यासं सम्पन्नं कृत्वा, भवान् Generate Project कर्तुं शक्नोति । परियोजनासञ्चिकां उद्घाटयन्तु, तस्य संरचना एतादृशी अस्ति ।
चालकसङ्केतं कार्यान्वितुं ds18b20.c सञ्चिकां रचयन्तु
लेखकेन पूर्वमेव स्वस्य पूर्वलेखे DS18B20 इत्यस्य समयस्य कार्यान्वयनस्य च तर्कस्य विस्तरेण विश्लेषणं कृतम् अस्ति, अतः अहम् अत्र तस्य परिचयं न करिष्यामि ।
DS18B20 एप्लिकेशन नोट_Ds18b20 रीडिंग डेटा-CSDN ब्लॉग के तरंगरूप
कोडस्य पङ्क्तिः १४ : अस्मान् step delay function परिभाषयतु
कोडस्य पङ्क्तिः १५ : ms step delay function परिभाषयन्तु
कोडस्य रेखा १८ : DS18B20 इत्यस्य IO PIN परिभाषयन्तु
कोडस्य पङ्क्तिः २१ : इनपुट् पोर्ट् विन्यासः
कोडस्य पङ्क्तिः २२ : आउटपुट् पोर्ट् विन्यासः
कोडस्य पङ्क्तिः २४ : IO निम्नस्तरं सेट् कुर्वन्तु
कोडस्य पङ्क्तिः २५ : IO उच्चस्तरं सेट् कुर्वन्तु
कोडस्य पङ्क्तिः ४७ : इनपुट् मोड् मध्ये IO इत्यस्य स्थितिं पठन्तु
कार्यं: ds18b20Init, DS18B20 ऑनलाइन अस्ति वा इति ज्ञातव्यम्
कार्य: ds18b20BlockModeProcess। DS18B20 इत्यस्य मूल्यं पठन्तु
- /**
- * @brief reset DS18B20
- * @note if reset ds18b20 sucess, the return value is TRUE
- * @param None
- * @retval True or Flalse
- */
- static uint8_t ds18b20Init( void )
- {
- uint16_t tempCnt = 0;
- bsp_io_level_t status;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- // Master pin is high
- DQ_SET_HIGH;
- timeDelayUS(10);
-
- // Master pin is low
- DQ_SET_LOW;
- // wait for 600 us
- timeDelayUS(750);
-
- // Set PIN mode input
- DS_Mode_IN_PUT();
-
- while(1)
- {
- status = DQ_RAD_PIN();
- if( status == 0)
- {
- tempCnt = 0;
- return TRUE;
- }
- else
- {
- timeDelayUS(1);
- tempCnt++;
- if( tempCnt > 480 )
- return FALSE;
- }
- }
- }
-
-
- static uint8_t readBit( void )
- {
- uint8_t readCnt = 2;
- uint8_t bitVal = 1;
-
- DQ_SET_LOW;
- timeDelayUS(3);
- DQ_SET_HIGH;
-
- timeDelayUS(5); // 15 us
-
- while(readCnt-- )
- {
- //read DQ value
- if( DQ_RAD_PIN() == 0)
- {
- bitVal = 0;
- }
- timeDelayUS(2); // 15 us
- }
-
- timeDelayUS(30); // 15 us
-
- return bitVal;
- }
-
- static uint8_t ds18b20ReadByte( void )
- {
- uint8_t byteVal = 0;
-
- for ( uint8_t i = 0; i < 8; i++ )
- {
- byteVal >>= 1;
-
- uint8_t bitVal = readBit();
- if( bitVal > 0)
- {
- byteVal |= 0x80;
- }
- }
-
- return byteVal;
- }
-
-
- /**
- * @brief write one byte to DS18B20
- * @note
- * @param byte: the data that is sended to ds18b20
- * @retval None
- */
- void ds18b20WriteByte( uint8_t byte)
- {
- unsigned char k;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- for ( k = 0; k < 8; k++ )
- {
- if (byte & (1<<k))
- {
- DQ_SET_LOW;
- timeDelayUS(2);
-
- DQ_SET_HIGH;
- timeDelayUS(65);
- }
- else
- {
- DQ_SET_LOW;
- timeDelayUS(65);
-
- DQ_SET_HIGH;
- timeDelayUS(2);
- }
- }
- }
-
- uint8_t ds18b20BlockModeProcess( void )
- {
- uint16_t tempValue;
- uint8_t tempL, tempH;
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
-
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // start convert temperature
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
-
- return TRUE;
- }
-
-
- // NO blocking mode operate ds18b20
- uint8_t ds18b20NoBlockingProcess( void )
- {
- uint16_t tempValue;
- static uint16_t waitCnt = 0;
- uint8_t tempL, tempH;
- static uint8_t runState = 0;
-
- switch( runState )
- {
- default:
- case INIT_DQ:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_READY;
- break;
-
- case WAIT_READY:
- timeDelayUS(2); // IDEL
- runState = SKIDROM_CMD;
- break;
-
- case SKIDROM_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // begin to convert temperature data
- waitCnt = 0;
- runState = WAIT_CONVERT;
- break;
-
- case WAIT_CONVERT:
- waitCnt++;
- if( waitCnt > WAIT_CNT_CONVERT)
- {
- waitCnt = 0;
- runState = RESET_CMD;
- }
- break;
-
- case RESET_CMD:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_DATA_READY;
- break;
-
- case WAIT_DATA_READY:
- timeDelayUS(2); // IDEL
- runState = READ_CMD;
- break;
-
- case READ_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
- runState = GET_VALUE;
- break;
-
- case GET_VALUE:
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
- runState = INIT_DQ;
- return TRUE;
- }
-
- return FALSE;
- }
कोडस्य पङ्क्तिः ११३ : ds18b20 इत्यस्य मूल्यं पठन्तु
कोडस्य रेखा १३० : ds18b20 इत्यस्य परिणामदत्तांशं प्राप्नुवन्तु
कोडस्य पङ्क्तिः १३१ : प्रारूपितः प्रदर्शनदत्तांशः
कोडस्य पङ्क्तिः १३२ : OLED इत्यत्र आँकडानां प्रदर्शनं कुर्वन्तु
कोडं संकलितं कृत्वा कोडं बोर्ड् मध्ये डाउनलोड् कुर्वन्तु ।
DS18B20 चालकसङ्केतः
1) ds18b20.c सञ्चिकां रचयित्वा निम्नलिखित कोडं लिखन्तु
- /*
- FILE NAME : ds18b20.c
- Description: user ds18b20 interface
- Author : [email protected]
- Date : 2024/06/03
- */
- #include "ds18b20.h"
- #include "hal_data.h"
-
- typedef enum{
- INPUT = 0,
- OUTPUT = 1,
- }IO_TYPE;
-
- typedef enum{
- FALSE = 0,
- TRUE = 1,
- }RETURN_RESULT;
-
- typedef enum{
- INIT_DQ = 0,
- WAIT_READY,
- SKIDROM_CMD,
-
- WAIT_CONVERT,
- RESET_CMD,
- READ_CMD,
-
- WAIT_DATA_READY,
- GET_VALUE,
- IDLE_NULL
- }RUN_STATE;
-
- ds18b20Struc st_ds1b20val;
-
-
- ds18b20Struc get_ds18b20_value( void )
- {
- return st_ds1b20val;
- }
-
- static bsp_io_level_t DQ_RAD_PIN(void)
- {
- bsp_io_level_t state;
-
- // READ io
- R_IOPORT_PinRead(&g_ioport_ctrl, DS_IO_PORT_PIN, &state);
-
- return state;
- }
-
- /**
- * @brief reset DS18B20
- * @note if reset ds18b20 sucess, the return value is TRUE
- * @param None
- * @retval True or Flalse
- */
- static uint8_t ds18b20Init( void )
- {
- uint16_t tempCnt = 0;
- bsp_io_level_t status;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- // Master pin is high
- DQ_SET_HIGH;
- timeDelayUS(10);
-
- // Master pin is low
- DQ_SET_LOW;
- // wait for 600 us
- timeDelayUS(750);
-
- // Set PIN mode input
- DS_Mode_IN_PUT();
-
- while(1)
- {
- status = DQ_RAD_PIN();
- if( status == 0)
- {
- tempCnt = 0;
- return TRUE;
- }
- else
- {
- timeDelayUS(1);
- tempCnt++;
- if( tempCnt > 480 )
- return FALSE;
- }
- }
- }
-
-
- static uint8_t readBit( void )
- {
- uint8_t readCnt = 2;
- uint8_t bitVal = 1;
-
- DQ_SET_LOW;
- timeDelayUS(3);
- DQ_SET_HIGH;
-
- timeDelayUS(5); // 15 us
-
- while(readCnt-- )
- {
- //read DQ value
- if( DQ_RAD_PIN() == 0)
- {
- bitVal = 0;
- }
- timeDelayUS(2); // 15 us
- }
-
- timeDelayUS(30); // 15 us
-
- return bitVal;
- }
-
- static uint8_t ds18b20ReadByte( void )
- {
- uint8_t byteVal = 0;
-
- for ( uint8_t i = 0; i < 8; i++ )
- {
- byteVal >>= 1;
-
- uint8_t bitVal = readBit();
- if( bitVal > 0)
- {
- byteVal |= 0x80;
- }
- }
-
- return byteVal;
- }
-
-
- /**
- * @brief write one byte to DS18B20
- * @note
- * @param byte: the data that is sended to ds18b20
- * @retval None
- */
- void ds18b20WriteByte( uint8_t byte)
- {
- unsigned char k;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- for ( k = 0; k < 8; k++ )
- {
- if (byte & (1<<k))
- {
- DQ_SET_LOW;
- timeDelayUS(2);
-
- DQ_SET_HIGH;
- timeDelayUS(65);
- }
- else
- {
- DQ_SET_LOW;
- timeDelayUS(65);
-
- DQ_SET_HIGH;
- timeDelayUS(2);
- }
- }
- }
-
- uint8_t ds18b20BlockModeProcess( void )
- {
- uint16_t tempValue;
- uint8_t tempL, tempH;
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
-
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // start convert temperature
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
-
- return TRUE;
- }
-
-
- // NO blocking mode operate ds18b20
- uint8_t ds18b20NoBlockingProcess( void )
- {
- uint16_t tempValue;
- static uint16_t waitCnt = 0;
- uint8_t tempL, tempH;
- static uint8_t runState = 0;
-
- switch( runState )
- {
- default:
- case INIT_DQ:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_READY;
- break;
-
- case WAIT_READY:
- timeDelayUS(2); // IDEL
- runState = SKIDROM_CMD;
- break;
-
- case SKIDROM_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // begin to convert temperature data
- waitCnt = 0;
- runState = WAIT_CONVERT;
- break;
-
- case WAIT_CONVERT:
- waitCnt++;
- if( waitCnt > WAIT_CNT_CONVERT)
- {
- waitCnt = 0;
- runState = RESET_CMD;
- }
- break;
-
- case RESET_CMD:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_DATA_READY;
- break;
-
- case WAIT_DATA_READY:
- timeDelayUS(2); // IDEL
- runState = READ_CMD;
- break;
-
- case READ_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
- runState = GET_VALUE;
- break;
-
- case GET_VALUE:
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
- runState = INIT_DQ;
- return TRUE;
- }
-
- return FALSE;
- }
-
-
-
- /* End of this file */
2) ds18b20.h सञ्चिकां रचयित्वा निम्नलिखित कोड लिखन्तु
- /*
- FILE NAME : ds18b20.h
- Description: user ds18b20 interface
- Author : [email protected]
- Date : 2024/06/03
- */
- #ifndef DS18B20_H
- #define DS18B20_H
- #include "hal_data.h"
-
-
- #define WAIT_CNT_CONVERT 500
-
- #define timeDelayUS(us) R_BSP_SoftwareDelay(us, BSP_DELAY_UNITS_MICROSECONDS);
- #define DS_DELAY_MS(ms) R_BSP_SoftwareDelay(ms, BSP_DELAY_UNITS_MILLISECONDS);
-
-
- #define DS_IO_PORT_PIN BSP_IO_PORT_08_PIN_09
-
-
- #define DS_Mode_IN_PUT() R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_INPUT)
- #define DS_Mode_Out_PP() R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_OUTPUT)
-
- #define DQ_SET_LOW R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_LOW)
- #define DQ_SET_HIGH R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_HIGH)
-
-
- typedef struct{
- float temperatureVal;
- bool sign;
- }ds18b20Struc;
-
- uint8_t ds18b20BlockModeProcess( void );
- ds18b20Struc get_ds18b20_value( void );
-
-
- #endif /* DS18B20_H */
-
-