www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVCC -> falsche Spannungen


Autor: anonymus (Gast)
Datum:

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

//----------------------------------------------------------------------

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass dein VCC 5V beträgt und AVCC 4,5V?
Wäre keine gute Idee.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  DDRC = 1,1,1,1,1,0;

Was ist das denn?

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

Da übergibst du 100 und nicht 4.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:

> Da übergibst du 100 und nicht 4.

Weder noch. 00100 = 0x40 = 64.

Autor: anonymus (Gast)
Datum:

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

//----------------------------------------------------------------------

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
anonymus schrieb:

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

PC4 = raus,
PC5 = rein.

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

PC5 = raus?

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

PC4 = rein.

Autor: Gregor B. (gregor54321)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xff | (0<<PIN5)
Ergebnis: 0xff

0x00 | (0<<PIN5)
Ergebnis: 0x00

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.