Onderstaande code werkt alleen als ik de interrupt op RB0 aanspreek. Dan hoogt cntr met 1 op.
Alleen wanneer de interrupt niet optreedt zou ik graag zien dat de TIMER0 bij een overflow overflw met 1 ophoogt. Dit om de tijd (1x per seconde) uit te lezen.
Iemand een idee wat er fout is? Het lijkt erop dat alle "global" interrupts uit zijn....
//
// Counter
//
const unsigned char VersionString1[]="V1.00";
const unsigned char VersionString2[]="11/09/2011";
unsigned short BPM;
char txtBPM[7],txtCount[7],txtTimems[7];
unsigned long cntr ; // number of RB0 transition
unsigned int ovrflw ; // number of timer0 overflows
unsigned long x ;
unsigned int y ;
void main()
{
TRISB = 0x0F;
INTCON.INTE=1;
INTCON.T0IF=1;
INTCON.GIE=1;
OPTION_REG.INTEDG=0; // trigger external INT on falling edge
//INTCON = 0b10110000 ; //T0IF, INTF and GIE enabled
UART1_Init(9600); // initialize USART module
// (8 bit, 9600 baud rate, no parity bit...)
UART1_Write_Text("Demo program");
Delay_ms(100);
while (1) {
UART1_Write_Text("[");
//WordToStr(timems, txtTimems); // convert Timems to string
IntToStr(cntr, txtBPM); // convert BPM to string
//IntToStr(CNTLOW*42+39, txtCount); // convert BPM to string
UART1_Write_Text(txtBPM);
UART1_Write_text("]"); // send data via USART
UART1_Write_Text(";");
}
}
void interrupt(void)
{
if (INTCON.INTF)
{
cntr++ ;
INTCON.INTF = 0;
}
else if(INTCON.T0IF){
ovrflw++ ; // inc. overflow counter
INTCON.T0IF = 0 ;
}
if (ovrflw > 19531) { // 2000000/ 4/ 256 = 19531 -- no prescaler
INTCON.GIE = 0;
x=cntr;
cntr = 0 ; // clear counters
ovrflw = 0 ;
INTCON = 0b10110000 ;
}
}
Heb het gevonden....In datasheet blijkt dat ik de PIC verteld heb dat hij moet verwachten dat hij een externe puls krijgt op RA4/TOCK1 om te tellen. Hij doet het nu!
TRISB = 0x0F;
INTCON.INTE=1;
INTCON.T0IE=1; en niet INTCON.T0IF=1;
INTCON.GIE=1;
Zit nog een foutje in je code !.
Klopt!! Dit had ik al aangepast, maar toch bedankt. Moet echt even wennen aan de syntax en afkortingen voor de uControllers.