#include <pic16f1827.h>
#define RUNAT32MHZ /* else 16 MHz */
-#define BRIGHT_STEP 16 /* starts at 0 */
-#define BRIGHT_STEPS 16 /* includes 0 */
-#define LEDBIT 0x01 /* PORTB.3 */
+#define LEDBIT 0x01 /* PORTB.0 */
#if defined(RUNAT32MHZ)
__CONFIG(WDTE_OFF & FOSC_INTOSC);
void pwm_init()
{
- /* Initialize PWM on PORTB.0
+ /* Initialize PWM on PORTB.3
* - Fosc = 32MHz
* - Prescale = 16
* - PRx value = 0xff
* = f(pwm) = 1.95 kHz
*/
- /* Disable output on PORTB.0 */
+ /* Disable output on PORTB.3 */
TRISB |= 0x08;
/* Configure ECCP1 */
PR2 = 0xff;
T2CON = 0b00000111;
- /* Enable PWM output, PORTB.0 */
+ /* Enable PWM output, PORTB.3 */
while (!TMR2IF); /* wait until timer overflow */
TRISB &= ~0x08;
}
void led_init()
{
- PORTB &= ~LEDBIT; /* Led is PORTB.3 */
+ PORTB &= ~LEDBIT; /* Led is PORTB.0 */
TRISB &= ~LEDBIT;
}
-void led_set(unsigned short led)
+void led_set(unsigned char led)
{
if (led)
PORTB |= LEDBIT;
PORTB &= ~LEDBIT;
}
-void pwm_set(unsigned short step)
+void pwm_set(unsigned char step)
{
- CCPR1L = step * BRIGHT_STEP;
+ CCPR1L = step;
}
void delay()
{
- for (unsigned counter = 0; counter < 50000; counter++);
+ for (unsigned counter = 0; counter < 10000; counter++);
}
int main(void)
{
- unsigned short fwd = 1;
- short int step = 0;
- short int led = 0;
+ unsigned char fwd = 1;
+ unsigned char step = 0;
pic_init();
led_init();
pwm_init();
while (1) {
- led = 1 - led;
- led_set(led);
pwm_set(step);
if (fwd == 0) {
step--;
- if (step == -1) {
+ if (step == 0xff) { /* rollover */
+ led_set(0);
fwd = 1;
- step++;
+ step = 0;
}
} else /* fwd == 1 */ {
step++;
- if (step == BRIGHT_STEPS) {
+ if (step == 0) { /* rollover */
+ led_set(1);
fwd = 0;
- step--;
+ step = 0xff;
}
}
- delay(); delay();
+ delay();
}
return 0;
}