Monthly Archives: January 2015

Analog Electronics RF Tindie Tools and Test Equipment

Just in! and the start on a VSWR bridge

I’ve been working on little bits over the last week or two, nothing notable but filling up my notebook with plenty of “lessons-learned”. For instance I decided I’m no good as estimating how many uH my home-made inductors are. I purchased a BK Precision 879B LCR meter to confirm that fact. A side-bonus was I went through all my caps and could test my home-brew ESR meter vs. the ESR meter built into the 879B and I now have a fair amount of capacitors that are going to the garbage. No more saving scrapped caps for me. I was working on an oscillator the other day.. well I winged the inductor.. not a wiggle out of the oscillator when finished, that’s what finally made me break down and buy the meter..

A crystal oscillator.. that doesn't oscillate
A crystal oscillator.. that doesn’t oscillate

Today I sat down at the bench and I started working on a project I have had on the board for a while (it’s a surprise); for this piece I made a 50 Ohm VSWR interface; then I threw it into a test jig and checked it out. It actually worked pretty solid. I got some 1 watt SMD resistors off an eBay purchased of some 49.9 ohm 0805 SMD resistors I ordered. The guy just randomly threw in 10 1-watt 49.9 ohm resistors… nice guy. I tested it up to 500MHz but after that I had a bit of noise measuring reverse power.. that’s okay though for me. Interestingly I found with my SA I have a pretty solid local noise source at 90.9, some local station I’m sure.  If you’re interested in making your own check out this guy’s website. He has a basic schematic of a bridge that is functionally equivalent to mine it seems. (a bridge with 3 resistors.. not a brain buster).


A little home made VSWR bridge for an upcoming project..
A little home made VSWR bridge for an upcoming project..

So after some success I decided it was time to get to mail. Yesterday I got a packages from the @tymkrs and Jason at AtomSoftTech.

Jason stuffed a box with some goodies I ordered and extras (thanks Jason!) The two most notable items of the bunch is the breadboard PIC buddy and the ESP8266 breakout board. The ESP board was flawless, but after use of BB PIC buddy I have ideas for v2. Now let me make it clear I saw this design before it went to the fab and I missed stuff that seems now obvious.. totally my bad.

Is it functional? Yep.. What would I recommend for changes?

Make the power side a little longer and have the USB jack coming in on the side.. if the PICKit2 is plugged in you can’t use the USB connector. Also while the PIC Kit 2 works okay I think pushing it a 1/2 inch away from the RJ12 jack for the ICD would make the insertion a little more solid. Nice product though.. this is certainly a new breadboard-fav. Jason is selling these for too cheap on Tindie. Get it before he gets smart and raises his price 🙂

The BB PIC Buddy and ESP8266 breakout board
The BB PIC Buddy and ESP8266 breakout board

There are some other items from AST as well but I’ll mention them later on. I had purchased two items from the @tymkrs ; the new Analog Shift Kit and the new SMD LM386 audio amplifier “Amplify Me”. The Amplify Me board works as expected, I checked out the PDIP version of this some time back ago, I’m not going to hunt for the post though, it’s a LM386 audio amp, kind of a no-brainer. I though of one change for future versions of this product that might have been a little more user friendly. It’d be nice if they made the product just a few more tenths of inches wide and brought that PCB 3.5mm jack out away and further back (back in reference to the photo below). I would make the jack so that it was level with a panel if you mounted the potentiometer into a panel. I don’t think it would add too much to board coast but it wold make this much easier to integrate into projects. As it is though, the potentiometer doesn’t have to be soldered into the board (it doesn’t come soldered) so it would be easier enough to work around. I still find it shocking to get a battery included in an order! It’s the little things @tymkrs!

Updated @tymkrs SMD LM386 Amplify Me
Updated @tymkrs SMD LM386 Amplify Me

No time to get to the Analog Shift kit today, I’ll save that for the future.

I have a lot more Analog bits I’m working on in the near future; I hope to get some of them mentioned here.

1-wire 18F14K22 C Electronics Interface Microcontrollers PIC Weather

iButtonLink T-Sense 1-wire sensor (Maxim DS18B20) + PIC 18F14K22

I came across a stash of iButton T-sense 1-wire sensors.. so I grabbed a couple and decided to check out 1-wire.

Maxim makes a 1-wire device called the DS18B20. It’s a 9-12 bit temperature sensor with the possibility of being powered by parasitic power from the data line. This cuts the signal path down to a single DQ line and a return. A company called iButtonLink produces a nice little wrapper around this device called a T-Sense. There are a couple pieces of software out there that will allow you to hook these up to monitoring systems, I don’t have any though. These devices come with a 64-bit address code and can be daisy-chained which makes having many of these devices monitored very nice.

At first I thought, ugh.. lame I have to send, and parse 64-bit codes in a little 8 bit micro.. doesn’t sound like a ton of fun for just fooling around on a day off.. thank fully they have a “Skip ROM” feature/command which works similar to a broadcast but can only be used when you have one device on the bus. If there is one thing left in this project I might consider finishing it’d be to add the addressing in and daisy-chain a few of these.

Most of my research came from Microchip’s Application Note AN1199 though the T-Sense Users Manual also helped out including determining the wiring diagram.

For my circuit I hooked up 5VDC (but later ran it on 3.3V just fine) and the 5VDC return on pins 1 & 2. Then the DQ link and return on pins 4&5. The signaling is interesting as the 1-wire bus needs a weak pull and works with an open collector circuits. The master starts all signaling, writes and reads. The 1’s and 0’s are based on how long the master or slave sinks the DQ line. To accomplish this in the PIC microcontroller I switched the port from an output to a three state input when I needed the port to be in weak-pull up mode (which is also hand when I need to sample the port for a response from a slave). The pull up on the resistor in my circuit is 10Kohm but I’ve seen 4.7KOhm and I’m sure anywhere in the neighborhood is fine. Finally if you do some digging you’ll notice I run this in low speed mode, if I remember correctly the “high speed” mode is 4x faster. I don’t think speed of data transfer is really relevant when you’re waiting for 750ms for a temperature conversation though.

T-sense sensor and 18F14k22 PIC Microcontroller on the breadboard
T-sense sensor and 18F14k22 PIC Microcontroller on the breadboard

I initially started with just determining if there was a 1-wire device on the bus. If you perform a “reset” (master sinks the bus low for 480us then releases to hi-z for 70us and then performed a sample.. any (all) device(s) will sink the line slow to prove their presence…then another 410us of delay before continuing. I got this one first try.. better luck than my first time with I2C! I then wrote the code (including sampling tidbits of Microchip AN1199 code to optimize) to do an actual temperature conversion and request it (by commanding a “read scratch pad”). The device dumps all 9 bytes of it’s registers. On that note I just remembered I should mention I did NOTHING with the CRC byte.. that’s all you if you care.

My temperature conversion code looks like this: (bus control m = master or PIC, s=slave or sensor)




m CONV TEMP (0x44)

m HOLD DQ (Hold line high 750ms for 12bit conversion .. I am guessing we hold it high for the parasitic power supply)





s 9 Bytes of Data

and that looks like…

1-wire data capture on the logic analyzer
1-wire data capture on the logic analyzer


The 12-bit conversion is basically 0.0625 deg C for every bit from 0C, The LSB holds a temperature sign.

The output of my program looks like..

Final Results!
Final Results!

There are tons of details on what a “1” is an what a “0” is, the ROM code (READ ROM, MATCH ROM), changing the configuration to 9bit for 94 ms conversions over 12bit 750ms conversions. This is all stuff you can grab out of the DS18B20 specification sheet or AN1199.

I hope you get some use out of this.. I still have enough of these T-Sense modules.. maybe if someone really wants one I’ll drop it in the mail… or perhaps we can set up a big box of electronics to ship around and I can dump some in there.

Items I used to make this happen:

TAUTIC 20-pin Development Board

Microchip PIC 18F14K22

AST Breadboard Buddy Pro

AST tinyLEDx4

iButtonLink T-Sense

CAT5 breakout board (eBay?)

Microchip PICKit 3

Then miscellaneous tools, test equipment, jumpers and a breadboard.


The good stuff (my code):

.. also found here on pastebin:


 * File:   main.c
 * Author: Charles M Douvier
 * Contact at:
 * Created on Janurary 1, 2015
 * Target Device:
 * 18F14K22 on Tautic 20 pin dev board
 * Project: Maxim 1-Wire Testing
 * Details of 1-wire protocol using Microchip AN1199
 * Field device
 * The 1-Wire Protocol is registered trade mark of Dallas/Maxim semiconductor.
 * Some code was use by the AN1199 App Note Source code; I got stuck looking for a fast way of txing by bit-bang (yes never did this before)
 * The agreement below mentions a license agreement accompaning this software; There was none. I'll note where this software was used if you
 * want to re-write without the Microchip bits.
 * The Microchip licensing as follows:
 *  * FileName:        1wire.c
 * Dependencies:
 * Processor:       PIC18
 * Complier:        MCC18 v3.13
 * Company:         Microchip Technology, Inc.
 * Software License Agreement
 * Copyright © 2004-2007 Microchip Technology Inc.  All rights reserved.
 * Microchip licenses to you the right to use, copy and distribute Software
 * only when embedded on a Microchip microcontroller or digital signal
 * controller and used with a Microchip radio frequency transceiver, which
 * are integrated into your product or third party product (pursuant to the
 * sublicense terms in the accompanying license agreement).  You may NOT
 * modify or create derivative works of the Software.
 * You should refer to the license agreement accompanying this Software for
 * additional information regarding your rights and obligations.
 * Version:
 * 0.1  Configuration, with reset test
 * 0.2
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 16000000 //4Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))


//config bits

#define _XTAL_FREQ 16000000 //defined for delay

 * Variables

    int     device_present;             // 1 = 1-wire device on 1-wire bus
    int     i, x, y, int_temp, an4_value;               //
    long int    decm;
    int     itxdata, txdata;            //int RS232 tx data
    char    rxbuff[10], z[1], buf[4];                 //buffer for T-sense 1-wire device
    float    temperature, f, d;
    volatile unsigned int uart_data;    // use 'volatile' qualifer as this is changed in ISR

 *  Functions

    void interrupt ISR() {

    if (PIR1bits.RCIF)          // see if interrupt caused by incoming data .. unused currently
        uart_data = RCREG;     // read the incoming data
        PIR1bits.RCIF = 0;      // clear interrupt flag
    // I left this timer interrupt if I needed it later. This is unused.
    if (PIR1bits.TMR1IF)
        //T1CONbits.TMR1ON = 0;
        PIR1bits.TMR1IF = 0;
        //T1CONbits.TMR1ON = 1;


     void __delay_10ms(unsigned char n)     //__delay functions built-in can't be used for much at this speed... so!
     while (n-- != 0) {

void uart_send (unsigned int mydata_byte) {      //bytes

    while(!TXSTAbits.TRMT);    // make sure buffer full bit is high before transmitting
    TXREG = mydata_byte;       // transmit data

void write_uart(const char *txt)                //strings
                                //this send a string to the TX buffer
                                //one character at a time

//This code if from Microchip but is unused currently.
void uart_send_hex_ascii(unsigned char display_data)

	//unsigned char temp;
	//temp = ((display_data & 0xF0)>>4);
	//if (temp <= 0x09)
	//	Putchar(temp+'0');
	//	Putchar(temp+'0'+0x07);
	//temp = display_data & 0x0F;
	//if (temp <= 0x09)
	//	Putchar(temp+'0');
	//	Putchar(temp+'0'+0x07);


void serial_init(void)

    // calculate values of SPBRGL and SPBRGH based on the desired baud rate
    // For 8 bit Async mode with BRGH=0: Desired Baud rate = Fosc/64([SPBRGH:SPBRGL]+1)
    // For 8 bit Async mode with BRGH=1: Desired Baud rate = Fosc/16([SPBRGH:SPBRGL]+1)

    TXSTAbits.BRGH=1;       // select low speed Baud Rate (see baud rate calcs below)
    TXSTAbits.TX9=0;        // select 8 data bits
    TXSTAbits.TXEN=1;     // enable transmit

    RCSTAbits.SPEN=1;       // serial port is enabled
    RCSTAbits.RX9=0;        // select 8 data bits
    RCSTAbits.CREN=1;       // receive enabled

    SPBRG=25;               //38,400bps-ish
                            //BRG16=0, 7=31.25k, 25=9.615k

    PIR1bits.RCIF=0;        // make sure receive interrupt flag is clear
    PIE1bits.RCIE=1;        // enable UART Receive interrupt

         __delay_ms(10);        // give time for voltage levels on board to settle


void init_io(void) {
    ANSEL = 0x00;         
    ANSELH = 0x00;

    TRISAbits.TRISA0 = 0; // output
    TRISAbits.TRISA1 = 0; // output
    TRISAbits.TRISA2 = 0; // output
    TRISAbits.TRISA4 = 0; // output
    TRISAbits.TRISA5 = 0; // output

    TRISBbits.TRISB4 = 0; // output
    TRISBbits.TRISB5 = 1; // input (RX UART)
    TRISBbits.TRISB6 = 0; // output
    TRISBbits.TRISB7 = 0; // output (TX UART)

    LATC = 0x00;

    TRISCbits.TRISC0 = 1; // AN4
    TRISCbits.TRISC1 = 1; // 1-wire data
    TRISCbits.TRISC2 = 0; // 
    TRISCbits.TRISC3 = 0; // 
    TRISCbits.TRISC4 = 0; // 
    TRISCbits.TRISC5 = 0; // output
    TRISCbits.TRISC6 = 1; // input
    TRISCbits.TRISC7 = 1; // input


void init_adc (void)
    ANSELbits.ANSEL4=1;         //PORTC.0
    ADCON2bits.ADCS = 0x02;     //Fosc/32
    ADCON2bits.ADFM=0;          //left oriented

void read_adc (void)
    ADCON0bits.CHS0 = 0;        // AD4
    ADCON0bits.CHS1 = 0;
    ADCON0bits.CHS2 = 1;
    ADCON0bits.CHS3 = 0;
    ADCON0bits.ADON = 1;        // A/D ON

    ADCON0bits.GO   = 1;        // ..GO!


        while (ADCON0bits.GO) continue;              //wait for conversion
        an4_value = ADRESH;                          //AN4 value

void one_wire_reset(void) {
    device_present = 0x00;
    TRISCbits.TRISC1 = 0;
    LATCbits.LATC1 = 0;
    __delay_us(240);        //delay 480 us
    TRISCbits.TRISC1 = 1;
    if (!PORTCbits.RC1) {
            device_present = 0x01;
    __delay_us(205);        //delay 410 us

//this looks a lot like the Microchip code, it was not I just happened to be on the right track.
void one_wire_tx_bit(unsigned char txbit) {         // write a bit
    if (txbit) {
    TRISCbits.TRISC1 = 0;
    LATCbits.LATC1 = 0;
    TRISCbits.TRISC1 = 1;
    else {      
    TRISCbits.TRISC1 = 0;
    LATCbits.LATC1 = 0;
    TRISCbits.TRISC1 = 1;

//from Microchip AN1199 code, renamed and slightly modified to match my software
* Function:        void OW_write_byte (unsigned char write_data)
* PreCondition:    None
* Input:		   Send byte to 1-wire slave device
* Output:		   None
* Overview:		   This function used to transmit a complete byte to slave device.
void one_wire_tx_byte (unsigned char write_data)
	unsigned char loop;
	for (loop = 0; loop < 8; loop++) 	{ 		one_wire_tx_bit(write_data & 0x01); 	//Sending LS-bit first 		write_data >>= 1;					// shift the data byte for the next bit to send

//from Microchip AN1199 code: I gathered the essence of this but seeing as I am not using most of the AN1199 code
//and this would not work with XC8 I had to re-write this.
* Function:        unsigned char OW_read_bit (void)
* PreCondition:    None
* Input:		   None
* Output:		   Return the status of the OW PIN
* Overview:		   This function used to read a single bit from the slave device.

unsigned char one_wire_rx_bit (void)
	unsigned char read_data; 
        read_data = 0x00;
	//reading a bit 
	TRISCbits.TRISC1 = 0;
        LATCbits.LATC1 = 0; 						// Drive the bus low
	__delay_us(6);						// delay 6 microsecond (us)
	TRISCbits.TRISC1 = 1;  						// Release the bus
	__delay_us(9);						// delay 9 microsecond (us)

        if (PORTCbits.RC1) {                                    //read 1 or 0
            read_data = 0x01;

	__delay_us(55);						// delay 55 microsecond (us)	
	return read_data;

* Function:        unsigned char OW_read_byte (void)
* PreCondition:    None
* Input:		   None
* Output:		   Return the read byte from slave device
* Overview:		   This function used to read a complete byte from the slave device.

unsigned char one_wire_rx_byte (void)
	unsigned char loop, result=0;
	for (loop = 0; loop < 8; loop++)                // here we are reading 8 bits (1 byte) 	{ 		 		result >>= 1; 				// shift the result to get it ready for the next bit to receive
		if (one_wire_rx_bit())
		result |= 0x80;				// if result is one, then set MS-bit
	return result;					

void one_wire_conversion_pulse(void) {
    	TRISCbits.TRISC1 = 0;
        LATCbits.LATC1 = 1; 		 //For T conv we drive the DQ line high for 750ms (12bit)
	__delay_us(250);                 // delay 
	TRISCbits.TRISC1 = 1; 
        LATCbits.LATC1 = 0;             //just in case this causes problems elsewhere                              

int main(void) {


    // set up oscillator control register, using internal OSC at 16MHz.
    OSCCONbits.IRCF = 0x07; //set OSCCON IRCF bits to select OSC frequency 16MHz
    OSCCONbits.SCS = 0x02; //set the SCS bits to select internal oscillator block

    //RCONbits.IPEN = 0;          //dsiable priority levels

    INTCONbits.PEIE = 1;        // Enable peripheral interrupt
    INTCONbits.GIE = 1;         // enable global interrupt

    init_adc();                 //unused but AN4 is there if I need it

    uart_send ('x');

        LATAbits.LATA0 = 0; //this is just for debugging with an LA..
        LATAbits.LATA0 = 1; //also confirms oscillator setup is correct.. 1us width
        LATAbits.LATA0 = 0;

    while (1) {


        if (device_present) {
            LATCbits.LATC2 = 1;             //this is a 1-wire device out there for debugging

            one_wire_tx_byte(0xCC);         //skip-rom (similar to a broadcast)

            one_wire_tx_byte(0x44);         //do a temp conversion

            one_wire_conversion_pulse();    // hold DQ line high for 750ms


            //add additional check here later

            one_wire_tx_byte(0xCC);         //skip-rom (similar to a broadcast)

            one_wire_tx_byte(0xBE);         //read scratch pad

            for(i = 0; i<9; i++)            //reading all 9 bytes on the T-Sense
   		rxbuff[i] = one_wire_rx_byte();
            // T-Sense
            //  Byte 0 LSB of Temp
            //  Byte 1 MSB of Temp and sign

            // LSB
            //  2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 s^-4
            // MSB
            // S S S S S 2^6 2^5 2 ^ 4

            temperature = 0;
            f = 0.0625;

            //z[0] = rxbuff[1];
            //x = atoi(z);
            x = rxbuff[1];

            if (x & 0b10000000) {
            } else {
            x = x & 0b00000111;

            int_temp = 0;

            int_temp = rxbuff[0];

            if (x & 0b00000001)
                int_temp = int_temp + 0x100;
            if (x & 0b00000010)
                int_temp = int_temp + 0x200;
            if (x & 0b00000100)
                int_temp = int_temp + 0x400;

            temperature = int_temp * f;
            int_temp = temperature;

            itoa(z, int_temp, 10);

            d = temperature - int_temp;

            decm = d * 1000;

            //page 374 of XC8 user guide
            ltoa(buf,decm,10);  //long conversion to buffer
            y=strlen(buf);  //uh, adding leading zeros..
            y=3-y;      //probably a better way of doing thing
            while (y)       //first figure out how many zeros
                uart_send('0');  //missed 3-string length
                y=y-1;  //then send them until done
            write_uart (buf);
            uart_send(0x0A);        //LF
            uart_send(0x0D);        //CR

            //temperature   float temperature
            //int_temp      interger value of temperature


    return (EXIT_SUCCESS);







Electronics LiPo Tools and Test Equipment

Breadboard Buddy Pro on the bench

I got a great gift in the mail yesterday! I sneak preview of the up coming Breadboard Buddy Pro. This one is a development board but it looks good and worked even better.

New breadboard buddy with a LiPo battery interface for the hardware hacker on the go!
New breadboard buddy with a LiPo battery interface for the hardware hacker on the go!

I am working on a little project that reads data from Maxim 1-wire temperature sensors (coming soon!) so I put the new BBB into action. The LiPo charger seemed to work just fine.. power was all good. The only thing that I noticed, and honestly I haven’t read the documentation on AdamSoftTech’s Tindie store site, when running on the battery the power supply will only provide 3.3V, not 5.0; the 5.0V rail goes dark .. so no boost on board but in reality that’s not a surprise as there isn’t any big inductors sitting on the PCB.

This product is definitely going into my electronics hobbyist go-bag! My favorite feature on this new product is the handy LiPo battery connector making development on the road easy. Whenever I’m on a trip for training, or working out-of-town I enjoy bringing a few basics to work on some project I’ve had back-burnered but can be worked on by breadboard. I like to pack light and this tool helps out greatly.

Besides the LiPo battery option, battery is not included, I really like the fact he crammed a USB-serial bridge on a power supply board. The RX/TX lights are nice and I imagine for people putting a chip in board the reset button is handy. I use plug-in dev boards and almost everyone puts a reset button on those. I used both 5V then switched to 3.3V .. more than enough current at 500mA of course.

The BBB Pro is also pretty robust: In a silly mistake I accidentally put my logic analyzer ground on the 5V plane.. well the BBB Pro folded back and protected itself.. before it did that though it delivered enough current to melt down my micrograbber…  I’m very thankful I caught it quickly and my LA, USB ports and the BBB Pro are all just fine. The clip was replaced and made its way into my Bag Of Shame. The micrograbber will fit in well within the BOS, which includes such things as an 18F26K22 I melted down.. a handful of MOSFETs (a bag favorite), and assorted other parts I’ve cooked making dumb mistakes.

On the photo above you also notice two new breadboard favorites:

The tinyLEDx4 from AtomSoftTech and a board I made recently for attaching jumpers for my scope and logic analyzer. I sent in a sample and of course Jason (with AST) came up with a revised version of the clip holder which was better designed than mine in a few minutes.. thankfully I don’t do this for a living! 😀