mikrocontroller.net

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


Autor: Marco (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
// Testprogramm TIMER
// Beispiel: LED blinkt im o.5s Takt

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

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

static unsigned char int_delay = 0;

// ********************************************************************
// Timer 0 Interrupt
// Routine wird alle 10ms aufgerufen
// ********************************************************************
void TIMER0ISR (void) interrupt 1 {
  TH0  = TH0Reload; // Update MSB
  TL0  = TL0Reload; // Update LSB
  int_delay++;
  if (int_delay == 50) {
    // LED blinkt im Sekundentakt (500ms an, 500ms aus)
    // nur Bsp., anpassen!
    LED = !LED;
    int_delay = 0;
  }
}

// ********************************************************************
// Grund-Initialisierung
// ********************************************************************
void init (void) {
  // Timer 0 initialisieren
  TMOD = 0x01;          // 0000 0001B    Timer 0: Mode 1 (16-Bit Zähler)
  TH0  = TH0Reload;   // Reloadwert Timer 0
  TL0  = TL0Reload;
  TR0  = 1;             // Timer 0 starten
  // Interruptsystem
  ET0  = 1;             // Timer 0, Interruptfreigabe
  EA   = 1;             // generelle Interruptfreigabe
}

// ********************************************************************
// Hauptprogramm
// ********************************************************************
void main (void) {
  init();
  while(1);
}

Autor: Marco (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hast Du Tomaten auf den Augen ;-)

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, es funktioniert bei meinem compiler glaube ich nicht genauso. 
trotzdem erstmal danke fuer den code =)
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!

Autor: Ralf (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
void TIMER0ISR (void) interrupt 1 {
  TH0  = TH0Reload; // Update MSB
  TL0  = TL0Reload; // Update LSB
  int_delay++;
  if (int_delay == 500) {
    // LED blinkt im Sekundentakt (500ms an, 500ms aus)
    // nur Bsp., anpassen!
    LED = !LED;
    int_delay = 0;
  }
}

Autor: Ralf (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

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

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.