1 | #define ADC_VREF_TYPE 0x00 //External VREF
|
2 | //#define ADC_VREF_TYPE 0x40 //AVCC mit externem Kondesator an VREF PIN
|
3 | //#define ADC_VREF_TYPE 0xc0 //Interne 2,56V Spanung referentz
|
4 |
|
5 | //#define ADC_PRESCALER 0x01 //Prescaler 2
|
6 | //#define ADC_PRESCALER 0x02 //Prescaler 4
|
7 | //#define ADC_PRESCALER 0x03 //Prescaler 8
|
8 | //#define ADC_PRESCALER 0x04 //Prescaler 16
|
9 | //#define ADC_PRESCALER 0x05 //Prescaler 32
|
10 | //#define ADC_PRESCALER 0x06 //Prescaler 64
|
11 | #define ADC_PRESCALER 0x07 //Prescaler 128
|
12 |
|
13 | // Inhalt von ADCW Register bei 0°C, Aus KTY81.xls lesen
|
14 | #define NULL_KTY81 300
|
15 |
|
16 | unsigned char LCD_Buffer[21]
|
17 |
|
18 | //############################################################################
|
19 | // Routine Initialisiert ADC
|
20 | void adc_init(void)
|
21 | //############################################################################
|
22 | {
|
23 | // ADC initialization
|
24 | // ADC Clock frequency:SYSCLK/ADC_PRESCALER
|
25 | // ADC Voltage Reference: ADC_VREF_TYPE
|
26 |
|
27 | ADMUX=ADC_VREF_TYPE;
|
28 |
|
29 | ADCSRA=(1<<ADEN)|ADC_PRESCALER;
|
30 |
|
31 | }
|
32 |
|
33 | //########################################################################
|
34 | // Routine liest Ein Analog eingang
|
35 | //########################################################################
|
36 | signed int read_adc(unsigned char adcinput)
|
37 | {
|
38 | // ADC Inpit und Aref-Quelle auswählen
|
39 | ADMUX=adcinput | ADC_VREF_TYPE;
|
40 |
|
41 | // Starte AD Konversion
|
42 | ADCSRA|=1<<ADSC;
|
43 |
|
44 | while ((ADCSRA & (1<<ADIF))==0);// Warte bis AD Konversion fertig ist
|
45 | ADCSRA|=(1<<ADIF); // Lösche ADC Interrupt Flag
|
46 |
|
47 | return ADCW;
|
48 | }
|
49 |
|
50 |
|
51 | //########################################################################
|
52 | // Liest Temperatur von KTY81 Sensor
|
53 | // Rückgabewert ist Temperatur(°C) * 2
|
54 | // z.B. 0=0°C; 50=25°C; 37=16,5°C; -8=-4°C usw.
|
55 | //########################################################################
|
56 | signed int read_KTY81(unsigned char ADC_input)
|
57 | {
|
58 | signed int Temperatur;
|
59 |
|
60 | Temperatur=read_adc(ADC_input);
|
61 | Temperatur-=NULL_KTY81;
|
62 |
|
63 | return Temperatur;
|
64 |
|
65 | }
|
66 |
|
67 | //########################################################################
|
68 | // Zeigt Temperatur auf LCD; Messberech -20°C bis 100°C; Auflösung 0,5°C
|
69 | //########################################################################
|
70 | void temperatur2LCD(unsigned char ADC_input)
|
71 |
|
72 | {signed int Temperatur;
|
73 | Temperatur=read_KTY81(ADC_input);
|
74 | itoa(Temperatur/2,Buffer,10); // Zeigt Ganze°C mit Vorzeichen
|
75 | lcd_puts(LCD_Buffer);
|
76 | lcd_puts("."); // Zeigt Dezimalpunkt
|
77 | itoa(abs(5*(Temperatur%2)),Buffer,10); //Zeigt Nachkommastelle ohne Vorzeichen
|
78 | lcd_puts(LCD_Buffer);
|
79 | lcd_puts("\xde\x43 ");// Zeigt "°C"
|
80 | }
|