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!
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 | }
|
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!!
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!
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
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.
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 | }
|
Wenn dein int_delay noch derselbe_ Datentyp wie aus dem _ersten Listing ist, wirds nie gehen, weil ein Char nicht 500 werden kann... Ralf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.