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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.