Sida 1 av 1

Delay för pic18

Postat: 2 april 2005, 22:44:35
av fatpo83
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??

Postat: 2 april 2005, 22:51:59
av cyr
Med C18?

#include <delays.h>

Delay10KTCYx(10); // vänta 100000 klockcycler

Kan inte bli enklare... (läs manualen).

Postat: 3 april 2005, 15:55:35
av fatpo83
Jag gjorde det faktiskt först...räknade ut så att det skulle motsvara en millisekund med 20Mhz.

1/(20M/4)=0,2u => 0,001/0,2u=5000

Alltså ska man vänta 5000 clockcykler för en millisekund, men när jag försökte göra en klocka (med sekunder o sånt) så verkade den gå för snabbt...

har jag räknat rätt??

Postat: 3 april 2005, 17:32:52
av cyr
Det låter rätt, men du kan inte göra en klocka med någon vidare precision på det sättet, du får använda en timer.

Dock så borde klockan med delay() gå för långsamt, inte för snabbt. Använde du rätt variant och med en korrekt parameter (0-255) ?

Hur stort fel blev det?

Postat: 3 april 2005, 19:25:04
av fatpo83
Jag gjorde en funktion som anropade 5000 klockcykler 1000 gånger, vilket ju ger en sekund...men av nån anledning gick det för snabbt, kanske nån 100ms före el. nåt...

jag tycker också att det är skumt...

Postat: 4 april 2005, 18:46:56
av dangraf
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)
{
}



}

Postat: 5 april 2005, 22:38:10
av fatpo83
dangraf tack för ditt svar...jag ska testa koden så fort jag kan...mycket plugg nu :(

Jag måste dock sätta mig in och läsa lite om de fördefinierade funktionerna i C18, har laddat hem dokumentationen...

Fråga:

Varför skriver du 3037 till timern?
Vad gör ticks?