mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CCU Interrupt


Autor: D. Rittlinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

  }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.