H εργασια που κανει το παρακατω προγραμμα ειναι η εξης:
Ο timer0 εχει προγραματιστει να εργαζεται ως timer. Και o timer1 ως μετρητης, συλλεγει παλμους απο την επαφη T1CKI απο 0 σε 5volt. Υστερα απο 3921 overflows του timer0 δλδ κοντα ενα δευτερολεπτο καθυστερηση εχει συλλεξει χ παλμους.
Στην συνεχεια εχω προσ8εση μια απλη προηποθεση
if (frequency>=1)
{
output_high(pin_c7);
}
για να δω αν οντως συλλεγει τους παλμους δλδ ενα παλμο ανα δευτερολεπτο κ δεν γινεται τιποτα.
Επισης αν απο το προγραμμα αφεραισουμε τα εξης
setup_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
set_TIMER1(0);
frequency=get_timer1();
set_TIMER1(0);
το προγραμμα δουλευει 100% ως μια καθυστερηση ενος δευτερολεπτου αναβοσβηνοντας ενα απλο led.
output_toggle(pin_c7);
delay_ms(100);
Με αποτελεσμα να αντιλαμβανομαι οτι κατι γινετε λαθος στο σεταρισμα του timer1 παρολα αυτα δεν βλεπω κατι μεμπτο εσεις?
Κώδικας:
#include <16F877A.h> // Specifies the uP to be used
#FUSES NOWDT // Disable WatchDog Timer
#FUSES XT // Use Crystal Oscillator
#FUSES PUT // Enable Power On Timer
#FUSES NOPROTECT // EPROM Not Protected
#FUSES NOLVP // Disable Low Voltage programming
#FUSES NOCPD // No Code Protection
#use delay(clock=4000000) // Set Crystal Frequency
int16 counts=0; // Variable to count the number of TIMER0 Interruptions, initially set to zero
//unsigned int16
int8 frequency=0; // variable to hold the value from Timer1 set to zero
#int_TIMER0 // Timer0 Interruption
void isr_timer0() // Interrupt Service Request for Timer0
{
++counts; // Add one to flag variable
}
void main ()
{
setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_1); // Define TIMER0 as Internal timer (Fosc/4)
setup_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1); //Define Timer1 as External, no pre-scaler
enable_interrupts(GLOBAL); // Enable GLOBAL Interruptions
enable_interrupts(INT_TIMER0); // Enable TIMER0 Interruption
set_TIMER0(0); // Reset TIMER0
set_TIMER1(0); // Reset TIMER1
while(true)
{
IF (counts==3921) // Count approx. 1s @ 4MHz (0.999855s)
{
frequency=get_timer1(); // Stores the number of clocks received at TIMER1
counts=0; // Reset flag so it can start count to 3921 again
set_TIMER0(0); // Reset TIMER0
clear_interrupt(INT_TIMER0); // Clear INT_TIMER0
if (frequency>=1)
{
output_high(pin_c7);
//output_toggle(pin_c7);
//delay_ms(100);
}
set_TIMER1(0); // Reset TIMER1
}
}
}