thanks Darrel,
I have put this code in for the AN4 sensor only , however it seems i will have to do this for other A/D services for this rev of chip ????![]()
your DT_INTS-14.bas is included as part of this code for timer0 , and the variable GIE was already in use ,
timer0 setup as 8ms timer , and this A/D routine is called from it after incrementing counters of timer0 = 5sec duration to do a read of the Voltage level
couple of questions
1. Is the duration of the sample time of 20us seemed long for 1 A/D channel ? as the spec sheet for conversion using FRC is about 1.6us average - a max period of 6uS
2. i thought the sleep instruction ( low power mode ) may need to be issued prior to the conversion starting , or are all commands after a sleep command not actioned till sleep mode is terminated ?
3. as this now monitors the interrupt for sleep to finish , then the duration of this routine must be shorter than any other generated interrupts using DT_INT14 else this will not work ??
the code as it stands now
waiting on a Battery power duration test to complete to see if this works ok
Cheers
Sheldon
Code:Get_volts : ADON VAR ADCON0.0 ; A/D converter Enable GoDone VAR ADCON0.1 ; A/D conversion in progress ADIE VAR PIE1.6 ; A/D Interrupt Enable ADIF VAR PIR1.6 ; A/D Interrupt Flag GIEsave VAR BIT ; Saves state of GIE ADCON0 = %00010001 ' enable ADC AN4 ,( ADCON1 setup at start of program , Right Justify, FRC clock ) y = 0 ' ensure 0 While Y < 10 ' do 10 voltage reads ' silicon bug in rev2 of 16F1947 , requires ADC to be done in lowpower mode and with FDC osc clock internal ' also ADCIN command wont work in sleep mode , interupts exit sleep mode PAUSEUS 20 ; Acquisition time GIEsave = GIE ; Save state of Global Interrupts ( GIE defined in DT_INTS-14.bas ) GIE = 0 ; Disable Global interrupts ADON = 0 ; reset A/D module ADON = 1 ; turn on A/D module ADIF = 0 ; Clear Analog Interrupt Flag ADIE = 1 ; Enable Analog Interrupt GoDone = 1 ; Start Analog conversion @ SLEEP ; go to SLEEP ADIE = 0 ; Disable Analog Interrupt GIE = GIEsave ; Restore Global Interrupt state ( GIE defined in DT_INTS-14.bas ) value.HighByte = ADRESH ; Get A/D result value.LowByte = ADRESL ' ADCIN 4 ,Value ' Leave out for Rev 2 of 16F1947 - Read PortA.5 value into variable , this applies the fixed voltage ref (via ADCON0,ADCON1,FVRCON) gosub Average ' Go do running average of ADC reading y = y+1 ' Increment loop counter wend




Bookmarks