Hi,
Ich habe mich mit dem AD - Wandler des AVRs beschäftigt. Ich
programmiere einen ATMega16, der mit 8 MHz getaktet ist. Ich bin wie im
Tutorial beschrieben vorgegangen. Ich möchte an Pin P0 an Port C ein
analoges Signal einlesen. Um die Spannung darzustellen habe ich einen
Spannungsteiler herangezogen. Ich messe also ab PC0 die Spannung an
einem Widerstand. Diese liegt zwischen 0V und 1,5 V. Ich gebe diesen
Wert auf dem Display aus. Ich möchte ersteinmal nur die Schritte (Bits 0
- 255) ausgeben um zu sehen ob es geht. Leider erhalte ich mit folgendem
Quellcode nur Zufallswerte, wie es scheint. Hierzu den Quelltext:
1 | #include <avr/io.h>
|
2 | #include "LCD_Libary_Aktuell.h"
|
3 |
|
4 |
|
5 | uint8_t ADC_Read (uint8_t Kanal)
|
6 | {
|
7 | uint8_t i;
|
8 |
|
9 | uint16_t Ergebnis;
|
10 | Ergebnis = 0;
|
11 |
|
12 |
|
13 | ADCSRA = ( 1 << ADEN ) | ( 1 << ADPS2 ) | ( 1 << ADPS1 ); //ADC wird aktiviert und ein Teilungsfaktor
|
14 | //von 64 wird eingestellt
|
15 |
|
16 | ADMUX = Kanal; //Zu messende Kanal wird ausgewählt
|
17 |
|
18 | ADMUX |= ( 1 << REFS1 ) | ( 1 << REFS0 ); //Interne Referenzspannung von 2,56 V wird ausgewählt
|
19 |
|
20 | ADCSRA |= ( 1 << ADSC ); //Initialisieren des ADC
|
21 |
|
22 | while (ADCSRA & ( 1 << ADSC )) //Dummyreadout
|
23 | {
|
24 |
|
25 | }
|
26 |
|
27 | for ( i = 0; i < 3; i ++) //Am Kanal anstehende analoge Spannung wird drei Mal einglesen
|
28 | {
|
29 |
|
30 | ADCSRA |= ( 1 << ADSC ); //Messung der analogen Spannung
|
31 |
|
32 | while (ADCSRA & ( 1 << ADSC )) //Dummyreadout
|
33 | {
|
34 |
|
35 | }
|
36 |
|
37 | Ergebnis += ADCW; //Summe der eingelesenen analogen Spannungen wird berechnet
|
38 |
|
39 | }
|
40 |
|
41 | ADCSRA &=~ ( 1 << ADEN ); //Deaktivieren des ADC
|
42 |
|
43 | Ergebnis = Ergebnis / 3; //Mittelwert der eingelesenen analogen Spannungen wird berechnet
|
44 |
|
45 | return (Ergebnis);
|
46 |
|
47 | }
|
48 |
|
49 |
|
50 | void main ()
|
51 | {
|
52 | char Resultat [8];
|
53 | int i;
|
54 |
|
55 | DDRD = 0xff;
|
56 | PORTD = 0xff;
|
57 |
|
58 | DDRC = 0x00;
|
59 | PORTD = 0x00;
|
60 | initlcd();
|
61 |
|
62 | lcd_pos (1,1);
|
63 | lcd_text("Wert:");
|
64 |
|
65 | while(1)
|
66 | {
|
67 | uint16_t Ergebnis = ADC_Read(0);
|
68 |
|
69 | for (i = 1; i == 10000; i ++)
|
70 | {
|
71 | asm("nop");
|
72 | }
|
73 |
|
74 | lcd_pos (1, 7);
|
75 | sprintf (Resultat, "%d",Ergebnis);
|
76 | lcd_text(Resultat);
|
77 | }
|
78 | return (0);
|
79 | }
|