Problem med interrupt ccp
Postat: 23 september 2009, 20:57:22
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
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
Kod: Markera allt
#include "16F628.h"
#include "int16Cxx.h"
#pragma config |= 0x3f81
unsigned long t1 ;
#pragma origin 4
interrupt int_server( void )
{
int_save_registers
if( CCP1IF == 1) /* test if it is the INT-interrupt? */
{
t1 = CCPR1H*256;
t1 += CCPR1L;
CCP1IF = 0;
}
int_restore_registers
}
#include "math16.h"
void initserial( void );
bit putchar( char );
void string_out1( void );
void unslongtoa( unsigned long );
void main( void)
{
char i;
TRISB.3 = 1; /* CCP1-pin is input */
initserial();
T1CON = 0b00.11.0.0.0.1 ; /* 0b00.11.0.0.0.1 prescal 1:8 */
CCP1CON = 0b00.00.0101;
OPTION .7 =0; /* .7 =0; */
GIE = 1 ;
PEIE = 1 ;
CCP1IE = 1 ;
while(1)
{
unslongtoa(t1);
string_out1();
putchar('\n');
}
}
void initserial( void ) /* initialise serialcom port */
{
SPEN = 1;
BRGH = 1; /* Async high speed */
TXEN = 1; /* transmit enable */
SPBRG = 26 -1; /* 9600 Baud @ 20 MHz-clockfrequency */
CREN = 1; /* Continuous receive */
RX9 = 0; /* 8 bit reception */
TRISB.2 = 0; /* serial_out is output */
TRISB.1 = 1; /* serial_in is input */
}
bit putchar( char d_out ) /* sends one char */
{
if(d_out == '\0') return 0; /* refuse to send 0 "end of string" */
while (!TXIF) ; /* wait until previus character transmitted */
TXREG = d_out;
return 1; /* done */
}
void OverrunRecover(void)
{
char trash;
trash = RCREG; /* the two char's that locked the reciever */
trash = RCREG; /* are read and ignored */
CREN = 0; /* the unlock procedure ... */
CREN = 1;
}