www.mikrocontroller.net

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


Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

#include <avr/io.h>
#include "LCD_Libary_Aktuell.h"


uint8_t ADC_Read (uint8_t Kanal)
{
  uint8_t i;

  uint16_t   Ergebnis;
        Ergebnis = 0;

    
  ADCSRA  =  ( 1 << ADEN ) | ( 1 << ADPS2 ) | ( 1 << ADPS1 );  //ADC wird aktiviert und ein Teilungsfaktor
                                    //von 64 wird eingestellt

  ADMUX  =  Kanal;                        //Zu messende Kanal wird ausgewählt
  
  ADMUX  |=  ( 1 << REFS1 ) | ( 1 << REFS0 );          //Interne Referenzspannung von 2,56 V wird ausgewählt

  ADCSRA |=  ( 1 << ADSC );                    //Initialisieren des ADC

  while (ADCSRA & ( 1 << ADSC ))                  //Dummyreadout
  {

  }

  for ( i = 0; i < 3; i ++)                    //Am Kanal anstehende analoge Spannung wird drei Mal einglesen
  {
      
    ADCSRA |=  ( 1 << ADSC );                  //Messung der analogen Spannung              

    while (ADCSRA & ( 1 << ADSC ))                //Dummyreadout
    {

    }

    Ergebnis +=  ADCW;                      //Summe der eingelesenen analogen Spannungen wird berechnet
    
  }

  ADCSRA &=~  ( 1 << ADEN );                    //Deaktivieren des ADC
    
  Ergebnis  =   Ergebnis / 3;                  //Mittelwert der eingelesenen analogen Spannungen wird berechnet

  return (Ergebnis);    

}


void main ()
{
  char Resultat [8];
  int i;

  DDRD    = 0xff;
  PORTD  = 0xff;

  DDRC    = 0x00;
  PORTD   = 0x00;
  initlcd();

  lcd_pos (1,1);
  lcd_text("Wert:");

  while(1)
  {
     uint16_t   Ergebnis  =  ADC_Read(0);      

     for (i = 1; i == 10000; i ++)
     {
         asm("nop");
     }

     lcd_pos (1, 7);
     sprintf (Resultat, "%d",Ergebnis);
     lcd_text(Resultat);
  }
  return (0);
}    



Autor: Copperhead (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit Port A - Port C hat keinen ADC

Autor: AVR (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.