A more complete discussion of the operation of the LTC1392 in the context of the Parallax BASIC Stamp 2 appears here.
// LTC1392.C (CCS PCM - PIC16F84) // // Measures Temperature in degrees C, V_cc, V_diff (1.0 V Ref) and V_diff // (0.5 V Ref). Ten such measurment sequences performed. Results are // displayed on a serial LCD on RA.0. // // PIC16F84 LTC1392 // // // RB.3 (term 9) <----RX_DATA ---------- (term 2) D_out // // RB.2 (term 8) ---- TX_DATA ---------- (term 1) D_in // RB.1 (term 7) ----- CLK ------------- (term 3) CLK // RB.0 (term 6) ----- /CS ------------- (term 4) /CS // // // ------- (term 6) +V_in // ------- (term 7) -V_in // // // +5 ---- (term 8) V_cc // GRD --- (term 5) GRD // // copyright, Towanda Malone, Baltimore, MD, Apr, '99 #case #include <16f84.h> #include <string.h> #include <defs_f84.h> #define true 1 #define false 0 #define RX_D_DIR trisb3 #define TX_D_DIR trisb2 #define CLK_DIR trisb1 #define CS_DIR trisb0 #define RX_D_PIN rb3 #define TX_D_PIN rb2 #define CLK_PIN rb1 #define CS_PIN rb0 #define IN 1 #define OUT 0 long make_meas(int command); void clk(void); #define TxData 0 // RA.0 - output to serial LCD // delay routines void delay_ms(long t); void delay_10us(int t); // LCD routines void lcd_init(void); void out_RAM_str(int *s); void lcd_hex_byte(int val); void lcd_dec_byte(int val, int digits); int num_to_char(int val); void lcd_char(int ch); void lcd_new_line(void); void main(void) { int n; char s[20]; long T_c_100, V_cc_100, V_diff_100_0_pt_5, V_diff_100_1_pt_0, get_10; RX_D_DIR = IN; TX_D_DIR = OUT; CLK_DIR = OUT; CS_DIR = OUT; for(n=0; n<10; n++) { lcd_init(); get_10 = make_meas(0x00); // temperature measurement T_c_100 = (25 * get_10)-13000; get_10 = make_meas(0x01); // measure V_CC V_cc_100 = (60 * get_10)/128+242; get_10 = make_meas(0x02); V_diff_100_1_pt_0 = (100 * get_10)/1024; get_10 = make_meas(0x03); V_diff_100_0_pt_5 = (50 * get_10)/1024; // now display the results strcpy(s, "T_c="); out_RAM_str(s); if (T_c_100/10000) // for example 105 degrees { lcd_dec_byte(T_c_100/100, 3); } else if (T_c_100/1000) // for example 24 degrees { lcd_dec_byte(T_c_100/100, 2); } else { lcd_dec_byte(T_c_100/100, 1); // for example in 5 degrees } lcd_char('.'); lcd_dec_byte(T_c_100%100, 2); lcd_new_line(); strcpy(s, "V_cc="); out_RAM_str(s); lcd_dec_byte(V_cc_100/100, 1); lcd_char('.'); lcd_dec_byte(V_cc_100%100, 2); lcd_new_line(); strcpy(s, "V_diff="); out_RAM_str(s); lcd_dec_byte(V_diff_100_1_pt_0/100, 2); lcd_char('.'); lcd_dec_byte(V_diff_100_1_pt_0%100, 2); lcd_new_line(); strcpy(s, "V_diff="); out_RAM_str(s); lcd_dec_byte(V_diff_100_0_pt_5/100, 2); lcd_char('.'); lcd_dec_byte(V_diff_100_0_pt_5%100, 2); delay_ms(3000); } } long make_meas(int command) { int n; long get_10=0; CLK_PIN = 1; CS_PIN = 1; CS_PIN = 0; // beginning of data // send four bits TX_D_PIN = 1; // start bit clk(); TX_D_PIN = (command >> 1) & 0x01; // msbit of command clk(); TX_D_PIN = command & 0x01; clk(); TX_D_PIN = 1; // stop bit clk(); delay_ms(10); clk(); delay_ms(100); // now fetch 10 bits for (n=0; n<10; n++) { CLK_PIN = 0; delay_ms(1); get_10 = (get_10 << 1) | RX_D_PIN; CLK_PIN = 1; } CS_PIN = 1; return(get_10); } void clk(void) { CLK_PIN = 0; CLK_PIN = 1; } void delay_10us(int t) { #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 { do { delay_10us(100); } while(--t); } int num_to_char(int val) // converts val to hex character { int ch; if (val < 10) { ch=val+'0'; } else { val=val-10; ch=val + 'A'; } return(ch); } // lcd routines void lcd_char(int ch) // serial output to PIC-n-LCD, 9600 baud { int n, dly; // start bit + 8 data bits #asm BCF STATUS, RP0 MOVLW 9 MOVWF n BCF STATUS, C LCD_CHAR_1: BTFSS STATUS, C BSF PORTA, TxData BTFSC STATUS, C BCF PORTA, TxData MOVLW 32 MOVWF dly LCD_CHAR_2: DECFSZ dly, F GOTO LCD_CHAR_2 RRF ch, F DECFSZ n, F GOTO LCD_CHAR_1 BCF PORTA, TxData CLRWDT MOVLW 96 MOVWF dly LCD_CHAR_3: DECFSZ dly, F GOTO LCD_CHAR_3 CLRWDT #endasm } void lcd_init(void) // sets TxData in idle state and resets PIC-n-LCD { #asm BCF STATUS, RP0 BCF PORTA, TxData BSF STATUS, RP0 BCF TRISA, TxData BCF STATUS, RP0 #endasm lcd_char(0x0c); delay_ms(250); } void lcd_new_line(void) // outputs 0x0d, 0x0a { lcd_char(0x0d); delay_ms(10); // give the PIC-n-LCD time to perform the lcd_char(0x0a); // new line function delay_ms(10); } void out_RAM_str(int s) { while(*s) { lcd_char(*s); ++s; } } void lcd_hex_byte(int val) // displays val in hex format { int ch; ch = num_to_char((val>>4) & 0x0f); lcd_char(ch); ch = num_to_char(val&0x0f); lcd_char(ch); } void lcd_dec_byte(int val, int digits) // displays byte in decimal as either 1, 2 or 3 digits { int d; int ch; if (digits == 3) { d=val/100; ch=num_to_char(d); lcd_char(ch); } if (digits >1) // take the two lowest digits { val=val%100; d=val/10; ch=num_to_char(d); lcd_char(ch); } if (digits == 1) // take the least significant digit { val = val%100; } d=val % 10; ch=num_to_char(d); lcd_char(ch); }