Hallo Zusammen, ich habe eine Frage bezüglich Zeitscheibensysteme! Hier ein Auschnitt von meinem Programm: void Application_init (void) { DDRC = DDRC | LED; // Port Bit PC3 set to Output LED_DDR = LED_DDR | LED_Bit; // Set PC2 as Output //LED_PORT = LED_PORT | LED_Bit;// LED aus blink = 0; PORTC = PORTC & ~LED; // LED on LED_PORT = LED_PORT & ~LED_Bit; Timer0_init (); // Timer initialisieren (ist in einem anderen Source File) sei (); // Enable global Interrupt } //------------- Application 10ms ---------------------------- void Application_10ms () { } //------------- Application 100ms --------------------------- void Application_100ms () { blink = ~blink; if (blink) { LED_PORT = LED_PORT & ~LED_Bit; // LED an } else { LED_PORT = LED_PORT | LED_Bit; // LED aus } } //------------- Application 500ms --------------------------- void Application_500ms () { } //------------- Application 500ms --------------------------- void Application_1s (void) { blink = ~blink; //-------------- LED blinken -- if (blink) {PORTC = PORTC | LED; } else {PORTC = PORTC & ~LED; } } Ich will das die LED (LED_Bit) 400 ms an und 900 ms aus ist. Das ganze soll aber in der 100 ms Zeitscheibe ablaufen. Kann jemand weiterhelfen? Viele Grüsse
Judgin F. schrieb: > void Application_100ms () > { if( blink <= 10) blink++; else blink=0; if (blink<=4) > { > LED_PORT = LED_PORT & ~LED_Bit; // LED an > } > else > { > LED_PORT = LED_PORT | LED_Bit; // LED aus > } > } vieleicht so? hoffe ich habe mich nicht verschrieben oder verzählt
@ Düsendieb: Habe es gerade ausprobiert. Er lässt die LED 500 ms an und dann 500 ms aus. Die Zeiten sollten aber 400 ms an und 900 ms aus sein. Also nicht korrekt! Leider! Ich bin gerade auf der Suche. Wenn du noch einen Tipp hast, dann gerne! Gruß
Judgin F. schrieb: > Er lässt die LED 500 ms an und dann 500 ms aus. Sicher? Ich vermute es sind 500ms an und 700ms aus. Was mir gerade noch aufgefallen ist: Wie ist blink definiert? Du verwendest diese Variable mehrfach mit unterschiedlicher Bedeutung! > Die Zeiten sollten aber 400 ms an und 900 ms aus sein. Dann verändere die Zahlen (hier auch mit eigenständigem Zähler): if( blink_100ms <= 11) blink_100ms++; else blink_100ms=0; if (blink_100ms<=3) Der Zähler zählt von 0 bis 12, alle 100ms wird inkrementiert. Bei den Werten 0 bis 3 ist die LED an, also für 400ms. Bei den Werten 4 bis 12 ist die LED dann aus, also für 900ms.
@Volkmar ja, so gehts. Danke. ich habe davor noch eine andere Variante probiert, nämlich: for (i = 0; i<4; i++) { LED an; } for (i = 0; i<9; i++) { LED aus; } ging nicht! Wieso eigentlich?
@Volkmar p.s. meine Varible ist so dek.: volatile unsigned char blink; Dann kann ich ja diese für z.B. zwei Zeitscheiben (also 500 ms und 100 ms) verwenden. Stimmt das so?
Judgin schrieb:
>Wieso eigentlich?
... weil Deine Variable i nix mit der Zeit zu tun hat, sondern in der
Schleife decrementiert wird. Und das geht rasend schnell.
Judgin F. schrieb: > Dann kann ich ja diese für z.B. zwei Zeitscheiben (also 500 ms und 100 > ms) verwenden. Stimmt das so? Nein, kannst Du nicht. Die Variable zählt ja die Anzahl der Zeitscheiben. Wenn die Variable nun in beiden Zeitscheiben benutzt und inkrementiert wird, dann zählt diese (bei 100ms und 500ms) die Zeitscheiben zum Zeitpunkt 500ms doppelt. Daher solltest Du separate Zähler für die einzelnen Zeitscheiben verwenden, deswegen habe ich die Bezeichnung blink_100ms verwendet. Volkmar
Judgin und was ist mit dem Vorschlag von Peter? Die Idee greift auch bei diesem Problem und man fängt bei einer neuen Aufgabenstellung nicht mehr von Vorne an. Beitrag "Re: Wartezeiten effektiv (Scheduler)"
Zähler für Funktionen kann man auch sehr schön als funktionsstatisch deklarieren dann gibt es keine Probleme mit versehentlicher doppelverwendung.
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.