- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: ADC-Pin Pullup aktivieren

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348

    ADC-Pin Pullup aktivieren

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich habe eben versucht an einem ADC-Pin eines Atmega328p den internen Pullup zu aktivieren und mittels des Bascom-Befehls GetAdc anschließend den ADC-Wert auszulesen.
    Man sollte doch davon ausgehen, dass man dann den Wert 1024 zurück bekommt. Ich bekomme allerdings flatternde Werte, wie wenn der Pin offen hängt.
    Kann es sein, dass der Befehl GetAdc den Pullup wieder ausschaltet bevor er mit dem Messen anfängt?

    Ich hoffe Ihr habt eine Idee wieso das so ist?

    Viele Grüße

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    .. ADC-Pin eines Atmega328p den internen Pullup .. Man sollte doch davon ausgehen, dass man dann den Wert 1024 zurück bekommt ..
    Maximaler Rückgabewert ist 1023.

    Ich kann kein Bascom, aber schließ doch mal einen Widerstand, sagen wir mal so 10k bis 40k an den entsprechenden Pin gegen Vcc (5V oder 3,3V). Das ist ein "externer" Pullup. Dann solltest Du die 1023 sehen . . .

    .. habt eine Idee wieso das so ist? ..
    Da gibts einige Möglichkeiten (die meisten habe ich schon hinter mir): falsche Initialisierung des ADCs (denke an die Mindest-Samplezeit - siehe Dokumentation), Pin als Ausgang deklariert, falscher Pin abgefragt, Pin falsch abgefragt (Abfrage benutzt den Namen z.B. PINB, PB4 und nicht PORTB, PB4) und leider noch etliche mehr :-/
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Hi,

    ich habe jetzt mal einen externen widerstand angeschlossen und jetzt sehe ich auch die 1023.
    Bei der Aktivierung des internen pullups bin ich mir absolut sicher das ich das richtig gemacht habe!
    Bei den benachbarten Pins ist der pullup auch an wie es sein soll.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Ich sehe da zwei Möglichkeiten:

    1. Der Prozessor läßt es nicht zu, daß der Pullup aktiviert ist, wenn der Pin auf analog geschaltet wird. Das sollte ein Blick in das Datenblatt klären.

    2. Bascom schaltet den Pullup ab, wenn der ADC aktiviert wird. Ob das im Bascom Manual steht?

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hallo demmy,
    ich habe ein BASCOM-Miniprogram mit den beiden Kommandos CONFIG ADC und GETADC kompiliert und den Maschinencode angeschaut. Der Pullup-Widerstand wird da nicht angefaßt.

    In den schematischen Zeichnungen im Datenblatt kann ich auch nicht erkennen, daß durch die HW automatisch bei Messung der interne Pullup-Widerstand abgeschaltet werden könnte (kann ich natürlich nicht richtig interpretiert haben und trotzdem sein).

    Um Dein Programm wirklich auszuschließen, poste es doch mal hier. Wenn es nicht zu umfangreich ist, könnte ich es auf einem ATMega88 mal laufen lassen, der ja bis auf die Speichergröße gleich ist.

    Welche Bascom Version ist es und welche genaue Bezeichnung hat der µC?
    Ist AVCC mit Spannung versorgt und der betreffende ADC-Pin gänzlich unbeschaltet?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    Noch ne Frage: welche Plaltine (Schaltung?) benutzt Du und welchen ADC-Pinn genau? Atmega328p als SMD? Der hat ja ADC6 und ADC7 verfügbar die beim PDIP NICHT zur Verfügung stehen.

    .. ich habe jetzt mal einen externen widerstand angeschlossen und jetzt sehe ich auch die 1023 ..
    Wie wärs, wenn Du jetzt als externes Signal für den ADC-Pinn einen Spannunsteiler baust - so etwa 50 % Vcc, danach nochn Test mit rund 30% Vcc und Dir danach den ADC-Wert ausgeben lässt. Das sollte sinnvolle Ergebnisse bringen - wenn "alles" korrekt läuft.

    Anm.: ich hatte schon Controller so krank bekommen, dass die liefen - aber nicht mehr zu flashen waren, dass man sie flashen konnte, aber EINZELNE Pinne tatens nicht bzw. nicht korrekt usw usf. Die Tests könnten so einen Fehler eingrenzen oder aufdecken.

    Weiter mit nem Test von eben.
    Ich benutzte hier als IDE AVR Studio 4.18 Build 700. Aktuell ein Test mit (m)einer Servotester-Software, in C, für nanoclone 328p/20 MHz (!!) mit Poti 10K auf ADC7 zum Variieren der Servoposition. Initialisierung - in C!
    Code:
    // ============================================================================= =
    // ===  Initialisierung fuer ADC/mega328/ADC7   MIT Interrupt free running
    // ===    ADC7/PC7 auf 10 Bit,  fertige Wandlung ###>>> löst Interrupt aus
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void ADC0_i10free (void)      // Init m328/ADC7, 10 Bit, free runn. Interrupt
     {                            //          Kanal 0 <=> Temperatur RN VNRN-VN2
    // - - - - - - - - - - - - - - -                        Datenblatt 8271C-AVR-08/10
      ADMUX        |=  (1<<MUX2)|(1<<MUX1)|(1<<MUX0);       //                     264
      ADMUX        |=  (1<<REFS0);  // Referenzspannung ist AVcc                 S 263
                                    //
      ADCSRA       |=  (1<<ADEN);   // ADC Enable                                  264
      ADCSRA       |=  (1<<ADSC);   // starte gleich die erste Wandlung            264
      ADCSRA       |=  (1<<ADIE);   // ADC Interrupt Enable                        265
      ADCSRA       |=  (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);    // Prescal clock/128   265
      ADCSRA       |=  (1<<ADATE);  // Auto Triggering Enable                      265
                    // es wird bei clock 20 Mhz mit ca. 80 µs getriggert
                    // genauer: ca 12 Zyklen in 1 ms <=> 1200 Hz
      In_adc        =  0;           // Durchlaufzähler ADC zum Kanalumschalten
     }              // Ende von void ADC_in_10free(void)
    // ============================================================================= =
    Und dabei war es beim Test von eben unerheblich, ob ich den Pinn bei Programmbeginn auf 1/1 (DDRC7 = 1 / PORTC7 = 1 <=> Ausgang mit Pullup) oder 0/0 (DDRC7 = 0/ PORTC7 = 0 <=> Eingang ohne Pullup) oder 0/1 (DDRC7 = 0/ PORTC1 = 0 <=> Eingang mit Pullup) stellle - das LCD zeigt stets die richtigen ADC-Werte an und der Servo läuft unabhängig von der Pininitialisierung immer sinngemäss richtig.

    ......Bild hier  
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Hallo zusammen,

    vielen Dank für euere Rückmeldungen.
    Die Lösungen des Problems war ebenso so banal wie einfach. Ich habe gestern Abend das Datenblatt des µC nochmal durchgelesen und musste, wie oberallgeier auch schon geschrieben hat, feststellen, dass es in der SMD-Version zwei Pins zusätzlich gibt. Nämlich genau ADC6 und ADC7.
    Diese beiden Pins sind wirklich reine ADC-Pins und haben keinen Pullup. Und natürlich hatte ich genau einen dieser beiden Pins in der Mangel. :-D

    Ich habe jetzt mal einen der übrigen ADC-Pins verwendet und siehe da, es funktioniert alles!

    Mit der Hilfe des Pullups sollte es jetzt möglich sein zu bestimmen ob ein Sensor angeschlossen ist oder nicht.

    Vielen Dank nochmal für eure Unterstützung!

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    .. in der SMD-Version zwei Pins zusätzlich .. ADC6 und ADC7 ..
    Datenblatt lesen klingt ja schon mal gut. Bitte beachte u.a.:
    1.1.9 ADC7:6 (TQFP and QFN/MLF Package Only)
    In the TQFP and QFN/MLF package, ADC7:6 serve as analog inputs to the A/D converter.
    These pins are powered from the analog supply and serve as 10-bit ADC channels.
    und
    23.9.5 DIDR0 – Digital Input Disable Register 0
    • Bits 7:6 – Reserved
    These bits are reserved for future use. To ensure compatibility with future devices, these bits
    must be written to zero when DIDR0 is written.
    ..
    Note that ADC pins ADC7 and ADC6 do not have digital input buffers, and therefore do not
    require Digital Input Disable bits.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo demmy,

    Für mehr als grobe Tests kann man den PullUp aber nicht brauchen.

    Zwischen Minimal- und Maximal-Wert des Widerstands liegt ein Faktor 2x.
    Der Widerstand ist enorm Temperaturabhängig.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    Hi demmy!
    .. Für mehr als grobe Tests kann man den PullUp aber nicht brauchen ..
    Der interne PullUp lässt sich verhältnismässig einfach messen.

    Vorbereitung :
    a) Nimm einen (beispielsweise) 10 kΩ - Widerstand
    b) Wenn Genaugikeit gewünscht: messe den Widerstandswert genau
    c) Programmiere den zu prüfenden Pinn als Eingang mit PullUp
    d) Der zu prüfende Pinn ist ansonsten UNBESCHALTET zu lassen!
    e) Starte den Controller

    Messung :
    f) Messung GND gegen Prüfpinn - Beispiel 5,00 V
    g) Verbinde GND mit Prüfpinn über den Widerstand aus a)
    h) Messung GND gegen Prüfpinn über Widerstand. Beispiel 1,101V

    Auswertung:
    Behauptung: der Spannungsabfall über internen Pullup und über Widerstand "a)" ist 5,00 V, siehe f). Die Spannungsdiffernenz "f)" - "h)" ist der Spannungsabfall des internen Pullups <=> Reihenschaltung der Widerstände.

    U(PullUp) = 5,00V - U(Widerstand 10k) = 5,00V - 1,101V = 3,899V
    I(Widerstand 10k) = U/R(10k) , hier: 1,101V/10kΩ
    R(PullUp) = U(PU) / I (10k) => 3,899V / (1,101V/10k) = 35k4

    Der interne Pullup bei Messbedingungen betrug bei meinem Beispiel 35 kΩ (Messung PU von PINB2 eines mega328/nanoclone-20MHz bei Raumtemperatur).
    Geändert von oberallgeier (23.04.2017 um 11:05 Uhr) Grund: Hinweis auf Reihenschaltung
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] Windows XP mit Key aktivieren ?
    Von PICture im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 4
    Letzter Beitrag: 20.02.2016, 20:52
  2. Uhrenquarzan M8 aktivieren
    Von sebastian.heyn im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 24.07.2008, 17:01
  3. Subsysteme aktivieren
    Von rkone22 im Forum Robby CCRP5
    Antworten: 2
    Letzter Beitrag: 12.01.2007, 09:22
  4. atmega 8 adc nur teilweise aktivieren?
    Von Mac Gyver im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 14.10.2006, 15:21
  5. pull up wiederstaende aktivieren ?!?!?!
    Von exile im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 27.11.2004, 16:58

Berechtigungen

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

LiTime Speicher und Akkus