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)
{
}
}
Saturday, June 18, 2011
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 -) |
![]() |
| Fixed Board |
Labels:
Project 4 - Tachometer
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.
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.
![]() |
| Populated Tack Board |
![]() |
| My desk after soldering |
Labels:
Project 4 - Tachometer
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 |
Labels:
Project 4 - Tachometer
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!
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//Interruptsvoid interrupt( void ){if( intcon & (1<<INTF) ) //Handle external interrupt{clear_bit( intcon, INTF );led1 = !led1;}}//Main Codevoid main( void ){trisb = 0x00; //Configure port Btrisd = 0x00; //Configure port Dportb = 0x00; //Initialize port Bportd = 0x00; //Initialize port Dintcon = 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
{}
}
Labels:
C Programming,
Project 4 - Tachometer
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.
Still no function generator... but there is always my next paycheck to look forward too.
| My Oscilloscope |
Labels:
Tools
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!
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 |
Subscribe to:
Posts (Atom)








