CCP_COMPARE
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
int a=0;
#INT_CCP1
void ccp1_isr(void)
{
if (a==10)
{
output_toggle(pin_a0);
a=0;
}
ccp_1=1000;
set_timer1(0);
a++;
}
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_COMPARE_INT_AND_TOGGLE);
enable_interrupts(int_ccp1);
enable_interrupts(global);
while(1);
}
Στο παραπάνω ενεργοποιούμε την ccp σε compare mode με tick του timer1 στο 1μSec, και έτσι όταν ο timer1 φτάσει τα 1000 counts (ή 1mSec) θα κάνει toggle το πιν CCP1.
Επιπλέον στην διακοπή κάνει μια διαίρεση /10 και βγάζει στο πιν Α0 την συχνότητα του ccp1 προς 10, ορίζω το ccp register και μηδενίζω τον timer.
Η συχνότητα στο ccp1 pin θα είναι 1mS high και 1mS low (δηλ. 1/0,002=500Hz)
Και στο πιν Α0 θα είναι 500/10=50Hz, ακόμη υπάρχουν και αναλογικοί συγκριτές που μπορούμε να ενεργοποιήσουμε αν θέλουμε.
Πάρτε μια ιδέα
CCP1M3:CCP1M0: Enhanced CCP Mode Select bits
0000 = Capture/Compare/PWM off (resets ECCP module)
0001 = Reserved
0010 = Compare mode, toggle output on match
0011 = Capture mode
0100 = Capture mode, every falling edge
0101 = Capture mode, every rising edge
0110 = Capture mode, every 4th rising edge
0111 = Capture mode, every 16th rising edge
1000 = Compare mode, initialize CCP1 pin low, set output on compare match (set CCP1IF)
1001 = Compare mode, initialize CCP1 pin high, clear output on compare match (set CCP1IF)
1010 = Compare mode, generate software interrupt only, CCP1 pin reverts to I/O state
1011 = Compare mode, trigger special event (CCP1 resets TMR1 or TMR3, sets CCP1IF bit)
1100 = PWM mode: P1A, P1C active-high; P1B, P1D active-high
1101 = PWM mode: P1A, P1C active-high; P1B, P1D active-low
1110 = PWM mode: P1A, P1C active-low; P1B, P1D active-high
1111 = PWM mode: P1A, P1C active-low; P1B, P1D active-low