Forum: Mikrocontroller und Digitale Elektronik Stoppuhr in C auf dem 89C51


von Marco (Gast)


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!

von Matthias (Gast)


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
}

von Marco (Gast)


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!!

von Matthias (Gast)


Lesenswert?

...hast Du Tomaten auf den Augen ;-)

von Marco (Gast)


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!

von Ralf (Gast)


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

von Marco (Gast)


Lesenswert?

danke fuer den link!
ich kann leider noch keine große auskunft geben darueber, benutzen den 
dieses semester erst in der uni. und es ist auch der einzige den ich 
kenne. Sorry.

von Marco (Gast)


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
}

von Ralf (Gast)


Lesenswert?

Wenn dein int_delay noch derselbe_ Datentyp wie aus dem _ersten 
Listing ist, wirds nie gehen, weil ein Char nicht 500 werden kann...

Ralf

von Marco (Gast)


Lesenswert?

ahaaaa...vielen dank für den hinweis!
daran hat's natuerlich gelegen.

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.