Controller: PIC12F1840
IDE och kompilator: MikroC Pro for PIC
Programmerare: PicKit2
Mål:
Att släcka den röda LED:n när en 5V insignal ges på ingången genom en knapptryckning. Detta ska ske med användning av intern komparator och interrupt-rutin.
Setup:
Genom att komparatorn använder den interna spänningsreferensen (här 4,096V) som "-" och 5V insignal via knappen som "+" så ger den en interruptflagga vid knapptryckning och programmet sätter då LED-utgången låg.
Problem och frågor:
LED och knapp är verifierat att dom inte är defekta.
1.) Förvisso ska komparatorn ha analoga signaler in men som jag förstår databladet så behöver man inte använda ADC:n till detta utan enbart behöver sätta knapp-ingången till analog ingång. Är det rätt förstått?
2.) Ser min interruptrutin korrekt ut? Det jag försökt med är alltså att när jag får PIE2.C1IF (komparators interruptflagga) så sätter den LED:ens utgång låg. Kan man skriva som jag gjort? Har testat lite olika varianter utan framgång.
3.) Har ni fler förslag på hur jag kan felsöka? Tycker det blir lite svårt när jag nyttjar interna funktioner. Känns som att jag inte kan förenkla det mer än så här.
Uppkoppling och kod:
Kod: Markera allt
void main() {
OSCCON = 0b01110010; // 0....... Software PLL disabled
// .1110... 8 Mhz
// .....0.. Unused
// ......10 Use internal oscillator
ANSELA = 0b00010000; // Enable Analog function on RA4, all other Digital
CM1CON0 = 0b10010100; // 1....... Enable the Comparator module
// .0...... Ignore polarity of output pin due to internal use only
// ..0..... C1OUT is internal only
// ...1.... Output is inverted
// ....0... Unused
// .....1.. Operate in normal (high) power mode
// ......0. Disable comparator hysteresis
// .......0 Comparator output to Timer1 and I/O is asynch.
PIE2 = 0b00010000; // ...1.... Enable Comparator C1 interrupt bit, all other disabled
CM1CON1 = 0b10100001; // 1....... Give C1IF flag on rising edge
// ..10.... C1VP connects to FVR Reference
// .......1 C1VN connects to C1IN1- pin
INTCON = 0b01000000; // 0....... Disable global interrupts
// .1...... Enable all active peripheral interrupts
FVRCON = 0b11001100; // 1....... Fixed Voltage Reference Enable
// .1...... FVR output ready (default)
// ....11.. Comparator FVR output is 4x (4,096V)
TRISA = 0b00010000; // Define PORT RA4 as input
PORTA.B5 = 1; // Set RA5 as 1
while(1) {}
}
void interrupt(void) {
if(PIR2.C1IF) {
PORTA.B5 = 0;
}
}