PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warteschleife in ms



Tairell
06-06-2005, 07:55
Hi leutz,...sitz hier in der Schule beim C Programmieren und habn kleines Prób...
Hier erstmal das Programm...

//-header-
#include <reg552.h>
#include <stdio.h>

void lauf (void);
void licht1 (void);
void licht2(void);
void warten (void);

//--------------------- main ----------------------------------------------
void main (void) // Main Programm
{
int start; // Variable Start
P1 = 0xff; // P1 als Eingang definiert

while(1) // Schleife für gesamt Programm
{
start=P1 & 0x01; // Schalter 0 als An/Aus Schalter definiert

if (start==1)
{
lauf (); // Verweis auf Unterprogramm lauf
}
else
{
P4=0x00;
}
}
}
void licht1 (void) // Lauf von LED0 nach LED7

{
P4=0x80;
warten(); // Verweis auf Unterprogramm warten
P4=0x40;
warten();
P4=0x20;
warten();
P4=0x10;
warten();
P4=0x08;
warten();
P4=0x04;
warten();
P4=0x02;
warten();
P4=0x01;
warten();
}

void licht2 (void) // Lauf von LED7 nach LED0

{
P4=0x01;
warten();
P4=0x02;
warten();
P4=0x04;
warten();
P4=0x08;
warten();
P4=0x10;
warten();
P4=0x20;
warten();
P4=0x40;
warten();
P4=0x80;
warten();
}


void lauf (void) // Bestimmung der Laufrichtung durch umlegen des Schalter 1
{
int renn; // Variable für Schalter 1
renn=(P1 & 0x02)>>1;
if (renn==1)
{
licht1 (); // Verweis auf Unterprogramm licht1
}
else
{
licht2 (); // Verweis auf Unterprogramm licht2
}
}

void warten (void) // Wartefrequenz für 1-4 hz
{
int i;
int x; // Variable für Schalter 6 und 7
x=(P1 & 0xc0)>>6;
if (x==0)
{
x=4;
for (i=0;i<5000/x;i++); // 5000 = ~1 hz
}
else
{
for (i=0;i<5000/x;i++); // 5000 = ~1 hz
}
}

Das ganze soll ein Lauflicht darstellen. Wie können wir jetzt eine Wartezeit in ms einbauen ? 2. Problem, wie können wir das Lauflicht über eine Shiftfunktion weiterlaufen lassen ?

Ich würde mich über "schnelle" Hilfe freuen, denn unsere Lehrer sind nicht wirklich bereit uns zu helfen :*(,.....Danke im Vorraus

Mfg Tai

locus vivendi
06-06-2005, 09:28
void main(...) ist falsch, es muss int main(...) sein, wie hier schon mehrfach erötert wurde. Ansonsten wäre evtl. hilfreich gewesen, wenn ihr mitgeteilt hättet, dass das Ganz auf einem Mikrocontroller laufen soll. Sonst hätte ich euch jetzt einfach auf nanosleep oder usleep verwiesen. Mit Mikrocontrollern kenne ich mich nicht so aus, aber ihr solltet irgendwo in der Entwicklungsumgebung zu dem Teil eine Wartefunktion finden, da müsst ihr in die Doku schauen. Ansonsten z.B. Inline-Assembler benutzen und in einer Schleife einen Befehl aufrufen, von dem ihr wisst, wieviel Takte er Zeit braucht.

peschmae
06-06-2005, 15:37
Entweder machst du das mit nem Interrupt, falls das Ding das kann (wird wohl wenn du das mit C programmieren kannst) oder halt mit einem Wartebefehl der je nach Microcontroller und so halt anders heisst :D

MfG Peschmä

r00t043
06-06-2005, 16:06
So im Groben und Ganzen:
-prescaler fuer den timer setzen (falls man das kann)
-timer overflow interrupt einschalten
im Interrupt dann soetwas:

P4=(P4==0x01)?0x80:P4>>1;
oder anders herum, aufrufen.
Die restlich Details, die du brauchst, findest du in dem Datenblatt deines 8051.