AVCC -> falsche Spannungen

Gast #1955986
Guten Abend,

ich wollte mit dem Atmega8 eine Spannung an Pin PC4 (ADC4) auslesen.
Daher habe ich zwischen PIN PC5 und PC4 einen Potentiometer geklemmt.

Leider liefert mir der Pin PC5 nicht die volle Spannung. Es liegt nur 
zirka ein drittel an.

Weiß jemand woran das liegen kann?

Code:
//----------------------------------------------------------------------
#define   F_CPU 3686400     // Taktfrequenz des myAVR-Boards
#include  <avr\io.h>        // AVR Register und Konstantendefinitionen
#include <inttypes.h>    //Datentyplib
//----------------------------------------------------------------------
uint16_t readADC(uint8_t channel)
{

  //Avcc auf 4,5 V
  //AREF auf 4,5 V; Damit obere Messgrenze auf 4,5 V gelegt
  //GND zu GND
  //Funktion läuft über Avcc!!!!!

  uint8_t i;
  uint16_t result = 0;

  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);            //Den ADC 
aktivieren /Teilungsfaktor auf 64 stellen
  ADMUX = channel | (0<<REFS1) | (1<<REFS0);              //Avcc als 
Spannungsquelle verwenden /ADC4 messen

  ADCSRA |= (1<<ADSC);                        //ADC initialisieren 
/Dummyreadout machen
  while(ADCSRA & (1<<ADSC));

  for(i=0; i<3; i++)
  {
    ADCSRA |= (1<<ADSC);
    while(ADCSRA & (1<<ADSC));

    result += ADCW;
  }

  ADCSRA &= ~(1<<ADEN);

  result /= 3;

  return result;
}
//----------------------------------------------------------------------

int main (void)
{
  DDRB  = 0xff;
  DDRD  = 0xff;
  //DDRC  &= ~(0xff);
  DDRC = 1,1,1,1,1,0;

  while(1)
  {
    PORTC = (1<<PC5) | (0<<PC4);            //Eingang und Ausgang 
schalten

    uint16_t result = readADC(00100);          //ADC auslesen für Pin 
PC4 /ADC4

    if (result < 400)
    {
      //ADC auswerten
      PORTD = (1<<PD5) | (1<<PD6) | (1<<PD7);
    }
    //ADC auswerten
    if (result > 800)
    {
      //ADC auswerten
      PORTD = (1<<PD5) | (0<<PD6) | (0<<PD7);
    }
    //ADC auswerten
    if ((result < 801) and (result > 399))
    {
      //ADC auswerten
      PORTD = (1<<PD5) | (1<<PD6) | (0<<PD7);
    }
    //ADC auswerten

  }

  /* wird nie erreicht */
  return 0;
}

//----------------------------------------------------------------------
Moderator (Firma: Titel) Persönliche Seite
anonymus schrieb:
> Leider liefert mir der Pin PC5 nicht die volle Spannung. Es liegt nur
> zirka ein drittel an.
Was für ein Poti?

> Weiß jemand woran das liegen kann?
> DDRC = 1,1,1,1,1,0;
Was willst du damit bewirken?
Da steht länger geschrieben sowas:
DDRC = 1;
1;
1;
1;
1;
0;

holger schrieb:
>> uint16_t result = readADC(00100);          //ADC auslesen für Pin
> Da übergibst du 100 und nicht 4.
Da übergibst du eine oktale (!) 100, also mithin dezimale 64 ... :-o
Gast
Veränderte Version mit selben Ergebnis:

//----------------------------------------------------------------------
#define   F_CPU 3686400     // Taktfrequenz des myAVR-Boards
#include  <avr\io.h>        // AVR Register und Konstantendefinitionen
#include <inttypes.h>    //Datentyplib
//----------------------------------------------------------------------
uint16_t readADC(uint8_t channel)
{

  //Avcc auf 4,5 V
  //AREF auf 4,5 V; Damit obere Messgrenze auf 4,5 V gelegt
  //GND zu GND
  //Funktion läuft über Avcc!!!!!

  uint8_t i;
  uint16_t result = 0;

  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);            //Den ADC 
aktivieren /Teilungsfaktor auf 64 stellen
  ADMUX = channel | (0<<REFS1) | (1<<REFS0);              //Avcc als 
Spannungsquelle verwenden /ADC4 messen

  ADCSRA |= (1<<ADSC);                        //ADC initialisieren 
/Dummyreadout machen
  while(ADCSRA & (1<<ADSC));

  for(i=0; i<3; i++)
  {
    ADCSRA |= (1<<ADSC);
    while(ADCSRA & (1<<ADSC));

    result += ADCW;
  }

  ADCSRA &= ~(1<<ADEN);

  result /= 3;

  return result;
}
//----------------------------------------------------------------------

int main (void)
{
  DDRB  = 0xff;
  DDRD  = 0xff;
  //DDRC  &= ~(0xff);
  DDRC = (1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | 
(0<<PC5);

  while(1)
  {
    PORTC = (1<<PC5) | (0<<PC4);            //Eingang und Ausgang 
schalten

    uint16_t result = readADC(4);          //ADC auslesen für Pin PC4 
/ADC4

    if (result < 400)
    {
      //ADC auswerten
      PORTD = (1<<PD5) | (1<<PD6) | (1<<PD7);
    }
    //ADC auswerten
    if (result > 800)
    {
      //ADC auswerten
      PORTD = (1<<PD5) | (0<<PD6) | (0<<PD7);
    }
    //ADC auswerten
    if ((result < 801) and (result > 399))
    {
      //ADC auswerten
      PORTD = (1<<PD5) | (1<<PD6) | (0<<PD7);
    }
    //ADC auswerten

  }

  /* wird nie erreicht */
  return 0;
}

//----------------------------------------------------------------------
anonymus schrieb:

> Leider liefert mir der Pin PC5 nicht die volle Spannung. Es liegt nur
> zirka ein drittel an.


>   DDRC = (1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) |
> (0<<PC5);


Ähm.
Pins 1 bis 4 sind hier auf Ausgang geschaltet. Pin PC5 auf Eingang.

Bist du sicher, dass du nicht erst mal im Tutorial vorne anfangen 
solltest?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.