1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 |
|
5 | unsigned int ADC_value, zahl, x, ergebniss;
|
6 | unsigned char einer, rest, zehner, hunderter;
|
7 |
|
8 |
|
9 | #define T1 0xEF // Transistor 1 = ON
|
10 | #define T2 0xDF // Transistor 2 = ON
|
11 | #define T3 0xBF // Transistor 3 = ON
|
12 | #define T4 0x7F // Transistor 4 = ON
|
13 |
|
14 |
|
15 |
|
16 | void wert_zerlegen (void)
|
17 | {
|
18 | einer = ADC_value % 10; // Einer
|
19 | rest = ADC_value / 10;
|
20 | zehner = rest % 10; // Zehner
|
21 | hunderter = rest / 10; // Hunderter
|
22 | }
|
23 |
|
24 |
|
25 | void main (void)
|
26 | {
|
27 | DDRB = 0xFF; // Richtungsregister Port B auf Ausgang
|
28 | DDRC = 0xFF; // Richtungsregister Port C auf Ausgang
|
29 | PORTB = 0xFF; // Port B = High (7-Segm. Anzeige OFF)
|
30 | PORTC = 0xFF; // Port C = High (Transistoren sperren)
|
31 |
|
32 |
|
33 |
|
34 | //**** Init ADC ****
|
35 | ADCSRA |= 1<<ADEN; // ADC aktivieren
|
36 | ADCSRA |= (1<<ADPS1)|(1<<ADPS2); // Vorteiler auf 64
|
37 | ADMUX |= (1<<REFS0)|(1<<REFS1); // Einstellung Uref = 2,56V
|
38 | ADMUX |= (1<<MUX0); // ADC1 (PIN PD4) als ADC-Kanal definieren
|
39 |
|
40 | ADMUX |= (0<<ADLAR); // Ausgabe = linksbündig
|
41 | DIDR0 |= 1<<ADC1D; // Digital Input Kanal ADC1D disabled
|
42 |
|
43 | // nach Aktivieren des ADC wird ein "Dummy-Readout" empfolen, man liest
|
44 | // also einen Wert ein und verwirft diesen, um den ADC "warmlaufen zu lassen"
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | const unsigned char segmenttable[11] =
|
50 | {
|
51 | // Wertetabelle der 7-Segmentcodierung:
|
52 | 0x03, 0xF3, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x19, 0xFE
|
53 | };
|
54 | // 0 1 2 3 4 5 6 7 8 9 dp
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | ADCSRA |= (1<<ADSC); // Start ADC-Wandlung
|
61 | while (ADCSRA & (1<<ADSC)); // auf Abschluss der Konventierung warten
|
62 | x=ADC; // Ergebnis der nächsten Wandlung nicht übernommen
|
63 |
|
64 |
|
65 | while (1)
|
66 | {
|
67 |
|
68 | zahl ++;
|
69 |
|
70 | if(zahl == 50) // wenn "zahl" 50
|
71 | {
|
72 | ADCSRA |= (1<<ADSC); // Start ADC-Wandlung
|
73 | while (ADCSRA & (1<<ADSC)); // auf Abschluss der Konvertierung warten
|
74 | ADC_value = ADC;
|
75 | ADC_value = (ADC-200)/4+2; // Anpassung an die Temperaturkennlinie (y=kx+d) + Korrekturfaktor
|
76 | zahl = 0;
|
77 |
|
78 | if(ADC_value < 0)
|
79 | {
|
80 | PORTB = T4;
|
81 | PORTC = 0xFD;
|
82 | _delay_ms(5);
|
83 | }
|
84 |
|
85 | if(ADC_value >= 0)
|
86 | {
|
87 |
|
88 | wert_zerlegen();
|
89 |
|
90 |
|
91 | PORTB = T1; // Anzeige 1 aktivieren
|
92 | PORTC = segmenttable [einer]; // Ausgabe der EINER auf 1. Anzeige
|
93 | _delay_ms(5);
|
94 |
|
95 | PORTB = T2; // Anzeige 2 aktivieren
|
96 | PORTC = segmenttable [zehner]; // Ausgabe der ZEHNER auf 2. Anzeige
|
97 | _delay_ms(5);
|
98 |
|
99 | PORTB = T3; // Anzeige 3 aktivieren
|
100 | PORTC = segmenttable [hunderter]; // Ausgabe der HUNDERTER auf 3. Anzeige
|
101 | _delay_ms(5);
|
102 |
|
103 | }
|
104 |
|
105 | }
|
106 |
|
107 | }
|
108 | }
|