Use PIC10F206 to blink an LED using TMR0.
With this method, the μC can do useful work during the delay period.
Because the 8-bit timer is limited to 256 counts, the required 0.5 second delay is broken into 8 bursts of 62+ milliseconds. The mainline code must poll the timer before the end of each burst in order to restart.
Below is the schematic. The components labeled *-sbb go on the solderless breadboard. The source code only uses D1-sbb, but Lab2_1 uses both LEDs,
Show text file suitable for cut-and-paste.
/*
* File: lab2.c
* Author: Brian
*
* DESCRIPTION: use TMR0 to delay. See halfSecondDelay() below for details.
* Using the timer allows us to do some other processing.
*/
#include <xc.h>
#include <stdint.h>
// CONFIG
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config CP = OFF // Code Protect (Code protection off)
#pragma config MCLRE = OFF // Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)
void initTimer(void) {
/*
* if we set prescaler=256, then TMR0 increments once every 256 microsec
* timer runs continuously.
*/
OPTION = 0b11000111;
/*
* OPTION bits:
* <2:0> PS = prescale value, 7=divide by 256
* 3 PSA = assign prescaler, 0=TMR0
* 4 TOSE = TMR0 source edge select, don't care
* 5 TOCS = TMR0 clock source select, 0=system clock
* 6 notGPPU = enable weak pull-ups, 1=disable
* 7 notGPWU = Wake up on pin change 1=disable
*/
}
void halfSecondDelay(void) {
uint8_t loopCounter;
/*
* 0.5 second delay = 500,000 microsec
* sytem clock period = 1 usec
* output of prescaler = 1 usec * 256 = 256 usec
* need TMR0 to count 500000 / 256 = 1953.125 times, but TMR0 can only
* count 0..255.
* So, we must repeat 1953 / 256 = 7.63 passes. Round up to 8 passes.
* What number should we load into TMR0 to make 8 passes work?
* 1953.125 / 8 = 244.1406
* The technique is to preload TMR0 with K so it counts like this:
* K, K+1, K+2, .. 254, 255, 0
* If we preload TMR0 with K = 256 - 244 = 12 the result is:
* 1 usec * 256 * 244 * 8 = 499712 usec
* Yields -0.058% error. Good enough!
*/
loopCounter = 8;
while (loopCounter--) {
TMR0 = 12;
while (TMR0 > 0) {
/* stay in this loop until TMR0 rolls over to 0
*
* additional activity is possible here, but it must be shorter
* than 256 * 244 = 62,464 microseconds = 62.464 milliseconds
*/
}
}
}
void main(void) {
/* Initialize I/O and Peripherals for application */
TRISGPIO = 0b1101; // make GP1 an output pin
CMPON = 0; // disable the Comparator so we can use GP1 for IO
initTimer();
while (1) {
GP1 = 1; // turn LED on
// was _delay(500000);
halfSecondDelay();
GP1 = 0; // turn LED off
// was _delay(500000);
halfSecondDelay();
}
}
