// Example_4.C
//
// Illustrates A/D in Channel 7
//
// copyright, Peter H. Anderson, Baltimore, MD, April 9, '08
//

#case

#device PIC16F887 *=16 ICD=TRUE

#include <defs_887.h>

#define TRUE !0
#define FALSE 0

#define SUCCESS !0
#define FAILURE 0

unsigned long convert_ad(int num);

void ser_char(char ch);
void ser_init();
void delay_10us(byte t);
void delay_ms(long t);


void main(void)
{

   unsigned long adval;
   float Tf;

   OSCCON = 0x61;
   not_rbpu = 0;  // insert pullups on PORTB
   ANSELH = 0x00;  // disable high six A/D
   ser_init();
   ser_char('?');
   ser_char('f');

   printf(ser_char, "Hello?");
   while(1)
   {
       adval = convert_ad(35);
       Tf = 0.488 * ((float) adval);
       printf(ser_char, "%lx?t%4.2f?n", adval, Tf);
       delay_ms(1000);
   }

}

unsigned long convert_ad(int num)
{
    int n;
    unsigned long sum = 0, adval;
    ADCON1 = 0x80;  // right justified
    adon = 1; adcs1 = 1; adcs0 = 1;
    chs3 = 0;  chs2 = 1; chs1 = 1; chs0 = 1;

    for (n=0; n<num; n++)
    {
        adgo = 1;
        while(adgo == 1)  /* loop */   ;
        adval = ADRESH;
        adval = (adval << 8) | ADRESL;
        sum = sum + adval;
    }

    return(sum / num);
}


void delay_10us(byte t)
// provides delay of t * 10 usecs (4.0 MHz clock)
{
#asm
      BCF STATUS, RP0
DELAY_10US_1:
      CLRWDT
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      DECFSZ t, F
      GOTO DELAY_10US_1
#endasm
}


void delay_ms(long t)   // delays t millisecs (4.0 MHz clock)
{
   do
   {
     delay_10us(100);
   } while(--t);
}

void ser_init(void)
{
    trisc6 = 0;
    portc6 = 1;
    delay_ms(200);
}

void ser_char(char ch) // 9600 baud
{

   byte dly, num_bits, gie_status;
     // start bit + 8 data bits
   gie_status = gie;
   while(gie)
   {
      gie = 0;
   }
   num_bits = 9;
#asm
   CLRWDT
   BCF STATUS, RP0
   BCF STATUS, C

LCD_CHAR_1:
   BTFSS STATUS, C
   BCF PORTC, 6
   BTFSC STATUS, C
   BSF PORTC, 6
   MOVLW 32
   MOVWF dly

LCD_CHAR_2:
   DECFSZ dly, F
   GOTO LCD_CHAR_2
   RRF ch, F
   DECFSZ num_bits, F
   GOTO LCD_CHAR_1

   BSF PORTC, 6
   CLRWDT
   MOVLW 100
   MOVWF dly

LCD_CHAR_3:
   DECFSZ dly, F
   GOTO LCD_CHAR_3
   CLRWDT
#endasm
   gie = gie_status;
}