-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: ADCx liefern ständig Werte obwohl nichts angeschlossen ist

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Beiträge
    27

    ADCx liefern ständig Werte obwohl nichts angeschlossen ist

    Anzeige

    Hallo,

    ich wollte die beiden ADC-Ports nutzen um dort je einen Mikroschalter anzuschließen. Zum Auslesen der Werte nutze ich die Var. adc0 und adc1 die durch den adc-task gefühlt werden. Zum testen gebe ich das alles direkt in der while-Schleife alle 500ms aus.
    Problem ist nun das obwohl nichts an den ADC-Ports angeschlossen ist, dort Werte ausgegeben werden. Wie kann das sein? Kann das vielleicht jemand nachvollziehen?

    Anbei das Mini-Programm und die Terminal-Ausgaben:

    Code:
    #include "RP6RobotBaseLib.h" 	
    int main(void)
    {
    	initRobotBase(); 
    
    	// Main loop
    	while(true) 
    	{		
    		task_ADC();
    		mSleep(500);
    		writeString_P("ADC0: ");
    		writeInteger(adc0, DEC);
    		writeString_P("\n");
    		
    		writeString_P("ADC1: ");
    		writeInteger(adc1, DEC);
    		writeString_P("\n");
    	}	
    	return 0;
    }
    Code:
    Terminal:
    
    [READY]
    ADC0: 0
    ADC1: 0
    ADC0: 0
    ADC1: 0
    ADC0: 0
    ADC1: 0
    ADC0: 0
    ADC1: 0
    ADC0: 0
    ADC1: 0
    ADC0: 716
    ADC1: 0
    ADC0: 716
    ADC1: 529
    ADC0: 716
    ADC1: 529
    ADC0: 716
    ADC1: 529
    ADC0: 716
    ADC1: 529
    ADC0: 716
    ...
    Vielleicht weiß ja einer von euch Rat....

    mfg
    benx

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das Programm weiss gar nicht, dass nichts angeschlossen ist. Irgendein Ergebnis gibt die AD Wandlung immer. Wenn der Eingang offen ist, ist das ein mehr oder weniger zufälliger Wert der duch Störungen beeinflußt wird.
    Für Schalter sind ADC Eingänge irgendwie nicht das ideale.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Klingon77
    Registriert seit
    26.09.2006
    Ort
    Hunsrück
    Alter
    56
    Beiträge
    2.543
    hi,

    nun kenne ich die interne Beschaltung der ADC´s nicht.

    Such doch bitte mal unter dem Stichwort "Pullup" und "Pulldown" - Widerstände.

    Das könnte evtl. Dein Problem beheben.


    Falls ich mich irre korriegiert mich bitte.

    liebe Grüße,

    Klingon77
    Der kürzeste Weg zwischen zwei Menschen ist ein Lächeln - http://www.ad-kunst.de

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Beiträge
    27
    @Besserwessi: Ich dachte das ganze Port öffnen etc. übernimmt mir die Funktion task_adc() des RP6. Hmm.
    Der RP6 hat leider nur zwei freie ADC-Ports. Alles andere ist bereits belegt..

    @Klingon77: Soweit ich das gelesen habe, hat der Controller einen PullDown-Wiederstand bereits integriert....aber sicher bin ich mir nicht.

    Hmm.. Hat vielleicht sonst noch jemand einen Tipp?

    mfg
    benx

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Atmel Controller haben die möglichkeit interne Pullups zu aktivieren. Bei ADCs weden die aber in aller Regel nicht aktiviert. Das müßte man also schon noch selber machen. Gerade wenn die ADC Eingänge knapp sind, sollte man für einen Schalten einen Digitlen Eingang nutzen.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Beiträge
    27
    Es sind am RP6 soweit ich weiß leider keine digitalen Eingänge mehr frei. Daher der Versuch das ganze über den A/D-Eingang zu bewerkstelligen...

    mfg
    benx

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Übrigends sind die ADC-Ports natürlich auch digitale Ports. Man kann sie also auch digital abfragen:

    if(PINA & 1) ... // ADC0
    if(PINA & 2) ... // ADC1

    Zusätzliche "freie" digitale Ports wären noch die 4 LEDs (die keine Bumpers haben) und SCL/SDA des I2C am XBUS. Die haben allerdings je einen PullUp. E-INT am XBUS ist noch ein zusätzlich nutzbarer ADC-Port:

    http://www.roboternetz.de/phpBB2/zei...=348695#348695
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=32677

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Beiträge
    27
    Hi mic,

    ich dachte ich könnte mir das direkte ansprechen der PINs sparen und die Var. der task_ADC() Funktion nutzen. Wie muss ich die Schalter eigentlich anschließen, damit das klappt?

    thx.

    mfg
    benx

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Normalerweise schaltet man einen Taster zwischen Pin und GND. Der Pin wird dann als Eingang mit aktiviertem PullUp definiert. Ohne Taster ergibt die Abfrage eine 1 (5V über PullUp), mit Taster gedrückt erhält man 0 (Pin an GND):

    // Initialisierung
    DDRA &= ~3; // ADC0+1 auf Eingang (ist zwar default nach dem Einschalten, aber sicher ist sicher :)
    PORTA |= 3; // PullUp einschalten

    Nun kann man so die Tasten einlesen:

    // Abfrage
    uint8_t x;
    x=PINA & 3;

    Ohne Tasten ist x==3 weil beide Pins high sind (PullUps). Wenn eine Taste gedrückt wird, wird das entsprechende Bit zu 0:

    Taste gedrückt an ADC0 -> x==2 (3-1)
    Taste gedrückt an ADC1 -> x==1 (3-2)
    Beide Tasten -> x==0 (3-(2+1))

    Ein Beispiel:

    while(PINA & 2); // wartet bis Taste an ADC1 gedrückt wird

    Verwirrt? Ich hoffe nicht.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Bei mir funktioniert es wunderbar, vermutlich ist dein Taster nicht richtig angeschlossen.

    Code:
    #include "RP6RobotBaseLib.h"
    
    uint8_t x;
    
    int main(void)
    {
       initRobotBase();
       startStopwatch1();
    
       DDRA &= ~3; // ADC0+1 auf Eingang und
       PORTA |= 3; // PullUps einschalten
    
       // Main loop
       while(true)
       {
          if (getStopwatch1() > 500 )   {
             // Abfrage
    
             x=PINA & 3;
    
             // Taste gedrückt
    			writeString_P(" Port A: ");
    			writeInteger(x, 2); // Bitmuster binär ausgeben
    			writeString_P("\n");
             switch (x) {
                case 2:
                   writeString_P("ADC0 gedrückt!!! \n");
                break;
                case 1:
                   writeString_P("ADC1 gedrückt!!! \n");
                break;
                case 0:
                   writeString_P("ADC0 und ADC1 gedrückt!!! \n");
                break;
             }
    /*
             writeString_P("ADC0: ");
             writeInteger(adc0, DEC);
             writeString_P("\n");
    
             writeString_P("ADC1: ");
             writeInteger(adc1, DEC);
             writeString_P("\n");
    */
             setStopwatch1(0);
          }
       }
       return 0;
    }
    Macht diese Ausgabe:
    Code:
     Port A: 11
     Port A: 11
     Port A: 11
     Port A: 11
     Port A: 11
     Port A: 11
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 1
    ADC1 gedrûckt!!! 
     Port A: 11
     Port A: 10
    ADC0 gedrûckt!!! 
     Port A: 10
    ADC0 gedrûckt!!! 
     Port A: 10
    ADC0 gedrûckt!!! 
     Port A: 10
    ADC0 gedrûckt!!! 
     Port A: 10
    ADC0 gedrûckt!!! 
     Port A: 10
    ADC0 gedrûckt!!! 
     Port A: 11
     Port A: 11
     Port A: 11
     Port A: 0
    ADC0 und ADC1 gedrûckt!!! 
     Port A: 0
    ADC0 und ADC1 gedrûckt!!! 
     Port A: 0
    ADC0 und ADC1 gedrûckt!!! 
     Port A: 0
    ADC0 und ADC1 gedrûckt!!! 
     Port A: 11
     Port A: 11
     Port A: 11
     Port A: 11
    Gruß

    mic

    Edit: Scheint ja nun doch zu funktionieren :)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •