Forum: Mikrocontroller und Digitale Elektronik Zeitscheibensysteme


von Judgin F. (einsteiger777)


Lesenswert?

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

von Düsendieb (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?


von Judgin F. (einsteiger777)


Lesenswert?

@ 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ß

von Volkmar D. (volkmar)


Lesenswert?

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.

von Judgin F. (einsteiger777)


Lesenswert?

@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?

von Judgin F. (einsteiger777)


Lesenswert?

@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?

von slow (Gast)


Lesenswert?

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.

von Volkmar D. (volkmar)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

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)"

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.