Hi zusammen,
ich möchte den ADC direkt, so schnell wie möglich in der Hauptschleife abfragen ohne Interrupt.
Würde das so funktionieren?
Dort wird so lange gewartet bis eine Wandlung fertig ist.
Bitwait Adcsra.adsc
Dann lese ich die Register und Starte den ADC wieder.
Bisher habe ich das mit Interrupt gemacht ADIE. Aber ich möchte mir den Sprung sparen.
Ich kann gerne im Programm warten, ich muss nur schnell Messen.
Alles anzeigen
ich möchte den ADC direkt, so schnell wie möglich in der Hauptschleife abfragen ohne Interrupt.
Würde das so funktionieren?
Dort wird so lange gewartet bis eine Wandlung fertig ist.
Bitwait Adcsra.adsc
Dann lese ich die Register und Starte den ADC wieder.
Bisher habe ich das mit Interrupt gemacht ADIE. Aber ich möchte mir den Sprung sparen.
Ich kann gerne im Programm warten, ich muss nur schnell Messen.
BASCOM-Quellcode
- $regfile = "m328PBdef.dat" 'ATMega 328PB
- Const Speed_cry = 0 '0=1,8 1=7,3 2=11,0 3=14,7
- Const Build = "Version 1.10.002" 'Versionsnummer
- $baud = 19200 '115200
- $hwstack = 150
- $swstack = 150
- $framesize = 150
- #if Speed_cry = 0 : Const _crystal = 1843200 : #endif 'Quarz: 1.8432 MHz
- #if Speed_cry = 1 : Const _crystal = 7372800 : #endif 'Quarz: 7.3728 MHz
- #if Speed_cry = 2 : Const _crystal = 11059200 : #endif 'Quarz: 11.0592 MHz
- #if Speed_cry = 3 : Const _crystal = 14745600 : #endif 'Quarz: 14.7456 MHz
- $crystal = _crystal
- Config Single = Scientific , Digits = 3
- Config Submode = New
- Config Base = 1 'arrays start
- Dim Adc_finish As Bit , Loop_count As Byte , Impuls As Word
- Dim Wrdadc As Word
- Dim Bytadclo As Byte At Wrdadc Overlay
- Dim Bytadchi As Byte At Wrdadc + 1 Overlay
- Dim Bytadmux_0 As Byte , Bytadmux_3 As Byte
- Dim Bytadcsra As Byte , Admux_switch As Bit , Bytadchannel As Byte , Wrdadc_vorgabe_temp As Word
- Dim Wrdadc_vorgabe As Eram Word At &H179
- Wrdadc_vorgabe_temp = Wrdadc_vorgabe
- If Wrdadc_vorgabe_temp >= 1025 Then
- Wrdadc_vorgabe = 150
- End If
- Wrdadc_vorgabe_temp = Wrdadc_vorgabe
- 'Wait_vorgabe = 40
- '--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Bytadmux_0 = &B01000000
- '// 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
- '--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- '
- '--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- '1 843 200Hz / 200.000Hz(200kHz) = 9,216
- 'Da mit 200kHz gerechnet wurde(Maximale Frequenz), nimmt man den nächst höheren Wert Teiler, also 16.
- '1 843 200Hz / 16 = 115.200Hz = 115kHz So erhält man bei 1,843200 MHz einen Prescaler von 16 und eine Frequenz von 115kHz.
- Bytadcsra = &B10000100
- '// 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 ' |
- ' |
- ' |
- 'Wenn eine Wandlung beendet wurde wird dieses Bit auf 1 gesetzt.
- 'Eine eventuell aktivierte Interruptroutine des ADCs setzt dieses Bit
- 'wieder auf 0, sobald die entsprechende Interruptroutine aufgerufen wurde.
- 'Wird ohne Interrupts gearbeitet kann mittels schreiben einer 1 auf dieses Bit das Bit zurückgesetzt werden.
- '--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- '--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Sreg.7 = 1 'Enable interrupts
- '----------------
- Bytadchannel = 0 'First ADC channel
- Admux = Bytadmux_0 Or Bytadchannel 'Set MUX channel
- '----------------
- Set Adcsra.aden 'Switch on ADC
- Set Adcsra.adsc 'Start ADC
- '--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Do
- Bitwait Adcsra.adsc , Reset 'Wandlung fertig, dann wird Srtart ADC gelöscht
- Bytadclo = Adcl 'Read ADCL first...
- Bytadchi = Adch '... then ADCH
- 'Set Adcsra.adif 'erneut beschreiben damit dieses Bit gelöscht wird bei ADC Free
- Set Adcsra.adsc 'Start ADC weil nach der Wandlung das bit auf 0 geht
- If Wrdadc >= Wrdadc_vorgabe_temp Then Incr Impuls
- Loop
- End