Forum: Mikrocontroller und Digitale Elektronik AD - Wandler am AVR wie im Tutorial will nicht :(


von AVR (Gast)


Lesenswert?

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
}


von Copperhead (Gast)


Lesenswert?

Versuchs mal mit Port A - Port C hat keinen ADC

von AVR (Gast)


Lesenswert?

Oh sorry. Man sollte sich nicht blind auf das Tutorial verlassen. 
Probiere es morgen mal. Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.