Saturday, June 18, 2011

PIC16F688 Timer 1 Code

After developing the code on the PIC16F877A for my tachometer, I decided to use the PIC16F688 since it was cheaper and smaller.  Below is the code to run Timer 1.


// PIC16F688
// Flash LED with Timer 1
// RoboSlave.Blogspot.com 6/2011


// -----------------------------------------------------------------------
// Includes
// -----------------------------------------------------------------------
#include "system.h" // Include general file


// -----------------------------------------------------------------------
// Configuration Bits
// -----------------------------------------------------------------------
#pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _CPD_OFF & _HS_OSC & _CP_OFF
#pragma CLOCK_FREQ 20000600


// -----------------------------------------------------------------------
// Defines
// -----------------------------------------------------------------------
#define TimerLED portc.0


// -----------------------------------------------------------------------
// Interrupt
// -----------------------------------------------------------------------
void interrupt( void )
{
if( pir1 & (1<<TMR1IF) )   // Handle timer1 interrupt
{
TimerLED = !TimerLED; // Toggle Timer LED
pir1.TMR1IF = 0; // Reset interrupt flag
}
}


// -----------------------------------------------------------------------
// Main Program
// -----------------------------------------------------------------------
void main( void )
{
ansel = 0x00; //Configure portC as I/O
cmcon0 = 0xFF; //Configure portC as I/O


trisc = 0x00;   //Configure port C
portc = 0x00;   //Initialize port C


tmr1h = 0x00; //should be cleared before enabling interrupts
tmr1l = 0x00;


intcon.GIE = 1; //Global Interrupt Enable bit
intcon.PEIE = 1; //Peripheral Interrupt Enable bit
pie1.TMR1IE = 1; //Timer1 Overflow Interrupt Enable bit


t1con = 0b00010001;


     while (1)
    {
}
}

Friday, June 17, 2011

Tachometer Board and Programming

Since the last post, I have been working on getting version 1.0 tachometer board up and running.  It turns out that creating the schematic and laying out the board in one night is too fast for a novice like me.  I made a number of simple mistakes that doomed the board from the schematic level.

Bad Schematic (REV -)
The two areas boxed in red were incorrect. VDD is positive 5V and VSS is ground. Apparently the PIC16F688 does not work well when it is not grounded properly. However, it does show some life.  For whatever reason, I was still able to blink an led. The delay between blinks was 5X slower than it should have been, but it did work.  This played havoc with my programming because I was convinced the board was working properly.  Finally, after a bit of programming help from the Sourceboost C forum (my thread), I managed to get Timer 1 working properly. I also have fixed my current board, shown below.

Fixed Board
The schematic has been updated to fix the errors, as well as add holes to connect to the unused pins.  I wanted this in order to use the board for prototyping in the future.

Updated Schematic (Rev A)
Updated Layout

Sunday, April 17, 2011

Tachometer board has arrived

I ordered three boards on March 25th and six show up on April 14th... Thank You BatchPCB!  After about 30 minutes of soldering, the board was fully populated.

Populated Tack Board
My desk after soldering
Best of all, I plugged my PicKit2 into the board and it was recognized!  All I need to do now is fix the code so that it works on this PIC16F688.  I developed working code on the PIC16F877, which I do most of my programming on.  Unfortunately, I did not realize the vast differences between the two... not quite plug-n-play.

Friday, March 25, 2011

Tachometer board has been ordered

Last night, I managed to get the tachometer programming and circuit all figured out.  Before I knew it, I had the schematic and then the board laid-out.
Tachometer Schematic
Tachometer Board Lay-Out
After about two hours of playing around with the schematic and moving the components around on the board, I decided I was done.  I then placed an order with BatchPCB.  This board is 1.17x1.54 inches, and cost $4.51 each with a $10 handling fee.

I also placed an order with Digi-Key which contained the gear tooth sensor which will be mounted within the gear box of the mini mill.  That order is below.
Digi-Key Order

Saturday, January 29, 2011

PIC16F877A Interrupt Code

During my attempt to program my tachometer, I decided to make things simpler by creating code for an external interrupt, timer 0 interrupt (TMR0), and timer 1 (TMR1) interrupt.  I figured this might be useful to someone in the future, so here it is!

NOTE: I program my code using Sourceboost C complier.

External Interrupt Code on the PIC16F877A
//External Interrupt Test,  
//RoboSlave.Blogspot.com, 1/2011
//Includes
#include <system.h>
//PIC16F877A
#pragma DATA _CONFIG, _PWRTE_OFF & _BODEN_OFF & _WDT_OFF & _LVP_ON & _CPD_OFF & _DEBUG_OFF & _XT_OSC & _CP_OFF
#pragma CLOCK_FREQ 4000000 //Set clock frequency
//Define
#define button1 portb.0
#define led1 portd.0
//Interrupts
void interrupt( void )
{
if( intcon & (1<<INTF) ) //Handle external interrupt
{
clear_bit( intcon, INTF );
led1 = !led1;
}
}
//Main Code
void main( void )
{
trisb = 0x00; //Configure port B
trisd = 0x00; //Configure port D
portb = 0x00; //Initialize port B
portd = 0x00; //Initialize port D
intcon = 0xB0; //Enable interrupts (External, Timer0)
while( 1 ) //Endless loop
{}
}

 Timer0 Interrupt Code on the PIC16F877A
//Timer0 Interrupt Test 
//RoboSlave.Blogspot.com, 1/2011
//Includes
#include <system.h>
//PIC16F877A
#pragma DATA _CONFIG, _PWRTE_OFF & _BODEN_OFF & _WDT_OFF & _LVP_ON & _CPD_OFF & _DEBUG_OFF & _XT_OSC & _CP_OFF
#pragma CLOCK_FREQ 4000000 //Set clock frequency
//Define
#define led1 portd.0
//Interrupts
void interrupt( void )
{
if( intcon & (1<<T0IF) ) //Handle timer0 interrupt
{
clear_bit( intcon, T0IF ); //clear timer 0 interrupt bit
led1 = !led1;
}
}
//Main Code
void main( void )
{
trisd = 0x00; //Configure port D
portd = 0x00; //Initialize port D
intcon = 0xB0; //Enable interrupts (External, Timer0)
//Set Timer0 mode
clear_bit( option_reg, T0CS ); //configure timer0 as a timer
//Set prescaler assignment
clear_bit( option_reg, PSA ); //prescaler is assigned to timer0
//Set prescaler rate
set_bit( option_reg, PS2 ); //prescaler rate 1:128
set_bit( option_reg, PS1 );
set_bit( option_reg, PS0 );
//Set timer0 source edge selection
set_bit( option_reg, T0SE ); //increment on high-to-low transition on RA4/T0CKI pin
while( 1 ) //Endless loop
{}
}

  Timer1 Interrupt Code on the PIC16F877A
//Timer1 Interrupt Test, 
//RoboSlave.Blogspot.com, 1/20111
//Includes
#include <system.h>
//PIC16F877A
#pragma DATA _CONFIG, _PWRTE_OFF & _BODEN_OFF & _WDT_OFF & _LVP_ON & _CPD_OFF & _DEBUG_OFF & _XT_OSC & _CP_OFF
#pragma CLOCK_FREQ 4000000 //Set clock frequency
//Define
#define led1 portd.0
//Interrupts
void interrupt( void )
{
//if( pir1 & (1<<TMR1IF) ) //Handle timer1 interrupt
if (pir1.TMR1IF == 1)
{
clear_bit( pir1, TMR1IF ); //clear timer 1 interrupt bit
led1 = !led1;
}
}
//Main Code
void main( void )
{
trisd = 0x00; //Configure port D
portd = 0x00; //Initialize port D
intcon.GIE = 1;
intcon.PEIE = 1;
pie1.TMR1IE = 1;
t1con= 0b00000001; //set timer1 configs and start
while( 1 ) //Endless loop
{}
}

Wednesday, January 19, 2011

New Tool! - Oscilloscope

I was looking for a function generator to use during my tachometer project debugging.  So I started to bid on a few on ebay.  Wow, ebay is addicting!  Before I realized it, I bought myself an oscilloscope which is just a few years younger than me!  Hitachi Model V-209 Portable Oscilloscope born in 1987, and cost $48.50 + shipping.
My Oscilloscope
Still no function generator... but there is always my next paycheck to look forward too.

Sparkfun Free Day

I wanted to comment on the Sparkfun Free Day on January 13th.  This was the second year I (tried) to participate.  Last year the server did not allow me to even see the pages.  This year it was far better but I still walked away disappointed.

I passed up $30 free dollars (due to my 3+ years as a customer) and attempted to complete the 10 question quiz at a chance to win $100 free dollars.  I did see the first question.... for about 45 minutes... again and again and again.  The server just would not allow me to submit my answer no matter what I did.

Unfortunately, I was being greedy and should have gone for the easy money and walked away.  Instead I got zero.  But I did get this message about a hundred times!
Sparkfun Error Message