Hallo
ich habe einen DS1820 (9Bit Type) am Mega88 laufen.
Den code habe ich übernommen und abgeändert für eine Displayanzeige.
ich bekomme im Display 0 & 1 angezeigt die immer gleich sind.
also kein unterschied wenn sich die temperatur ändert.
ich lese nicht die ROM adresse aus. diese kann es also nicht sein.
aber was sehe ich da ???
der Code bleit immer gleich außer ich ziehe den datenpin ab.
Der Code kommt vom Ds1820 denke ich mal.
wenn ich beim Senden das byte "BE" weglasse bekomme ich 16x1
sonnst steht im Display immer
Byte 1 10100011
byte 2 01110010
byte 3 11011110
byte 4 10000000
am Display liegts nicht :-)
Ds1820 hängt an 5V + GND + Portpin + Pullup 4,7K nach 5V
technisch passt das. aber ich sehe nix :(
habe jetzt schon viel gelesen im Forum ... passt aber alles nicht zu mir
hier mal der Code (1 Seite das ist alles )
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <string.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 | #define WDDR DDRD
|
7 | #define WPORT PORTD
|
8 | #define WPIN 7
|
9 |
|
10 |
|
11 | void wire_high (void) {
|
12 | WDDR &= ~(1<<WPIN);
|
13 | }
|
14 |
|
15 | void wire_low (void) {
|
16 | WDDR |= (1<<WPIN);
|
17 | WPORT &= ~(1<<WPIN);
|
18 | }
|
19 |
|
20 | int wire_reset (void) {
|
21 |
|
22 | wire_low();
|
23 | _delay_us(500);
|
24 | wire_high();
|
25 |
|
26 | _delay_us(100);
|
27 |
|
28 | if (PIND & (1<<WPIN)) {
|
29 | return 0;
|
30 | } else {
|
31 | _delay_us(400);
|
32 | return 1;
|
33 | }
|
34 |
|
35 | }
|
36 |
|
37 | void senden (unsigned int wert) {
|
38 | int i = 0;
|
39 | int code = 0;
|
40 | for (i=0; i<8; i++) {
|
41 | code = ((wert >> i) & 1); //geht so!!!
|
42 | if (code == 1) {
|
43 | wire_low();
|
44 | _delay_us(60); //0 senden (60-120 us) 90
|
45 | wire_high();
|
46 | } else {
|
47 | wire_low();
|
48 | _delay_us(10); //1 senden (1-15 us) 7
|
49 | wire_high();
|
50 | }
|
51 | _delay_us(20);
|
52 | }
|
53 |
|
54 | }
|
55 |
|
56 | int empfang (void) {
|
57 | int i = 0;
|
58 | unsigned int zahl1 = 0;
|
59 | for (i=0; i<8; i++) {
|
60 |
|
61 | wire_low();
|
62 | _delay_us(1), //1
|
63 | wire_high();
|
64 | _delay_us(4); //4
|
65 |
|
66 | if (PIND & (1<<WPIN))
|
67 | {
|
68 | zahl1 = zahl1 + 1;
|
69 | lcd_string("1");
|
70 | }
|
71 | else
|
72 | lcd_string("0");
|
73 |
|
74 | zahl1 = zahl1 * 2; //2 für binär
|
75 |
|
76 | while (!(PIND & (1<<WPIN))) {
|
77 | _delay_us(2);
|
78 | }
|
79 |
|
80 |
|
81 | //_delay_us(80);
|
82 | }
|
83 |
|
84 | return zahl1;
|
85 | }
|
86 |
|
87 | int main (void) {
|
88 |
|
89 | lcd_init();
|
90 |
|
91 | while(1)
|
92 | {
|
93 |
|
94 | int ergebnis = wire_reset();
|
95 | if (ergebnis == 1)
|
96 | {
|
97 | senden (0xCC); //CC
|
98 | _delay_us(10); //10
|
99 |
|
100 | senden (0x44); //44
|
101 | _delay_us(100); //100
|
102 |
|
103 | wire_reset();
|
104 |
|
105 | senden (0xCC); //CC
|
106 |
|
107 |
|
108 | _delay_us(10); //10
|
109 | senden (0xBE); //BE
|
110 |
|
111 | _delay_ms(1000); //1000
|
112 |
|
113 | set_cursor(0,1);
|
114 | unsigned int wert1 = empfang();
|
115 |
|
116 | lcd_string("--");
|
117 |
|
118 | _delay_us(60);
|
119 | unsigned int wert2 = empfang();
|
120 |
|
121 |
|
122 | set_cursor(0,2);
|
123 | unsigned int wert3 = empfang();
|
124 |
|
125 | lcd_string("--");
|
126 |
|
127 | _delay_us(60);
|
128 | unsigned int wert4 = empfang();
|
129 |
|
130 | }
|
131 | else {
|
132 |
|
133 | set_cursor(0,1);
|
134 | lcd_string("geht nicht");
|
135 |
|
136 | }
|
137 | }
|
138 |
|
139 | return (0);
|
140 |
|
141 | }
|