Delay för pic18
Delay för pic18
Jag har nu letat ganska länge för delay rutiner för PIC18 serien. Jag har laddat ner en från microchips hemsida, men den verkar krångla med dera kompilator C18...vet någon nån enklare variant till att ordna delayer??
Vad är det för fel på att använda en interrupt och en timer? Vad är det för fel du får av kompilatorn?
jag har skrivit såhär som du är nyfiken:
jag är dock lite osäker på hurpass rätt timern går. jag räknade med att det tar 2 klockcykler att skriva in ett 16 bitars värde. Men om WriteTimer0() funktionen tar längre tid än så finns risken att den går fel på nån klockcykel varje sekund.
#include <p18f2550.h>
#include <timers.h>
/*************** globals **************************/
unsigned int Ticks = 0;
/************** Interupt vektorn ******************/
#pragma code high_vector=0x08
void high_interrupt(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
if(INTCONbits.TMR0IF)
{
/* disables interrupt flag*/
INTCONbits.TMR0IF = 0;
WriteTimer0(3037);
Ticks++; //counting every second
}
}
#pragma code
/******************* main ************************/
int main(void)
{
OpenTimer0( TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_4);
INTCON2bits.TMR0IP = 1; // 1=> timer 0, high priority
INTCONbits.TMR0IE = 1; //turn timer int on
RCONbits.IPEN = 1; // turn priority levels on
INTCONbits.GIEL = 0; //disable low interrupts
INTCONbits.GIEH = 1; //enable high interrupts
INTCONbits.GIE = 1; //enable interrupts
while(1)
{
}
}
jag har skrivit såhär som du är nyfiken:
jag är dock lite osäker på hurpass rätt timern går. jag räknade med att det tar 2 klockcykler att skriva in ett 16 bitars värde. Men om WriteTimer0() funktionen tar längre tid än så finns risken att den går fel på nån klockcykel varje sekund.
#include <p18f2550.h>
#include <timers.h>
/*************** globals **************************/
unsigned int Ticks = 0;
/************** Interupt vektorn ******************/
#pragma code high_vector=0x08
void high_interrupt(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
if(INTCONbits.TMR0IF)
{
/* disables interrupt flag*/
INTCONbits.TMR0IF = 0;
WriteTimer0(3037);
Ticks++; //counting every second
}
}
#pragma code
/******************* main ************************/
int main(void)
{
OpenTimer0( TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_4);
INTCON2bits.TMR0IP = 1; // 1=> timer 0, high priority
INTCONbits.TMR0IE = 1; //turn timer int on
RCONbits.IPEN = 1; // turn priority levels on
INTCONbits.GIEL = 0; //disable low interrupts
INTCONbits.GIEH = 1; //enable high interrupts
INTCONbits.GIE = 1; //enable interrupts
while(1)
{
}
}