AD - Wandler am AVR wie im Tutorial will nicht :(

Gast #548096
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.