Stoppuhr in C auf dem 89C51

Gast #880006
Lesenswert?

Hallo!
ich moechte mit dem 89C51 die zeit messen zwischen 2 knopfdrücken. die 
Taster sind am Port3. Ich will die  Zeit messen zwischen zwei 
Tasterbetätigungen. Meine Frage ist jetzt, wie ich die Timer, von denen 
ja 3 vorhanden sind, in C benutze. Da habe ich leider nicht so die 
ahnung.
Wäre nett, wenn da jemand weiterhelfen koennte!
Danke im Voraus!
Gast #880025
Lesenswert?

Welcher C-Compiler? Die Interruptsyntax ist kein ANSI C Standard, da 
musst Du ggf. was anpassen. Dein Problem löst Du, indem Du z.B. im 
Interrupt eine Variable hochzählst.

Beim nächsten mal wenigstens einen Lösungsansatz liefern, da wird Dir 
lieber geholfen.

Generelles Beispiel für Interruptnutzung bei Standard 8051er:
LED an P0_7 blinkt im Sekundentakt bei 11.0592MHz Taktfrequenz
1
// Testprogramm TIMER
2
// Beispiel: LED blinkt im o.5s Takt
3

4
#include "reg51.h"   // Register des 8051MCs
5
#define LED P0_7
6

7
// Timer 0 - Zeitbasis
8
// Timer0: Reload Wert für T0 T=1/(fosz/12)*(65536-(TH0*256+TL0))
9
// RELOAD (16bit) = -(0.01 * FREQ_OSC / 12 - 65536);
10
// RELOAD-Wert für 10ms = 0xDC00 (56320) bei FOSZ 11.059200 MHz
11
#define TH0Reload 0xDC
12
#define TL0Reload 0x00
13

14
static unsigned char int_delay = 0;
15

16
// ********************************************************************
17
// Timer 0 Interrupt
18
// Routine wird alle 10ms aufgerufen
19
// ********************************************************************
20
void TIMER0ISR (void) interrupt 1 {
21
  TH0  = TH0Reload; // Update MSB
22
  TL0  = TL0Reload; // Update LSB
23
  int_delay++;
24
  if (int_delay == 50) {
25
    // LED blinkt im Sekundentakt (500ms an, 500ms aus)
26
    // nur Bsp., anpassen!
27
    LED = !LED;
28
    int_delay = 0;
29
  }
30
}
31

32
// ********************************************************************
33
// Grund-Initialisierung
34
// ********************************************************************
35
void init (void) {
36
  // Timer 0 initialisieren
37
  TMOD = 0x01;          // 0000 0001B    Timer 0: Mode 1 (16-Bit Zähler)
38
  TH0  = TH0Reload;   // Reloadwert Timer 0
39
  TL0  = TL0Reload;
40
  TR0  = 1;             // Timer 0 starten
41
  // Interruptsystem
42
  ET0  = 1;             // Timer 0, Interruptfreigabe
43
  EA   = 1;             // generelle Interruptfreigabe
44
}
45

46
// ********************************************************************
47
// Hauptprogramm
48
// ********************************************************************
49
void main (void) {
50
  init();
51
  while(1);
52
}
Gast #880888
Lesenswert?

ich benutze den µc51 von wickenhäuser.
nen lösungsansatz haette ich gern gehabt, aber ich hatte wirklich noch 
keine ahnung wie ich das anstelle.
hat jemand für den µc51 ein paar zeilen quellcode die den timer nutzen?
danke!!
Gast #881756
Lesenswert?

naja, es funktioniert bei meinem compiler glaube ich nicht genauso. 
trotzdem erstmal danke fuer den code =)
1
Interrupt 1 using 1

Das ist Compiler spezifisch, oder?
wie muesste es denn lauten für den µc51? ich bin da leider noch nicht so 
versiert!
danke!
Gast #881774
Lesenswert?

Hallo,

das steht doch im Handbuch auf Seite 26:

http://www.wickenhaeuser.de/uc51data/uc51docu.pdf

Auf Seite 47 steht auch nochmal was bzgl. Interrupt-Bindung an 
Funktionen, also welche Funktion bei welchem Interrupt aufgerufen wird. 
Und laut Doku gibt es mitgelieferte Beispielprogramme, wo Interrupts 
verwendet werden.

Ich hätte auch ne Frage bzgl. µC51 von WH an dich, wie bist du damit 
zufrieden? Ich überleg mir, den zu kaufen, ist ja nicht sehr teuer.

Ralf
Gast #886736
Lesenswert?

ich habe noch eine frage...
wenn ich das ganze 50 mal durchlaufen lasse, blinkt meine LED im 
sekundentakt, soweit so gut. wenn ich sie jetzt aber 500 mal durchlaufen 
lasse, so muesst sie doch im 10 sekunden takt blinken oder?
tut sie nur leider nicht.
kann mir da vielleicht nochmal jemand weiterhelfen?
1
void TIMER0ISR (void) interrupt 1 {
2
  TH0  = TH0Reload; // Update MSB
3
  TL0  = TL0Reload; // Update LSB
4
  int_delay++;
5
  if (int_delay == 500) {
6
    // LED blinkt im Sekundentakt (500ms an, 500ms aus)
7
    // nur Bsp., anpassen!
8
    LED = !LED;
9
    int_delay = 0;
10
  }
11
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren