ADC spielt verrückt, liefert merkwürdige Werte

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • ADC spielt verrückt, liefert merkwürdige Werte

      Hallo zusammen

      Ich hab hier ein Problem mit dem ADC. Der liefert Werte zw. ca. 5 und 255 (Poti-Abhängig). Am ADC-Eingang kann ich damit die Spanung von 2,5V bis 3,0V variieren.

      ADC-Referenz ist auf AVCC eingestellt und am Analog-Eingange 1 (ADC(6)) und am Analog-Eingang 2 (ADC(7)) sind Werte um 2,5V, die ich drauf gebe. Sollten also ADC-Werte kommen um die 500.

      Ich komme nicht auf den Fehler.
      Hier mal das Programm:

      BASCOM Source Code

      1. $regfile = "m16def.dat"
      2. $hwstack = 40
      3. $swstack = 40
      4. $framesize = 40
      5. $Crystal = 8000000
      6. '$SIM
      7. Config SubMode = New
      8. Config Base = 0
      9. Dim tmpWord as Byte
      10. Dim tmpString as String * 16
      11. Dim tmpString2 as String * 16
      12. ' ----------------------------------------------
      13. ' Initialisierung
      14. ' ----------------------------------------------
      15. Config ADC = Single , Prescaler = 64 , Reference = AVCC
      16. Config Lcd = 16x3 , Chipset = Dogm163v5 ' Chipset = DOG 16 Zeichen/3 Zeilen/ 5V-Betrieb
      17. Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
      18. Cursor Off , noblink ' Cursor aus
      19. InitLcd
      20. Cls
      21. ' Display Back-Light
      22. BackLight Alias portb.0 ' LCD-Backlight
      23. Config BackLight = Output
      24. BackLight = 1 ' LCD-Backlight Ein
      25. ' ----------------------------------------------
      26. ' Liest Analog-Eingang 1
      27. ' ----------------------------------------------
      28. Function getAnalog1() as Word
      29. getAnalog1 = GetADC(6)
      30. End Function
      31. ' ----------------------------------------------
      32. ' Liest Analog-Eingang 2
      33. ' ----------------------------------------------
      34. Function getAnalog2() as Word
      35. getAnalog2 = GetADC(7)
      36. End Function
      37. ' ----------------------------------------------
      38. ' Hauptschleife
      39. ' ----------------------------------------------
      40. Do
      41. tmpWord = getAnalog1() ' Analog1 lesen
      42. tmpString = Str(tmpWord)
      43. tmpString2 = Format(tmpString , " 0")
      44. Locate 2 , 2 : Lcd "CH1:" ; tmpString2;
      45. tmpWord = getAnalog2() ' Analog2 lesen
      46. tmpString = Str(tmpWord)
      47. tmpString2 = Format(tmpString , " 0")
      48. Locate 3 , 2 : Lcd "CH1:" ; tmpString2;
      49. Waitms 500
      50. Loop
      Display All
      Also die Spannung (2.5 ... 3.0V) kommt am ADC-Eingang an. Referenz-Spannung stimmt auch (AVCC = 5V, und AREF = 5V von intern).
      Das ADMUX-Register wird lt. Simulator mit $40 konfiguriert. Stimmt also auch.

      Controller hat saubere 5V ohne Brummen. ARef und AVCC auch sauber.

      Controller auch mal ausgetauscht. Systemtakt stimmt auch, mit Oszi geprüft. Keine Änderung.

      Programm mal mit Version 2.0.8.1 Compiliert und reingespielt. Keine Änderung.

      Ich habe keine Idee mehr, wo der Fehler liegen könnte. Es scheint alles in Ordnung, aber es kommen immer Werte zw. 5 und 255 raus, egal was ich auch gemacht habe. Kein Wert über der Bytegrenze.

      Prescaler (ADC) habe ich auch mal auf 64 von Hand gestellt. Keine Änderung.

      Auch wenn ich die Formatierung der ADC-Werte weg lasse und die Werte direkt auf dem Display anzeige. Keine Änderung.

      Das Phänomen ist echt rätselhaft.

      Hat jemand eine Idee oder findet den Fehler?
    • Habe jetzt das Display nicht initialisiert.
      Und die ADC-Daten per UART raus gegeben.

      Das Ergebnis ist das selbe.

      Hier das Log-File:

      Source Code

      1. CH1:0
      2. CH2:0
      3. CH1:0
      4. CH2:0
      5. CH1:0
      6. CH2:0
      7. CH1:0
      8. CH2:0
      9. CH1:0
      10. CH2:0
      11. CH1:0
      12. CH2:0
      13. CH1:0
      14. CH2:0
      15. CH1:247
      16. CH2:0
      17. CH1:247
      18. CH2:0
      19. CH1:247
      20. CH2:0
      21. CH1:247
      22. CH2:0
      23. CH1:247
      24. CH2:0
      25. CH1:0
      26. CH2:0
      27. CH1:0
      28. CH2:0
      29. CH1:0
      30. CH2:221
      31. CH1:0
      32. CH2:220
      33. CH1:0
      34. CH2:221
      35. CH1:0
      36. CH2:221
      37. CH1:0
      38. CH2:221
      39. CH1:0
      40. CH2:221
      41. CH1:0
      42. CH2:220
      43. CH1:0
      44. CH2:0
      45. CH1:0
      46. CH2:0
      47. CH1:0
      48. CH2:0
      49. CH1:0
      50. CH2:0
      51. CH1:0
      52. CH2:0
      53. CH1:0
      54. CH2:0
      55. CH1:0
      Display All

      CH1 entspricht ADC(6) und CH2 entspricht ADC7)

      Hier das Programm:

      BASCOM Source Code

      1. $regfile = "m16def.dat"
      2. $hwstack = 64
      3. $swstack = 64
      4. $framesize = 64
      5. $Crystal = 8000000
      6. $Baud = 9600
      7. '$SIM
      8. Config SubMode = New
      9. Config Base = 0
      10. Dim tmpWord as Byte
      11. Dim tmpString as String * 16
      12. Dim tmpString2 as String * 16
      13. ' ----------------------------------------------
      14. ' Initialisierung
      15. ' ----------------------------------------------
      16. Config ADC = Single , Prescaler = Auto , Reference = AVCC
      17. 'Config Lcd = 16x3 , Chipset = Dogm163v5 ' Chipset = DOG 16 Zeichen/3 Zeilen/ 5V-Betrieb
      18. 'Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
      19. 'Cursor Off , noblink ' Cursor aus
      20. 'InitLcd
      21. 'Cls
      22. ' Display Back-Light
      23. BackLight Alias portb.0 ' LCD-Backlight
      24. Config BackLight = Output
      25. BackLight = 1 ' LCD-Backlight Ein
      26. ' ----------------------------------------------
      27. ' Liest Analog-Eingang 1
      28. ' ----------------------------------------------
      29. ' Function getAnalog1() as Word
      30. ' getAnalog1 = GetADC(6)
      31. ' End Function
      32. ' ----------------------------------------------
      33. ' Liest Analog-Eingang 2
      34. ' ----------------------------------------------
      35. ' Function getAnalog2() as Word
      36. ' getAnalog2 = GetADC(7)
      37. ' End Function
      38. Enable Interrupts
      39. ' ----------------------------------------------
      40. ' Hauptschleife
      41. ' ----------------------------------------------
      42. Do
      43. 'tmpWord = getAnalog1() ' Analog1 lesen
      44. 'tmpString = Str(tmpWord)
      45. 'tmpString2 = Format(tmpString , " 0")
      46. 'Locate 2 , 2 : Lcd "CH1:" ; tmpString2;
      47. tmpWord = GetADC(6)
      48. Print "CH1:" ; tmpWord
      49. 'tmpWord = getAnalog2() ' Analog2 lesen
      50. 'tmpString = Str(tmpWord)
      51. 'tmpString2 = Format(tmpString , " 0")
      52. 'Locate 3 , 2 : Lcd "CH1:" ; tmpString2;
      53. tmpWord = GetADC(7)
      54. Print "CH2:" ; tmpWord
      55. Waitms 500
      56. Loop
      Display All
      Da ist jetzt wirklich nix mehr drin, was man falsch machen kann.

      Hier noch die Fusebit-Einstllung:
      Fusebits_ADC-Problem.PNG