Ich habe es noch etwas "aufpoliert", es ist mehr lesbar und einfacher zu
andern. Leider bleibt der Fehler bestehen. Am DS18S20 kann es nicht
liegen, weil ich ein Paar davon habe, und bei allen der Fehler
auftaucht.
Also der Fehler: Ich kriege lauter "1" gelesen.
1 | #define F_CPU 1000000
|
2 | #include <avr/io.h>
|
3 | #include "lcd-routines.h"
|
4 | #include <util/delay.h>
|
5 |
|
6 | void delay_us ( uint8_t us )
|
7 | {
|
8 | for(; us > 0; us--) _delay_us(1);
|
9 | }
|
10 |
|
11 | void dq_low(uint8_t period){
|
12 | DDRB |= (1<<PB1);
|
13 | PORTB &= ~(1<<PB1);
|
14 | delay_us(period);
|
15 | DDRB &= ~(1<<PB1);
|
16 | }
|
17 |
|
18 | int ow_reset(void){
|
19 | dq_low(480);
|
20 | _delay_us(80);
|
21 | while((PINB & (1<<PINB1))){
|
22 |
|
23 | }
|
24 | _delay_us(300);
|
25 | return 1;
|
26 | }
|
27 |
|
28 | uint8_t ow_write_byte(uint8_t value){
|
29 | uint8_t i = 0;
|
30 |
|
31 | for(i=0; i<8; i++){
|
32 | if(value & (1<<i)){
|
33 | dq_low(1);
|
34 | delay_us(115);
|
35 | } else {
|
36 | dq_low(100);
|
37 | delay_us(10);
|
38 | }
|
39 | };
|
40 | delay_us(50);
|
41 | return 1;
|
42 | }
|
43 |
|
44 | uint8_t ow_read_byte(void){
|
45 | uint8_t i = 0;
|
46 | uint8_t result = 0;
|
47 |
|
48 | for(i=0;i<8;i++){
|
49 | dq_low(2);
|
50 | _delay_us(14);
|
51 | if(PINB & (1<<PINB1)){
|
52 | result |= (1<<i);
|
53 | }
|
54 | _delay_us(1);
|
55 | }
|
56 | return result;
|
57 | }
|
58 |
|
59 |
|
60 | int main(void)
|
61 | {
|
62 | uint8_t s0 = 0;
|
63 | uint8_t s1 = 0;
|
64 |
|
65 | lcd_init();
|
66 | ow_reset();
|
67 | ow_write_byte(0xCC);
|
68 | ow_write_byte(0xBE);
|
69 | s0 = ow_read_byte(); // = 0xFF - WHY ?!
|
70 | s1 = ow_read_byte(); // = 0xFF - WHY ?!
|
71 |
|
72 | ow_reset();
|
73 |
|
74 | lcd_setcursor(0,1);
|
75 | lcd_byte_binary(s0);
|
76 | lcd_setcursor(0,2);
|
77 | lcd_byte_binary(s1);
|
78 |
|
79 | return 1;
|
80 | }
|