Delay för pic18

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Delay för pic18

Inlägg 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??
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Med C18?

#include <delays.h>

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

Kan inte bli enklare... (läs manualen).
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg 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??
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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?
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg 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...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg 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)
{
}



}
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg 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?
Skriv svar