ATMega2560 ADC Kanäle 8-15 auslesen?

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

    • Leider hilft der Simulator auch wenig : Die DIDR's sind Null -OK, Das ADCSRB wird nicht beschrieben vor jeder Messung auf Null gesetzt a_67_e210de67 daher ließt er immer nur die ersten 7. Aber man kann auch nur 8 Werte vorgeben - Also ist er nicht dafür gebaut oder die Dat ist im Alpha-Stadium.

      Hat schon mal jemand einen Chip mit mehr als 8 ADC's im Simulator gehabt ??
    • Ralf wrote:

      Ja unten, der ganz rechts.Hab die Leitung zum Chip durchgemessen.
      Und wie schon geschrieben, Getatc(39), was funktionieren sollte,
      liest den Eingang 7 ein.
      Schreib und poste doch mal einen einfachen code, der zB den Wert vom adc(15) printet. Ich spiel den dann auf meinen mega und probier' aus.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • ich hab keinen Chip hier Das sollte gehen:

      Source Code

      1. $regfile = "m2560def.dat"
      2. $crystal = 160000
      3. $hwstack = 128
      4. $swstack = 128
      5. $framesize = 64
      6. Config Portb.7 = Output
      7. Config Com1 = 2400 , Parity = None , Stopbits = 1 , Databits = 8
      8. Dim Zyklus As Dword
      9. Dim Ana As Word
      10. Dim Ah As Byte At Ana + 1 Overlay
      11. Dim Al As Byte At Ana Overlay
      12. Dim A As Byte
      13. Dim B As Byte
      14. Dim Dummy As String * 10
      15. 'Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56
      16. 'Start Adc
      17. Do
      18. For A = 0 To 7
      19. Ana = Getadc(a)
      20. Waitms 1
      21. Print A;
      22. Print "=";
      23. Print Ana;
      24. Print ", ";
      25. Next
      26. Print
      27. Adcsrb = 8
      28. For A = 0 To 7 '8-15
      29. Admux = $40 Or A
      30. Adcsra = $c6
      31. B = A + 8
      32. Waitms 2
      33. Al = Adcl
      34. Ah = Adch
      35. Print B;
      36. Print "=";
      37. Print Ana;
      38. Print ", ";
      39. Next
      40. Print
      41. Loop
      42. End
      Display All
      PS Der Crystal und die Baud müssen angepasst werden.
    • Source Code

      1. $regfile = "m2560def.dat" ' specify the used micro
      2. $crystal = 16000000 ' used crystal frequency
      3. $baud = 19200
      4. $hwstack = 64 ' default use 32 for the hardware stack
      5. $swstack = 20 ' default use 10 for the SW stack
      6. $framesize = 80 ' default use 40 for the frame space
      7. Config Lcdpin = Pin , Db4 = Portg.5 , Db5 = Porte.3 , Db6 = Porth.3 , Db7 = Porth.4 , E = Porth.6 , Rs = Porth.5
      8. Config Lcd = 16 * 2 'configure lcd screen
      9. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      10. Start Adc
      11. Dim Spannung As Integer
      12. Do
      13. Spannung = Getadc(39)
      14. Locate 2 , 12 : Lcd " "
      15. Locate 2 , 12 : Lcd Spannung
      16. Wait 6
      17. Waitms 300
      18. Spannung = Getadc(39)
      19. Locate 2 , 12 : Lcd " "
      20. Locate 2 , 12 : Lcd Spannung
      21. Wait 4
      22. Loop
      23. End
      Display All
      Ich hab mal alles rausgeschmissen.

      The post was edited 1 time, last by Ralf ().

    • BASCOM Source Code

      1. $regfile = "m2560def.dat"
      2. Const _crystal = 16000000
      3. $crystal = _crystal
      4. '------------------------------[ ADC ]---------------------------------------
      5. 'Config Adc = Single , Prescaler = Auto ', Reference = Avcc 'Config the ADC
      6. 'Start Adc
      7. Const Max_count = 8
      8. 'Declare Sub Adc_lesen(byval Adc_channel As Byte)
      9. Dim Adc_wert(max_count) As Word
      10. Enable Interrupts
      11. Dim Bytadmux_0 As Byte , Bytadmux_3 As Byte , Adc_aktiv As Byte
      12. Dim Bytadcsra As Byte , Admux_switch As Bit , Bytadchannel As Byte , Loop_1 As Byte
      13. Dim Loop_count As Byte
      14. 'Dim Wrdadc As Word
      15. Dim Bytadclo As Byte 'At Wrdadc Overlay
      16. Dim Bytadchi As Byte 'At Wrdadc + 1 Overlay
      17. Dim Wrdadc As Word At Bytadclo Overlay
      18. Dim I_adc As Word , Countadc As byte
      19. Dim Adc_funktion As Byte
      20. Adc_funktion.0 = 1
      21. '--------------------------------------------
      22. Bytadmux_3 = &B01001000
      23. Adcsrb = Bytadmux_3
      24. Bytadmux_0 = &B00100000
      25. Admux = Bytadmux_0
      26. Bytadcsra = &B00100111
      27. Adcsra = Bytadcsra 'Enable ADC, div. factor 128
      28. Set Acsr.acd 'Switch off the power to the Analog Comparator
      29. Reset Acsr.acbg 'Disable Analog Comparator Bandgap Select
      30. '-----
      31. On Adc Adc_isr 'Go to interrupt service routine
      32. Sreg.7 = 1 'Enable interrupts
      33. Reset Adcsra.adsc 'Stop ADC
      34. Reset Adcsra.aden 'Switch off ADC
      35. Admux_switch = 0
      36. Bytadchannel = 1 'First ADC channel
      37. Loop_count = 0
      38. Dim Adc_channel_ As Byte
      39. '-------------------
      40. Macro Analog_lesen
      41. Adc_funktion.1 = 0
      42. Adcsrb = Bytadmux_3 Or Adc_channel_
      43. Admux = Bytadmux_0 Or Adc_channel_ 'Set next MUX channel
      44. Set Adcsra.aden 'Switch on ADC
      45. Set Adcsra.adsc 'Start ADC again
      46. Set Adcsra.adie 'Interrupt aktivieren
      47. Loop_count = Adc_channel_ + 1 'Array Index
      48. Countadc = 0 oder Config Base = 0 alle bei 0 beginnen 'arrays start
      49. While Adc_funktion.1 = 0 'warten bis Bit auf high geht, dann ist ADC Wandlung fertig.
      50. Incr Countadc
      51. If Countadc = 255 Then Exit While
      52. Wend
      53. Shift Bytadclo , Right , 6
      54. Adc_wert(loop_count) = Makeint(bytadchi , Bytadclo)
      55. Adc_funktion.1 = 0
      56. End Macro
      57. '-----------------
      58. '----------------------------------------------------------------------------
      59. Do
      60. Adc_channel_ = 0 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      61. Adc_channel_ = 1 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      62. Adc_channel_ = 2 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      63. Adc_channel_ = 3 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      64. Adc_channel_ = 4 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      65. Adc_channel_ = 5 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      66. Adc_channel_ = 6 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      67. Adc_channel_ = 7 : Analog_lesen 'Channel=0 ergibt ADC_Wert=1 im Array
      68. Loop
      Display All
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___
    • Ich weiß nicht, was ihr habt
      mega2560-adc.PNG
      hier seht ihr meinen Testcode und das Ergebnis im Terminal. Am adc8 hängt ein Poti zwischen 5V und gnd.
      Geht doch alles a_58_b54cfdb4
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Pluto25 wrote:

      Und wo ist die Adc_isr ?
      Das funktioniert unter realen Bedingungen? Zeile 53 scheint mir ein Chaos zu verursachen.
      Sorry vergessen.

      BASCOM Source Code

      1. '--------------------------------------------------------------------------------------
      2. Adc_isr:
      3. Bytadclo = Adcl 'Read ADCL first...
      4. Bytadchi = Adch '... then ADCH
      5. Reset Adcsra.adsc 'Stop ADC
      6. Reset Adcsra.aden 'Switch off ADC
      7. Reset Adcsra.adie 'Interrupt deaktivieren
      8. Set Adc_funktion.1 'Conversion complete
      9. Return
      10. '--------------------------------------------------------------------------------------
      Display All
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___