Example Writeup: Analog Input

From Mech
Revision as of 12:22, 26 January 2008 by Lynch (talk | contribs) (→‎Code)
Jump to navigationJump to search

Original Assignment

Overview

Circuit

Code

 /*
 AnalogInput.c m.peshkin 2007-12-24
 Range of input voltages on pins AN0 to AN11 is 0 to 5 volts only.
 This maps to 0-255 ADC values if ADC is in 8 bit mode,
 or to 0-1023 ADC values if ADC is in 10 bit mode.
 There is only one ADC, with a switch to connect it to up to 12 input pins named AN0 to AN11.
 After you switch inputs, wait 10uS for the ADC to settle onto the new input
 */
 #include <18f4520.h>
 #DEVICE ADC=10                   // set ADC to 10 bit accuracy, or it could be just 8
 #fuses HS,NOLVP,NOWDT,NOPROTECT
 #use delay(clock=20000000)
 int16 value;      // if you selected 10 bit accuracy, don't use an 8 bit int
 void main() {

   setup_adc_ports(AN0_TO_AN3);        // Enable analog inputs; choices run from just AN0, up to AN0_TO_AN11
   setup_adc(ADC_CLOCK_INTERNAL);      // the range selected has to start with AN0
 
   while (TRUE) {
  
     set_adc_channel(0);     // there's only one ADC so select which input to connect to it; here pin AN0
     delay_us(10);           // wait 10uS for ADC to settle to a newly selected input
     value = read_adc();     // now you can read ADC as frequently as you like
     
     output_d(value>>2);     // on port D show only the most significant 8 of the 10 bits; tricky >> means shift right 2 bits
     output_bit(PIN_C0, (value & 2)>>1);    // display the two least significant bits; tricky & is bitwise AND
     output_bit(PIN_C1, (value & 1));
     delay_ms(10);
   }
 }