Identifiera IR-signaler

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Första interrupten har fel värde på 'Previous' så den kommer att bli knasig.

Kod: Markera allt

typedef union
  {
  unsigned char Byte[2];
  unsigned int  Word;
  } T_BYTE_AND_WORD;

T_BYTE_AND_WORD Pulse;
unsigned int Previous, Difference;
unsigned char Update;

void interrupt(void)
  {
  if(PIR1.CCP1IF)
    {
    Pulse.Byte[0] = CCPR1L; // Transfer the value, low byte
    Pulse.Byte[1] = CCPR1H; // Transfer the value, high byte
    PIR1.CCP1IF = false; // Acknowledge interrupt
    Difference = Pulse - Previous;
    Previous = Pulse;
    Update = true;
    }
  }
  
void main(void)
  {
  Initialize();
  while(true)
    {
    if(Update)
      {
      Update = false;
      // Nu gör du med Difference vad du behöver
      }
    }
  }

void Initialize(void)
  {
  TRISA        =  0xEF; // All input but PORTA.4
  TRISB        =  0x08; // All output but PORTB.3
  CMCON        =  0x07; // No comparator inputs
  CCP1CON      =  0x05; // Set CCP1 to capture all rising edges and use Timer 1 as timebase
  PIE1         =  0x04; // Allow CCP1 interrupts
  PIR1         =  0x00; // Erase any latent interrupts
  INTCON       =  0xC0; // Allow interrupts
  T1CON        =  0x31; // Set Timer 1 to lowest possible speed (125KHz which anyway is too high) and start it counting
  PORTA        =  0x00; // Set to all '0'
  PORTB        =  0x04; // Set to all '0' but PORTB.2 (Ser out)
  }
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Stegade igenom koden efter kompilering men CCPR1 laddas aldrig med TMR1 värdet. Är det inte det den ska göra vid interupt?

Dvs jag har fortfarande samma problem..
Skriv svar