Ich probiere gerade einen DS18B20 mit einem STM32F103C8 auszulesen.
Dabei scheine ich ein Timingproblem zu haben, ich komme aber nicht
dahinter.
Für die Delays habe ich mir den Systick etwas genauer angesehen und
folgend implementiert:
Delay.c:
1 | volatile uint32_t us_tick, ms_tick;
|
2 |
|
3 | /*__IO uint32_t TimingDelay;
|
4 | uint32_t MillisCounter = 0;*/
|
5 |
|
6 | /**
|
7 | * @brief Decrements the TimingDelay variable.
|
8 | * @param None
|
9 | * @retval None
|
10 | */
|
11 |
|
12 | void SysTick_Handler(void){
|
13 | us_tick++; //Increment millisecond variable
|
14 | if(us_tick%1000 == 999){ //If 1000 milliseconds have passed, increment seconds
|
15 | ms_tick++;
|
16 | }
|
17 | }
|
18 |
|
19 | void Delay_Ms(__IO uint32_t nTime){
|
20 | volatile uint32_t msStart = ms_tick;
|
21 | while((ms_tick - msStart) < nTime){
|
22 | asm volatile("nop");
|
23 | }
|
24 | }
|
25 |
|
26 | void Delay_us(__IO uint32_t nTime){
|
27 | volatile uint32_t usStart = us_tick;
|
28 | while((us_tick - usStart) < nTime){
|
29 | asm volatile("nop");
|
30 | }
|
31 | }
|
sowie ganz am Anfang der int main(void){} folgende Zeilen:
1 | SystemInit(); //ensure CPU is running t correctly set clock speed
|
2 | SystemCoreClockUpdate(); //update SystemCoreClock variable to current clock speed
|
3 | SysTick_Config(SystemCoreClock/1000000); //systick every microsecond
|
Das habe ich mit Delay_Ms(1000) sowie Delay_us(1000000) an einer LED
ausprobiert. Wirkt auch stabil.
Für das Timing der einzelnen Funktionen habe ich mich an
https://www.maximintegrated.com/en/app-notes/index.mvp/id/126 sowie das
Datenblatt des DS18B20 gehalten.
Im Anhang sind die OneWire.c und .h
(folgende Zeilenangaben beziehen sich auf OneWire.c)
In Zeile 34 prüfe ich das "Lebenszeichen" des Sensors, "err" bleibt
dabei auf 0. Sensor sollte also da sein ...
Wenn ich in Zeile 128 einen Breakpoint setzte sehe ich, dass die beiden
gelesenen Bytes immer 0xff beinhalten.
Laut Datenblatt soll für die Datenleitung ja ein 4,7kOhm verwendet
werden. An dem Pull-Up des uC's wird es doch nicht liegen? (laut
Datenblatt min 30kOhm, typ 40kOhm, max 50kOhm)
Liebe Grüße