Ergebnis 1 bis 4 von 4

Thema: ADC "besser" Auswerten

  1. #1
    Moderator Avatar von Trexis5
    Registriert seit
    02.11.2016
    Ort
    Neu-Ulm
    Beiträge
    112

    ADC "besser" Auswerten

    Für mein Messgeräte Projekt war
    Code:
    Getadc
    nicht gut genug.
    Ich durfte mein Programm beim Auswerten der Analogwerte nicht stoppen durch Getadc

    Darum habe ich es manuell gemacht.

    Vielleicht kann es ja einer brauchen.

    Bei dem Beispiel wird nur ADC1 ausgewertet.
    Das kann man aber mit der Variable Bytadchannel verändern.



    Code:
    $regfile = "m1284pdef.dat"
    Const _crystal = 1843200
    $crystal = _crystal                                         ' xtal used
    
    $hwstack = 750
    $swstack = 750
    $framesize = 1080
    
    Config Submode = New
    
    $projecttime = 31
    $version 0 , 0 , 2173
    
    '$prog &HFF , &HEB , &HD2 , &HFF
    
    '$programmer = 9                                             'STK500 native
    '$programmer = 12                                            'USB-ISP I
    $programmer = 13                                            'MCS Bootloader
    
    $loadersize = 2048
    
    '-------------------------[ Usersfeatures ]-------------------------------------
    Const Build = "Version 1.10.041"                            'Versionsnummer
    Const Loaderchip = 1284
    Const Avr_sleep_aktiv = 0                                   '1= AVR schlafen legen
    
    
    
    Dim Adc_ergebnis As Word
    Dim Bytadmux_0 As Byte , Bytadmux_3 As Byte
    Dim Bytadcsra As Byte , Bytadchannel As Byte , Wandlung_ferig As Bit
    Dim Wordadc As Word
    Dim Byteadclo As Byte At Wordadc Overlay
    Dim Byteadchi As Byte At Wordadc + 1 Overlay
    
    
    '-------------------------[ Configure ADC (ATMega) ]-----------------------------------------
    Bytadmux_3 = &B01000011                                     'Reference = AVCC, ADLAR=0, ADC3
    Bytadmux_0 = &B01000000                                     'Reference = AVCC, ADLAR=0, ADC0
    '// 01000000
    '// ||||||||---| bit 0: MUX0  =0000: ADC0 is input   =0001: ADC1 is input
    '// |||||||----| bit 1: MUX1  =0010: ADC2 is input   =0011: ADC3 is input
    '// ||||||-----| bit 2: MUX2  =0100: ADC4 is input   =0101: ADC5 is input
    '// |||||------| bit 3: MUX3  =0110: ADC6 is input   =0111: ADC7 is input
    '// ||||
    '// ||||-------- bit 4: MUX4
    '// |||--------- bit 5: ADLAR  =0: data right adjusted  =1: data left adjusted
    '// ||
    '// ||---------| bit 6: REFS0  =00: Reference = AREF    =01: Reference = AVCC
    '// |----------| bit 7: REFS1  =10: Int. 1.10V Reference   =11: Int. 2.56V Reference
    Admux = Bytadmux_0                                          'ADC Multiplexer Selection Register
    
    '-----------------
    '8.000.000Hz / 200.000Hz = 40
    'Da mit 200kHz gerechnet wurde(Maximale Frequenz), nimmt man den nächst höheren Wert, also 64.
    '8.000.000 Hz / 64 = 125.000Hz = 125kHz So erhält man bei 8 MHz einen Prescaler von 64 und eine Frequenz von 125kHz.
    '    1843200                    1843200
    '   --------   =  9,2           --------  =  115,2kHz
    '    200000                       16
    
    '    1843200
    '   --------   =  36,8
    '     50000
    '  kleiner ist schneller , somit 16 einstellen  = 115,2kHz
    Bytadcsra = &B10001100
    '// 10001100                   'ADC prescaler 50 bis 200kHz
    '// ||||||||---| bit 0: ADPS0  =000: Div. factor 2   =001: Div. factor 2
    '// |||||||----| bit 1: ADPS1  =010: Div. factor 4   =011: Div. factor 8   =100: Div. factor 16
    '// ||||||-----| bit 2: ADPS2  =101: Div. factor 32  =110: Div. factor 64  =111: Div. factor 128
    '// |||||
    '// |||||------- bit 3: ADIE =1: Conversion completion interrupt activated
    '// ||||-------- bit 4: ADIF =1: when conversion completed
    '// |||--------- bit 5: ADFR =1: Free Running"-Modus | Auto trigger enabled
    '// ||---------- bit 6: ADSC =1: Start ADC
    '// |----------- bit 7: ADEN =1: Enable ADC
    Adcsra = Bytadcsra                                          'Enable ADC, div. factor 128
    
    '-----------------
    
    ' ===== Special FunctionIO Register =====
    'Bit --7-- --6-- --5-- -4- --3-- -2- --1-- --0-- SFIOR
    '    ADTS2 ADTS1 ADTS0  -   ACME PUD  PSR2  PSR1
    '     R/W   R/W   R/W   R   R/W  R/W  R/W   R/W
    '      |     |     |    |
    '      |  __/      |     \_ W=0 !
    '      | / _______/
    '      || /
    '      |||  ADTS2:0: ADC Auto Trigger Source
    '      000 Free Running mode
    '      001 Analog Comparator
    '      010 External Interrupt Request 0
    '      011 Timer/Counter0 Compare Match
    '      100 Timer/Counter0 Overflow
    '      101 Timer/Counter1 Compare Match B
    '      110 Timer/Counter1 Overflow
    '      111 Timer/Counter1 Capture Event
    '
    'SFIOR = &B0000_xxxx
    
    '-----------------
    
    On Adc Adc_isr                                              'Go to interrupt routine
    Sreg.7 = 1                                                  'Enable interrupts
    Bytadchannel = 1                                            'ADC channel 1
    Set Adcsra.aden                                             'Switch on ADC
    Bytadchannel = 1
    Admux = Bytadmux_0 Or Bytadchannel                          'Set MUX channel
    Adcsra.adsc = 1                                             'Start ADC
    
    '---------------------------------------------------------------------------------------------------------------
    
    
    Enable Interrupts
    
    
    
    Dim Zaehler As Byte
    
    
    '---------------------------------------------------------------------------------------------------------------
    Do
    
    
    
    
    
    
       '***************-[Messung beendet]-***************
       If Wandlung_ferig = 1 Then
    
         Print Adc_ergebnis
         Wandlung_ferig = 0
    
       End If
       '*************************************************
    
    
    
    
        Incr Zaehler                                            'nur zur Demo, sporadische Auswertung
        If Zaehler = 200 Then
          Zaehler = 0
    
    
         '--------[ADC 1]----------
         Bytadchannel = 1
         '-------------------------
    
         '--------[ Erneute Messung starten ]----------
         'Set Adcsra.aden                                    'Switch on ADC    zum Stromsparen
         Admux = Bytadmux_0 Or Bytadchannel                     'Set MUX channel
         Set Adcsra.adsc                                        'Start ADC
         '----------------------------------------------
    
        End If
    
    
    
    
    
    Loop
    '---------------------------------------------------------------------------------------------------------------
    
    
    
    
    
    
    
    
    '==============================================================================
    Adc_isr:
       '~180us Anstiegszeit für Impuls | ~560us Impulslänge
       'Interrupt Service Routine for ADC, conversion complete
    
       '~180us Anstiegszeit für Impuls | ~560us Impulslänge
       'Interrupt Service Routine for ADC, conversion complete
    
    
       Byteadclo = Adcl                                         'Read ADCL first...
       Byteadchi = Adch                                         '... then ADCH
    
       Adc_ergebnis = Wordadc
       Wandlung_ferig = 1
    
       Reset Adcsra.adsc                                        'Stop ADC
       'Reset Adcsra.aden                                    'Switch off ADC    zum Stromsparen
    
    Return
    
    '==============================================================================
    Gruß Holger
    link zu mir..

  2. #2
    Schamane Avatar von DeMike
    Registriert seit
    02.11.2016
    Ort
    64347 Griesheim
    Beiträge
    12
    Super Übersichtlich !

    Am Anfang der Routine einen Port auf 1 gesetzt und am Ende auf 0.
    Mit dem Oszi läßt sich dann prima messen .... das auch ISR Zeit kostet.
    Die Frage ist immer wieviel genau.
    Spannend zu messen was das bringt

  3. #3
    Moderator Avatar von Trexis5
    Registriert seit
    02.11.2016
    Ort
    Neu-Ulm
    Beiträge
    112
    Laut meinem Wissenstand viel, weil
    Code:
    Getadc(x)
    wartet bis das Register "conversion completed" gesetzt ist.

    Mit der Variante kann ich in der Zeit weiterarbeiten.
    Gruß Holger
    link zu mir..

  4. #4
    Schamane Avatar von DeMike
    Registriert seit
    02.11.2016
    Ort
    64347 Griesheim
    Beiträge
    12
    ... und praktisch wieviel?

Lesezeichen

Lesezeichen

Berechtigungen

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