PIC P16F690;
pragma debounce count = 2;
pragma debounce delay = 1ms;
pragma adc right_justify = 0;
Main {
digital_output PORTC;
analog_input AN0;
digital_input RA3;
adc_enable 500kHz, AN0;
$display = 0x08; # create a 8-bit register
$dirxn = FALSE;
timer_enable TMR0, 4kHz, ISR { #set the interrupt service routine
adc_read $userval;
$userval += 100;
};
Loop {
write PORTC, $display;
delay_ms $userval;
debounce RA3, Action {
$dirxn = !$dirxn;
};
if ($dirxn == TRUE) {
rol $display, 1;
} else {
ror $display, 1;
};
}
}
Simulator {
attach_led PORTC, 4, 'red';
log RA3, AN0;
scope RA3, AN0;
# stimulus should reflect the debounce delay to be viable
stimulate RA3, every 5s, wave [
300, 1, 1300, 0,
1400, 1, 2400, 0,
2500, 1, 3500, 0,
3600, 1, 4600, 0,
4700, 1, 5700, 0,
5800, 1, 6800, 0,
6900, 1, 8000, 0
];
#adc stimulus
stimulate AN0, every 3s, wave [
500000, 2.85, 1000000, 3.6,
1500000, 4.5, 2000000, 3.2,
2500000, 1.8
];
stop_after 30s;
autorun;
}