Hello Guys
I am trying to develop a humidity sensor with DHT11 for my bathroom. The DHT11 Sensor reads the humidity and sends it to the PIC, if the humidity is over 75% a LED should light up. If its under 75% the LED is off.
But I have two problems.
First of all I am programming the PIC16F676 with a PICKIT3 clone - and when trying to debug my code the following error appears in MPLAB (1) Error when trying to debug:
)
But now to my project:
If I upload (2)code without error-search), nothing really happens with the LED, when the humidity rises. Even if I change line 46 to "if ( int_RH > 0 )". This is probably the case because line 46 never happens. Thats because result isn't eaqual to 0.
So i tried to find out, where in the function "uint8_t Read_DHT ( uint8_t *data )" the problem happens.
And after changing the code to (3) Code with error-search) i found out, that the problem is due to the timeout in line 118
1 |
uint16_t timeout = 10000;
|
2 |
while ( SENSOR == 1 )
|
3 |
{
|
4 |
if ( --timeout == 0 )
|
5 |
{
|
6 |
return 0x0F;
|
7 |
}
|
8 |
}
|
Interesting:
If I upload the same code to a programming board with the PIC18F45K22 and add the DHT11 Sensor, everything works as it should. Sadly I am not able to use this programming board for my project. Therefore I would like to do it with the PIC16F676.
Have you guys any idea, how i can fix this problem?
If you need to know anything about the circuit, I added the schmetic to the attachment.
- I am new to the forum therefore I apologise if I forgot to add something you should know.
- Error when trying to debug:
1 |
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
|
2 |
make -f nbproject/Makefile-default.mk dist/default/debug/test.X.debug.elf
|
3 |
make[2]: Entering directory 'C:/Users/domin/Desktop/ueK_6/test.X'
|
4 |
"C:\Program Files\Microchip\xc8\v2.46\bin\xc8-cc.exe" -mcpu=16F676 -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="C:/Program Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16Fxxx_DFP/1.6.156/xc8" -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-2 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/debug/main.p1 main.c
|
5 |
::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage
|
6 |
make[2]: Leaving directory 'C:/Users/domin/Desktop/ueK_6/test.X'
|
7 |
make[2]: Entering directory 'C:/Users/domin/Desktop/ueK_6/test.X'
|
8 |
"C:\Program Files\Microchip\xc8\v2.46\bin\xc8-cc.exe" -mcpu=16F676 -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="C:/Program Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16Fxxx_DFP/1.6.156/xc8" -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-2 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/debug/configuration_bits.p1 configuration_bits.c
|
9 |
::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage
|
10 |
make[2]: Leaving directory 'C:/Users/domin/Desktop/ueK_6/test.X'
|
11 |
make[2]: *** [nbproject/Makefile-default.mk:143: dist/default/debug/test.X.debug.elf] Error 1
|
12 |
make[1]: *** [nbproject/Makefile-default.mk:85: .build-conf] Error 2
|
13 |
make: *** [nbproject/Makefile-impl.mk:39: .build-impl] Error 2
|
14 |
make[2]: Entering directory 'C:/Users/domin/Desktop/ueK_6/test.X'
|
15 |
"C:\Program Files\Microchip\xc8\v2.46\bin\xc8-cc.exe" -mcpu=16F676 -Wl,-Map=dist/default/debug/test.X.debug.map -D__DEBUG=1 -mdebugger=pickit3 -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="C:/Program Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16Fxxx_DFP/1.6.156/xc8" -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-2 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -Wl,--memorysummary,dist/default/debug/memoryfile.xml -o dist/default/debug/test.X.debug.elf build/default/debug/main.p1 build/default/debug/configuration_bits.p1
|
16 |
::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage
|
17 |
main.c:177:: error: (800) undefined symbol "btemp"
|
18 |
(908) exit status = 1
|
19 |
make[2]: Leaving directory 'C:/Users/domin/Desktop/ueK_6/test.X'
|
20 |
|
21 |
BUILD FAILED (exit value 2, total time: 1s)
|
- Code without error-search:
1 |
// -- INCLUDES ----------------------------------------------------------------
|
2 |
#include <xc.h> // Compiler-Include (Port-Defines)
|
3 |
#include <stdbool.h> // Include for data type 'bool' and keywords 'true' and 'false'
|
4 |
#include <stdint.h> // Include for defines the standard integer types per ISO/IEC 9899:1999
|
5 |
|
6 |
// -- DEFINES -----------------------------------------------------------------
|
7 |
#define _XTAL_FREQ 10000000 // Crystal oscillator frequencies of 10Mhz
|
8 |
#define LOOP_DELAY 1000 // Loop-Delay in ms
|
9 |
|
10 |
#define WARN_LED PORTCbits.RC2
|
11 |
|
12 |
#define SENSOR PORTAbits.RA2
|
13 |
#define SENSOR_TRIS TRISAbits.TRISA2
|
14 |
|
15 |
// -- FUNCTIONS-PROTOTYPE ----------------------------------------------------
|
16 |
uint8_t Read_DHT ( uint8_t *data );
|
17 |
|
18 |
// -- SETUP -------------------------------------------------------------------
|
19 |
|
20 |
void setup ( void )
|
21 |
{
|
22 |
ANSEL = 0x00;
|
23 |
TRISC = 0x00;
|
24 |
|
25 |
SENSOR_TRIS = 1;
|
26 |
}
|
27 |
|
28 |
// -- LOOP ---------------------------------------------------------
|
29 |
|
30 |
void loop ( void )
|
31 |
{
|
32 |
|
33 |
|
34 |
static uint8_t data[5] = { 0 };
|
35 |
|
36 |
uint8_t result = Read_DHT( data );
|
37 |
|
38 |
if ( result == 0 )
|
39 |
{
|
40 |
uint8_t int_RH = data[0];
|
41 |
uint8_t dec_RH = data[1];
|
42 |
uint8_t int_T = data[2];
|
43 |
uint8_t dec_T = data[3];
|
44 |
|
45 |
|
46 |
if ( int_RH > 75 )
|
47 |
{
|
48 |
WARN_LED = 1;
|
49 |
}
|
50 |
else
|
51 |
{
|
52 |
WARN_LED = 0;
|
53 |
}
|
54 |
}
|
55 |
}
|
56 |
|
57 |
// -- main -----------------------------------------------------------
|
58 |
|
59 |
void main ( void )
|
60 |
{
|
61 |
setup( );
|
62 |
|
63 |
// (Loop)
|
64 |
while ( 1 )
|
65 |
{
|
66 |
loop( );
|
67 |
__delay_ms( LOOP_DELAY );
|
68 |
}
|
69 |
}
|
70 |
|
71 |
// -- FUNCTIONS --------------------------------------------------------------
|
72 |
|
73 |
uint8_t Read_DHT ( uint8_t *data )
|
74 |
{
|
75 |
|
76 |
|
77 |
// SENSOR as OUTPUT
|
78 |
SENSOR_TRIS = 0;
|
79 |
SENSOR = 0;
|
80 |
//wait 18ms
|
81 |
|
82 |
__delay_ms( 18 );
|
83 |
|
84 |
SENSOR = 1;
|
85 |
|
86 |
|
87 |
__delay_us( 40 );
|
88 |
|
89 |
// SENSOR as INPUT
|
90 |
SENSOR = 0;
|
91 |
|
92 |
SENSOR_TRIS = 1;
|
93 |
|
94 |
uint16_t timeout = 10000;
|
95 |
while ( SENSOR == 1 )
|
96 |
{
|
97 |
if ( --timeout == 0 )
|
98 |
{
|
99 |
return 0x0F;
|
100 |
}
|
101 |
}
|
102 |
|
103 |
timeout = 10000;
|
104 |
while ( SENSOR == 0 )
|
105 |
{
|
106 |
if ( --timeout == 0 )
|
107 |
{
|
108 |
return 0xFF;
|
109 |
}
|
110 |
}
|
111 |
|
112 |
timeout = 10000;
|
113 |
while ( SENSOR == 1 )
|
114 |
{
|
115 |
if ( --timeout == 0 )
|
116 |
{
|
117 |
return 0xFF;
|
118 |
}
|
119 |
}
|
120 |
|
121 |
for ( uint8_t i = 0; i < 5; i++ )
|
122 |
{
|
123 |
for ( int8_t j = 7; j >= 0; j-- )
|
124 |
{
|
125 |
|
126 |
timeout = 10000;
|
127 |
while ( SENSOR == 0 )
|
128 |
{
|
129 |
if ( --timeout == 0 )
|
130 |
{
|
131 |
return 0xFF;
|
132 |
}
|
133 |
}
|
134 |
uint8_t signal_counter = 0;
|
135 |
timeout = 10000;
|
136 |
while ( SENSOR == 1 )
|
137 |
{
|
138 |
signal_counter++;
|
139 |
__delay_us( 1 );
|
140 |
if ( signal_counter > 100 )
|
141 |
{
|
142 |
return 0xFE;
|
143 |
}
|
144 |
}
|
145 |
|
146 |
|
147 |
|
148 |
if ( signal_counter > 30 )
|
149 |
{
|
150 |
data[i] |= (1 << j);
|
151 |
}
|
152 |
}
|
153 |
|
154 |
}
|
155 |
if ( ( uint8_t ) (data[0] + data[1] + data[2] + data[3]) != data[4] )
|
156 |
{
|
157 |
return 0xFF;
|
158 |
}
|
159 |
|
160 |
return 0;
|
161 |
|
162 |
|
163 |
}
|
- Code with error-search
1 |
// -- INCLUDES ----------------------------------------------------------------
|
2 |
#include <xc.h> // Compiler-Include (Port-Defines)
|
3 |
#include <stdbool.h> // Include for data type 'bool' and keywords 'true' and 'false'
|
4 |
#include <stdint.h> // Include for defines the standard integer types per ISO/IEC 9899:1999
|
5 |
|
6 |
// -- DEFINES -----------------------------------------------------------------
|
7 |
#define _XTAL_FREQ 10000000 // Crystal oscillator frequencies of 10Mhz
|
8 |
#define LOOP_DELAY 1000 // Loop-Delay in ms
|
9 |
|
10 |
#define WARN_LED PORTCbits.RC2
|
11 |
|
12 |
#define SENSOR PORTAbits.RA2
|
13 |
#define SENSOR_TRIS TRISAbits.TRISA2
|
14 |
|
15 |
// -- FUNCTIONS-PROTOTYPE ----------------------------------------------------
|
16 |
uint8_t Read_DHT ( uint8_t *data );
|
17 |
|
18 |
// -- SETUP -------------------------------------------------------------------
|
19 |
|
20 |
void setup ( void )
|
21 |
{
|
22 |
ANSEL = 0x00;
|
23 |
TRISC = 0x00;
|
24 |
|
25 |
SENSOR_TRIS = 1;
|
26 |
}
|
27 |
|
28 |
// --- loop ---------------------------------------------------------
|
29 |
|
30 |
void loop ( void )
|
31 |
{
|
32 |
|
33 |
|
34 |
static uint8_t data[5] = { 0 };
|
35 |
|
36 |
uint8_t result = Read_DHT( data );
|
37 |
// Error 1
|
38 |
if ( result == 0xFF )
|
39 |
{
|
40 |
while ( 1 )
|
41 |
{
|
42 |
WARN_LED = 1;
|
43 |
__delay_ms( 2000 );
|
44 |
WARN_LED = 0;
|
45 |
__delay_ms( 2000 );
|
46 |
}
|
47 |
}
|
48 |
|
49 |
// Error 2
|
50 |
if ( result == 0x0F )
|
51 |
{
|
52 |
while ( 1 )
|
53 |
{
|
54 |
WARN_LED = 1;
|
55 |
__delay_ms( 200 );
|
56 |
WARN_LED = 0;
|
57 |
__delay_ms( 200 );
|
58 |
}
|
59 |
}
|
60 |
|
61 |
if ( result == 0 )
|
62 |
{
|
63 |
uint8_t int_RH = data[0];
|
64 |
uint8_t dec_RH = data[1];
|
65 |
uint8_t int_T = data[2];
|
66 |
uint8_t dec_T = data[3];
|
67 |
|
68 |
|
69 |
if ( int_RH > 75 )
|
70 |
{
|
71 |
WARN_LED = 1;
|
72 |
}
|
73 |
else
|
74 |
{
|
75 |
WARN_LED = 0;
|
76 |
}
|
77 |
}
|
78 |
}
|
79 |
|
80 |
// -- main -----------------------------------------------------------
|
81 |
|
82 |
void main ( void )
|
83 |
{
|
84 |
setup( );
|
85 |
|
86 |
// (Loop)
|
87 |
while ( 1 )
|
88 |
{
|
89 |
loop( );
|
90 |
__delay_ms( LOOP_DELAY );
|
91 |
}
|
92 |
}
|
93 |
|
94 |
// -- FUNCTIONS --------------------------------------------------------------
|
95 |
|
96 |
uint8_t Read_DHT ( uint8_t *data )
|
97 |
{
|
98 |
|
99 |
|
100 |
// SENSOR as OUTPUT
|
101 |
SENSOR_TRIS = 0;
|
102 |
SENSOR = 0;
|
103 |
//wait 18ms
|
104 |
|
105 |
__delay_ms( 18 );
|
106 |
|
107 |
SENSOR = 1;
|
108 |
|
109 |
|
110 |
__delay_us( 40 );
|
111 |
|
112 |
// SENSOR as INPUT
|
113 |
SENSOR = 0;
|
114 |
|
115 |
SENSOR_TRIS = 1;
|
116 |
|
117 |
uint16_t timeout = 10000;
|
118 |
while ( SENSOR == 1 )
|
119 |
{
|
120 |
if ( --timeout == 0 )
|
121 |
{
|
122 |
return 0x0F;
|
123 |
}
|
124 |
}
|
125 |
|
126 |
timeout = 10000;
|
127 |
while ( SENSOR == 0 )
|
128 |
{
|
129 |
if ( --timeout == 0 )
|
130 |
{
|
131 |
return 0xFF;
|
132 |
}
|
133 |
}
|
134 |
|
135 |
timeout = 10000;
|
136 |
while ( SENSOR == 1 )
|
137 |
{
|
138 |
if ( --timeout == 0 )
|
139 |
{
|
140 |
return 0xFF;
|
141 |
}
|
142 |
}
|
143 |
|
144 |
for ( uint8_t i = 0; i < 5; i++ )
|
145 |
{
|
146 |
for ( int8_t j = 7; j >= 0; j-- )
|
147 |
{
|
148 |
|
149 |
timeout = 10000;
|
150 |
while ( SENSOR == 0 )
|
151 |
{
|
152 |
if ( --timeout == 0 )
|
153 |
{
|
154 |
return 0xFF;
|
155 |
}
|
156 |
}
|
157 |
uint8_t signal_counter = 0;
|
158 |
timeout = 10000;
|
159 |
while ( SENSOR == 1 )
|
160 |
{
|
161 |
signal_counter++;
|
162 |
__delay_us( 1 );
|
163 |
if ( signal_counter > 100 )
|
164 |
{
|
165 |
return 0xFE;
|
166 |
}
|
167 |
}
|
168 |
|
169 |
|
170 |
|
171 |
if ( signal_counter > 30 )
|
172 |
{
|
173 |
data[i] |= (1 << j);
|
174 |
}
|
175 |
}
|
176 |
|
177 |
}
|
178 |
if ( ( uint8_t ) (data[0] + data[1] + data[2] + data[3]) != data[4] )
|
179 |
{
|
180 |
return 0xFF;
|
181 |
}
|
182 |
|
183 |
return 0;
|
184 |
|
185 |
|
186 |
}
|