solkirans
Üye
- Katılım
- 10 Kas 2008
- Mesajlar
- 31
- Puanları
- 1
- Yaş
- 40
Merhaba,
EasyPic5 Deneme kartı üstünde çalışıyorum, osilatörün 4MHZ yapmaya çalıştığım şey 0.2 ms de bir pic i interrupta sokmak ve counter değişkenimi 1 arttırmak, daha sonra counter değişkeni 5000 e eşit olunca, yani 1 saniye geçince Ledleri yakmak, ya da söndürmek, ama şuan yaklaşık 100 ms lik bir gecikme oluyor programın genelinde, bu neden olur? bir türlü çözemedim. Kaynak kodum aşağıda.
Teşekkürler
long int counter = 0;
void interrupt()
{
// Timer1 Interrupt - Freq = 100000.00 Hz - Period = 0.000010 seconds
if (PIR1.TMR1IF == 1) // timer 1 interrupt flag
{
counter++; // Toggle PORTB bit1 LED
PIR1.TMR1IF = 0; // interrupt must be cleared by software
PIE1.TMR1IE = 1; // reenable the interrupt
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 56; // preset for timer1 LSB register
}
}
// code starts here...
void main()
{
// setup portd to show the interrupts by blibking LEDs
TRISD = 0x00; // PORT is all output...to show the interrupts
PORTD = 0; // start with all outputs low
//Timer1 Registers Prescaler= 1 - TMR1 Preset = 65486 - Freq = 100000.00 Hz - Period = 0.000010 seconds
T1CON.T1CKPS1 = 0; // bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 = 0; // bit 4
T1CON.T1OSCEN = 1; // bit 3 Timer1 Oscillator Enable Control bit 1 = on
T1CON.T1SYNC = 1; // bit 2 Timer1 External Clock Input Synchronization Control bit...1 = Do not synchronize external clock input
T1CON.TMR1CS = 0; // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4)
T1CON.TMR1ON = 1; // bit 0 enables timer
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 56; // preset for timer1 LSB register
// Interrupt Registers
INTCON = 0; // clear the interrpt control register
INTCON.TMR0IE = 0; // bit5 TMR0 Overflow Interrupt Enable bit...0 = Disables the TMR0 interrupt
PIR1.TMR1IF = 0; // clear timer1 interupt flag TMR1IF
PIE1.TMR1IE = 1; // enable Timer1 interrupts
INTCON.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
INTCON.GIE = 1; // bit7 global interrupt enable
INTCON.PEIE = 1; // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts
while(1) //endless loop
{
if (counter == 5000)
{
PORTD = ~PORTD;
counter= 0;
}
}
}
EasyPic5 Deneme kartı üstünde çalışıyorum, osilatörün 4MHZ yapmaya çalıştığım şey 0.2 ms de bir pic i interrupta sokmak ve counter değişkenimi 1 arttırmak, daha sonra counter değişkeni 5000 e eşit olunca, yani 1 saniye geçince Ledleri yakmak, ya da söndürmek, ama şuan yaklaşık 100 ms lik bir gecikme oluyor programın genelinde, bu neden olur? bir türlü çözemedim. Kaynak kodum aşağıda.
Teşekkürler
long int counter = 0;
void interrupt()
{
// Timer1 Interrupt - Freq = 100000.00 Hz - Period = 0.000010 seconds
if (PIR1.TMR1IF == 1) // timer 1 interrupt flag
{
counter++; // Toggle PORTB bit1 LED
PIR1.TMR1IF = 0; // interrupt must be cleared by software
PIE1.TMR1IE = 1; // reenable the interrupt
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 56; // preset for timer1 LSB register
}
}
// code starts here...
void main()
{
// setup portd to show the interrupts by blibking LEDs
TRISD = 0x00; // PORT is all output...to show the interrupts
PORTD = 0; // start with all outputs low
//Timer1 Registers Prescaler= 1 - TMR1 Preset = 65486 - Freq = 100000.00 Hz - Period = 0.000010 seconds
T1CON.T1CKPS1 = 0; // bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 = 0; // bit 4
T1CON.T1OSCEN = 1; // bit 3 Timer1 Oscillator Enable Control bit 1 = on
T1CON.T1SYNC = 1; // bit 2 Timer1 External Clock Input Synchronization Control bit...1 = Do not synchronize external clock input
T1CON.TMR1CS = 0; // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4)
T1CON.TMR1ON = 1; // bit 0 enables timer
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 56; // preset for timer1 LSB register
// Interrupt Registers
INTCON = 0; // clear the interrpt control register
INTCON.TMR0IE = 0; // bit5 TMR0 Overflow Interrupt Enable bit...0 = Disables the TMR0 interrupt
PIR1.TMR1IF = 0; // clear timer1 interupt flag TMR1IF
PIE1.TMR1IE = 1; // enable Timer1 interrupts
INTCON.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
INTCON.GIE = 1; // bit7 global interrupt enable
INTCON.PEIE = 1; // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts
while(1) //endless loop
{
if (counter == 5000)
{
PORTD = ~PORTD;
counter= 0;
}
}
}