temperatur.c


1
#define F_CPU 12000000
2
#define RAND_MAX 10
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <string.h>
6
#include <stdlib.h>
7
8
#define WDDR   DDRA
9
#define WPORT  PORTA
10
#define WPIN   0
11
12
char seg[] = {0x20, 0x40, 0x10, 0x80, 0x08, 0x00};
13
char zahl[] = {0xF9, 0x88, 0xB5, 0x9D, 0xCC, 0x5D, 0x7D, 0x89, 0xFD, 0xDD, 0x00};
14
char sonder[] = {0x04, 0xC5, 0x71, 0x02, 0x00}; // 0x04 = minus; 0xC5 = Gradzeichen; 0x71 = C; 0x02 = PUNKT
15
char codes[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00};
16
17
18
19
void wire_high (void) {
20
WDDR &= ~(1<<WPIN);
21
}
22
23
void wire_low (void) {
24
WDDR |= (1<<WPIN);
25
WPORT &= ~(1<<WPIN);
26
}
27
28
int wire_reset (void) {
29
30
wire_low();
31
_delay_us(500);
32
wire_high();
33
34
_delay_us(150);
35
36
int i = 0;
37
while ((!(PINA & (1<<WPIN))) || (i < 27)) { //Beendet Schleife falls PINA Low oder zulange auf High = keine antwort
38
_delay_us(5);
39
i++;
40
 }
41
42
if (i > 25) { //falls keine Antwort vom Sensor ret 0 da i==26
43
return 0;
44
} else {
45
return 1;
46
}
47
48
}
49
50
void senden (int wert) {
51
int i = 0;
52
int code = 0;
53
for (i=0; i<8; i++) {
54
code = (wert & codes[i]);
55
if (code == 1) {
56
wire_low();
57
_delay_us(90); //0 senden (60-120 us)
58
wire_high();
59
} else {
60
wire_low();
61
_delay_us(7); //1 senden (1-15 us)
62
wire_high();
63
  }
64
_delay_us(70);
65
66
 }
67
68
}
69
70
int empfang (void) {
71
int i = 0;
72
unsigned int zahl1 = 0;
73
for (i=0; i<8; i++) {
74
75
zahl1 = zahl1 * 10; //+1 stelle
76
77
wire_low();
78
_delay_us(1),
79
wire_high();
80
_delay_us(17);
81
82
if (PINA & (1<<WPIN))
83
zahl1 = zahl1 + 1;
84
//else  <-- else unnötig da sowieso 0
85
//zahl1 = 0;
86
87
_delay_us(90);
88
 }
89
90
return zahl1;
91
}
92
93
94
void ausgeben (unsigned int wert) {
95
int i, code = 0;
96
//wert = 11110000; wird bei aktivem Code richtig ausgegeben
97
for (i=0; i<8; i++) {
98
code = (wert & codes[i]);
99
 if (code) {
100
   PORTC = zahl[1];
101
 } else {
102
   PORTC = zahl[0];
103
  }
104
  _delay_ms(500);
105
  PORTC = 0x00;
106
  _delay_ms(100);
107
 }
108
}
109
110
111
int main (void) {
112
113
DDRD = 0xFF;
114
DDRC = 0xFF;
115
PORTD = seg[4];
116
117
int ergebnis = wire_reset();
118
if (ergebnis == 0) {
119
PORTC = zahl[8]; //falls sensor gefunden als info
120
senden (0xCC);
121
senden (0x44);
122
_delay_us(50);
123
wire_reset();
124
senden (0xCC);
125
senden (0xBE);
126
int wert1 = empfang();
127
int wert2 = empfang();
128
_delay_us(3);
129
ausgeben (wert2);
130
131
} else {
132
PORTC = zahl[9]; // zur übersicht falls kein sensor gefunden
133
}
134
135
return 0;
136
}
137
// 0x20 = 1. Segment
138
// 0x40 = 2. Segment
139
// 0x10 = 3. Segment
140
// 0x80 = 4. Segment
141
// 0x08 = 5. Segment
142
//PORTD = SEGMENTE
143
//PORTC = ZEICHEN
144
//-------------------------
145
// 0x01 = PIN0 = mitte oben
146
// 0x02 = PUNKT
147
// 0x04 = PIN2 = mittelstrich
148
// 0x08 = PIN3 = unten rechts
149
// 0x10 = PIN4 = mitte unten
150
// 0x20 = PIN5 = unten links
151
// 0x40 = PIN6 = oben links
152
// 0x80 = PIN7 = oben rechts
153
//----------------------------
154
// F9 = 0
155
// 88 = 1
156
// B5 = 2
157
// 9D = 3
158
// CC = 4
159
// 5D = 5
160
// 7D = 6
161
// 89 = 7
162
// FD = 8
163
// DD = 9