Forum: Mikrocontroller und Digitale Elektronik CCU Interrupt


von D. Rittlinger (Gast)


Lesenswert?

Guten Tag zusammen,

ich habe ein kleines Problem. Ich will eine Frequnz mit dem 
Mikrocontroller messen. Ich verwende den externe interrupt um die pulse 
der rechteckfreuenz zu zählen. die compare capture unit benutze ich um 
eine zeit von 1 sec zu erzeugen. Den reloadwert habe ich berechnet und 
sperre den externen interrupt im interrupt der ccu, also nach einer 
secunde. Es funktioniert eigentlich einwandfrei. ich verstehen nur nicht 
warum der Controller nach der freigabe des ccu interrupt (ECCU) sofort 
in diese isr springt. Die register sind doch vorher schon für eine sec. 
geladen. ich sehe das weil ich mir zwei breakpoints setze einen bei eccu 
und einen in der isr. das hauptprogramm wird nicht zuerst durlaufen. er 
müste doch aber in main verweilen bis die secund abgelaufen ist.
ich benutze einen p89lpc935.
meinen code hab ich hier.

#include <REG935.H>
#include <stdio.h>

extern  init_display(void);
extern  clr_lcd(void);
extern  printchar(char);
extern  moveto(char,char);
extern  cursor_on(void);
extern  cursor_off(void);
extern  print_lcd(char code *);
extern  print_digit (unsigned char);


sbit sbFrequenz = P1^3;        //INT 0

unsigned int xdata uix = 0x00, flag = 0;



void main (void)
  {

  /*Konfiguration der Ports*/

  P0M1 = 0x00;        //Port 0 ist bidirektional
  P0M2 = 0x00;

  P2M1 = 0x00;        //Port 2 ist bidirektional
  P2M2 = 0x00;

  init_display();


  /*Konfiguration des externen Interrupts*/

  IT0 = 1;    //Interrupt 0 ist negativ-flankengetriggert
  IE0 = 0;    //Flag von Interrupt 0 zurückseten
  EX0 = 0;    //Interrupt 0 stoppen

  /*Konfiguration von Timer 2*/

  TPCR2H = 0x00;
  TPCR2L = 0x3C;    //CCU_Frequenz = 3,6864MHz/60 = 61440Hz

  TH2 = TOR2H = 0xEA;     //Reloadwert für 1s
  TL2 = TOR2L = 0xFF;


  TCR21 |= 0x80;  //Übernahme der Reloadwerte in die Schattenregister
  TDIR2 = 1;  //Timer 2 arbeitet als Down-Counter

  TMOD20 = 0;  //Stoppt Timer 2 (Basictimer)
  TMOD21 = 0;

  TICR2 = 0x80;  //Interrupt für CCU-Timer freischalten
  TIFR2 = 0;  //Alle Interruptflags von Timer 2 zurücksetzen

  ECCU = 1;
  EA = 1;    //Allgemeine Interupptsperre aufheben



  TMOD20 = 1;  //Startet Timer 2 (Basictimer)
  EX0 = 1;



  while (1)
    {


    if (flag == 1)
      {


      moveto(1,7);
      printf ("%d", uix);


      flag = 0;
      uix = 0;

      TMOD20 = 1;  //Startet Timer 2 (Basictimer)
      EX0 = 1;
      }

    }


  }

void v_Int0 (void) interrupt 0
  {
  uix++;
  }

void v_CCU_Int (void) interrupt 11
  {
  EX0 = 0;    //Interrupt 0 stoppen
  TMOD20 = 0;
  TIFR2 = 0;  //Alle Interruptflags von Timer 2 zurücksetzen
  flag = 1;

  }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.