ADC PIN 6 dauerhaft 5V

Gast #3173536
Lesenswert?

Hallo...

Ich habe folgendes Problem ich möchte 8 Sensoren auswerten und habe das 
Problem das mein PINA6 immer 5 V raushaut am Atmega 32... doch leider 
kann ich nicht sagen warum... habe den Fehler nun schon Soweit 
eingegrenzt das dieser Irgendwo im Programm oder auf dem Pollin 
Evaluationbord liegen muss denn habe ich meine Schaltung von diesem 
getrennt ist es immer noch der Fall das 5V ausgegeben werden und alles 
anderen ADC´s haben low potential..

Muss ich nach dem ich die ADC`s  intitialisiert habe in einer 
Interrupt-Routine im Main die Eingänge zusätzlich mit:

DDRA = 0x00;

deklarieren oder ist dies nicht unbedingt notwendig.
Wo könnte der Fehler liegen?
Gast #3173546
Lesenswert?

#include <avr/io.h>
#include "lcd-routines.h"
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>


extern uint16_t readAD0(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD1(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD2(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD3(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD4(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD5(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD6(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION
extern uint16_t readAD7(uint8_t channel);  // Aufruf 
AD-WANDLUNGSFUNKTION

int main(void)
{

  // Variablendeklaration
   float  wert_wandler0 ,wert_wandler1 ,wert_wandler2,
                wert_wandler3,wert_wandler4 ,wert_wandler5 
,wert_wandler6,
                wert_wandler7;


   uint8_t data = 0;


  // Arrays für LCD-Azeigewerte
  char  Anzeige1[22];
  char  Anzeige2[22];
  char  Anzeige3[22];
  char  Anzeige4[22];

  // LCD-initialisieren
  lcd_init();

  //Eingänge definieren

  DDRA  = 0x00;
  DDRB  = 0xFF;
  DDRC  = 0x03;
  DDRD  = 0xFF;


  // Taktgeber inititialiseren

  TCCR2 = (1 << WGM20) | (1<< COM21) | (1<< CS20) | (0<<CS21) | 
(1<<CS22); // f = 16MHz/ 1024 *256
  OCR2 = 127;



    while(1)
    {




    // Werte von AD-Wandler lesen und umrechnen

    wert_wandler0 = readAD0(0);
    wert_wandler0 =  wert_wandler0*5/1024;
    wert_wandler1 = readAD1(0);
    wert_wandler1 =  wert_wandler1*5/1024;
    wert_wandler2 = readAD2(0);
    wert_wandler2 =  wert_wandler2*5/1024;
    wert_wandler3 = readAD3(0);
    wert_wandler3 =  wert_wandler3*5/1024;
    wert_wandler4 = readAD4(0);
    wert_wandler4 = wert_wandler4*5/1024;
    wert_wandler5 = readAD5(0);
    wert_wandler5 = wert_wandler5*5/1024;
    wert_wandler6 = readAD6(0);
    wert_wandler6 = wert_wandler6*5/1024;
    wert_wandler7 = readAD7(0);
    wert_wandler7 = wert_wandler7*5/1024;
  }

/*
 * AD_WANDLUNG
 *
 * Created: 25.02.2013 10:20:16
 *
 */

#include <avr/io.h>
#include <util/delay.h>
#include<avr/interrupt.h>



 uint16_t readAD0 (uint8_t channel)
{
  uint8_t i;
  uint16_t result0 = 0;

  // den ADC aktivieren und Teilungsfaktor auf 8 stellen
  ADCSRA = (1<<ADEN)| 0x03;

  // Kanal des Multiplexers wählen Kanal1
  // interne Referenz: ACC

  ADMUX = (0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0)|(1<<REFS0);
  // den ADC initialisieren und ein sog. Dummyreadout machen
  ADCSRA |=  (1<<ADSC);


   while(ADCSRA & ( 1<<ADSC));

  //Jetzt die analoge Spannung an Kanal  auslesen
      for (i=0;i<5;i++)
     {
  //eine Wandlung
  ADCSRA |= (1<<ADSC);
  // Ergebnis holen
  while(ADCSRA & (1<<ADSC));

      result0 += ADCW;
     }
     // ADC deaktivieren
     ADCSRA &=(1<<ADEN);
     result0=result0 /5;
     return result0;




}
#3173596
Lesenswert?

DA_RULA schrieb:

>   ADMUX = (0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0)|(1<<REFS0);


Und was hat das jetzt mit PinA6 zu tun?


Lustig
1
extern uint16_t readAD0(uint8_t channel);  // Aufruf 
2
AD-WANDLUNGSFUNKTION
3
extern uint16_t readAD1(uint8_t channel);  // Aufruf 
4
AD-WANDLUNGSFUNKTION
5
extern uint16_t readAD2(uint8_t channel);  // Aufruf 
6
AD-WANDLUNGSFUNKTION
7
extern uint16_t readAD3(uint8_t channel);  // Aufruf 
8
AD-WANDLUNGSFUNKTION
9
extern uint16_t readAD4(uint8_t channel);  // Aufruf 
10
AD-WANDLUNGSFUNKTION
11
extern uint16_t readAD5(uint8_t channel);  // Aufruf 
12
AD-WANDLUNGSFUNKTION
13
extern uint16_t readAD6(uint8_t channel);  // Aufruf 
14
AD-WANDLUNGSFUNKTION
15
extern uint16_t readAD7(uint8_t channel);  // Aufruf 
16
AD-WANDLUNGSFUNKTION

8 Wnadlungsfunktionen, für jeden Kanal eine, die dann auch noch die 
Nummer des zu sampelnden Kanals mitkriegen.
Warum reicht denn eine einzige nicht? Wäre das zu einfach gewesen?



Was heißt 'raushaut'?

Hast du die Spannung am Pin gemessen, oder meinst du damit den 
Zahlenwert, der vom ADC kommt?
#3173626
Lesenswert?

DA_RULA schrieb:

> Über das ADMUX-Register wird doch der Kanal des ADC eingestellt und die
> Referenzspannung oder sehe ich das etwa falsch?

Schon.
Aber in deiner Anfrage schreibst du vom PINA6.
Der Code den du zeigst, die FUnktion, benutzt aber gar nicht den PINA6. 
Da wird mit den MUX Bits ein Zugriff auf PINA5 eingestellt.
Ergo - die Funktion ist dafür überhaupt nicht zuständig.

> Wie müsste es denn aussehen das ich nicht jedesmal alle durch
> wandeln muss sondern nur den Kanal den ich gerade benötige?

AVR-GCC-Tutorial
Da gibt es einen Abschnitt über den ADC (mag sein, dass er mitlerweile 
eine eigene Subseite bekommen hat. Nach ADC im verlinkten Artikel suchen 
und dann weiter klicken)
#3173630
Lesenswert?

DA_RULA schrieb:
> Also mit raushauen ist gemeint das ich die Spannung am Pin gemessen habe
> sprich über die 40Polige Steckleiste vom Pollin Board

ok.
Dann musst du rausfinden, warum das so ist.
Ein einfacher Test ist ja, den Pin auf Ausgang programmieren und 0 bzw. 
1 ausgeben und nachsehen, was die Spannung macht.

Dann die Umkehrung:
Pin auf Eingang und das gelesene vom Pin mal wo ausgeben (zb auf einer 
LED). Dann den Pin (über einen Widerstand) mal auf + und dann auf - 
verbinden. Die Anzeige (die LED) muss entsprechend reagieren.

Und Achtung: Ein offener Eingangspin, also einer an dem nichts hängt, 
ist nicht zwangsläufig auf 0!
Gast #3173644
Lesenswert?

aaaaaaaaaaaaah.... sorry meinte natürlich den PINA5 der logischer weise 
durch die das Nullte Bit(Pin) bei der leiste auf 6 liegt sonst stimmt 
das schon...

über diesen Artikel bin ich auch schon zu diesen einstellungen gekommen, 
aber leider werde ich daraus nicht so richtig schlau warum ich 5V an dem 
Pin messe... bzw. wie ich die sache mit den "tausend" wandlungsaufrufen 
kürzer gestallten kann als interrupt habe ich es ja nun schon 
geschrieben... aber ich will ja auch nicht immer alle werte gleichzeitig 
haben sondern zu bestimmten zeitpunkten möchte ich bestimmte werte 
vergleichen um nachfolgend deverse teile anzusteuern

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren