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.