Forum: Mikrocontroller und Digitale Elektronik ADC PIN 6 dauerhaft 5V


von DA_RULA (Gast)


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?

von Chris (Gast)


Lesenswert?

Zeile 42 in deinem Code!

von DA_RULA (Gast)


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;




}

von Karl H. (kbuchegg)


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?

von DA_RULA (Gast)


Lesenswert?

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

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

von DA_RULA (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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)

von Karl H. (kbuchegg)


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!

von DA_RULA (Gast)


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

von DA_RULA (Gast)


Lesenswert?

Ich habe noch mal gemessen sobald ich den gefragten pin als Input 
deklariere kommen diese 5 V wenn ich diesen aber als Output und null 
setze dann habe ich auch 0...

von DA_RULA (Gast)


Lesenswert?

Mein Signal was ich Wandeln wollen würde hat auch z.b eine Wertigkeit 
von 3V und wenn ich das zusammen stecke habe ich an gleicher stelle die 
5V gemessen und somit imer Maximal wert.

von Karl H. (kbuchegg)


Lesenswert?

Im Schaltplan sehe ich, dass von PINA5 eine Leitung zu einem Jumperfeld 
geht, konkret JP12 (wenn ich mich beim Linienverfolgen nicht verhaut 
habe) und von dort weiter zu einem Pullup-Widerstand und IC5.

Ist der Jumper bei dir gesteckt?

von DA_RULA (Gast)


Lesenswert?

Ja der ist gesteckt

von DA_RULA (Gast)


Lesenswert?

Ich sehe das Problem ich werde es mal ohne versuchen

von DA_RULA (Gast)


Lesenswert?

cool danke das mit den 5V ist schon mal gelöst !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.