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
|