Hej!
Jag har nu suttit ett tag o försökt få igång en interrupt funktion på ccp. Jag använder mig av en 16f628 som går på 4 Mhz. Jag har Prescalen står på 1:8 på timer 1 som ccp:n använder. Jag får värdet "t1" överfört till pc men problemet är att den överför värdet konstant. Jag vill bara ha en överföring av "t1" och sen vill jag att den ska vänta tills flaggan är satt och då skicka över det nya värdet. Den ändrar värdet om man pulsar den på ccp ingången men den stannar aldrig upp och väntar på flaggan. Är det någon som ser vad jag gjort för fel? Programmet är skrivet i en compilator från B Knudsen Data
if( CCP1IF == 1) kan ge mycket fel värde!
Använd if(CCP1IF) istället. Orsaken är att vissa kompilatorer kollar CCP1IF som en ren maskning och den kan enbart bli ==1 om det är bit 0 i en byte.
Sedan är det sannolikt snabbare att överföra på detta vis:
*(unsigned char*)(&t1 + 1) = CCPR1H;
*(unsigned char*)(&t1) = CCPR1L;
unsigned long t1 ;
bit captureFlag; //Flagga som berättar för huvudprogrammet att t1 har uppdaterats
#pragma origin 4
interrupt int_server( void )
{
int_save_registers
if( CCP1IF == 1) /* test if it is the INT-interrupt? */
{
t1 = CCPR1H*256; //Går att göra fortare: t1.high8=CCPR1H;
t1 += CCPR1L; //t1.low8=CCPR1L;
CCP1IF = 0;
captureFlag=1; //
}
int_restore_registers
}
Hej!
Nu fungerar det som jag skrev att jag ville att det skulle göra. Gjorde som bearing skrev. Hade stirrat mig blind på interrupten. Har stöt på ett nytt problem. Nu när jag la "t1 koden" i unterruptet så blev värdet konstigt. vid en simulering med en roterande axel med en induktiv givare på som drivs av en borrmaskin så är värdet stort mellan att ha den i interrupt eller inte. Utan interrupt logade jag värde 26400, 26373, 26353, 26343, 26353 och att ha den i interrupt 222,75,171,85,66.
Jag har också ändrat hastigheten för att se någon skillnad med det vills sig ändå inte . 4 Mhz 1:1 till 1:8. 10 Mhz 1:1 till 1:8. 20 Mhz 1:1 till 1:8. Ska det bli så eller har jag gjort något mera fel som jag inte ser?
variabeln "period" måste vara en unsigned long, eftersom att "t1" har den typen. variabeln ska heller inte vara global, eftersom att den bara används i main().
Klart den kan. Jag övervägde en stund att skriva "bör" istället för "ska". Men varför? det är väl bättre att ha som vana att börja med lokala variabler, och ändra dem till globala först när behovet kommer.
Jo, ganska sant. Tyvärr kan detta med lokala variabler ställa till det lite, i ett projekt fick jag en del konstiga fel under kompileringen och det var just för att jag hade lokala variabler, deras minne kom ifrån heap'en som helt enkelt i ett fall (stor debugbuffer) inte var stor nog.
Men jag gillar också att hålla variabler där de används, nice and tight.