P2 => Port2
und es hat auch 16bit
Was ist das P2 eigentlich ? Du verwendest es, als hätte es 16 Bit ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
P2 => Port2
und es hat auch 16bit
Schau, schau, sieh an.
Und was meinst du mit "gleichzeitig" ? die einen 8 Bit sollen ihre Lauflichter gleichzeitig (und unabhängig) mit den anderen 8 Bit machen ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
hallo
was meinst du mit schau schau sieh an.
der code hat drei funktionen
1. lauflicht vorwärts
2. lauflicht vorwärts und rückwärts mit
3. led blinken
im programm läuft es so ab dass zuerst die erste dann die zweite und dann die dritte funktion ausgeführt wird.
jedoch sollen die funktionen unäbhängig von den anderen ausgeführt werden d.h. alle drei funktionen gleichzeitig jede für sich
Soweit ich informiert bin ist das nicht möglich.
Du hast nur einen Prozessor und der kann immer nur eine Sache gleichzeitig machen.
Du kannst also die Funktionen nur nacheinander ablaufen lassen.
Aber das geht ja so rasend schnell das du es gar nicht mitbekommst. Wo liegt denn das Problem wenn sie nacheinander ablaufen?
Also wenn ich mir die Auflistung so anschaue, dann frag ich mich warum die gleichzeitig ablaufen sollen? gleichzeiting lauflicht vorwärts, lauflicht rückwärts und das ganze noch blinkend. willst du nen zufallsgenrator bauen?
gruß ceekay
Gut, versuch dich mal damit.
Alle drei Funktionen sind ineinander gemischt, der Effekt ist pseudo-gleichzeitig. Daher gibt es 3 "i" und 3 zeit-Counter und getrennte "P2", damit sie sich nicht in die Quere kommen.
Ich kann's nicht testen, daher kann schon sein, daß irgendwas nicht gleich funzt. In diesem Fall hast du aber am meisten davon, wenn du versucht, das Ganze zu verstehen und dann selbst daran rumzubasteln.
Edit: "schau, schau", weil wir es hier meistens mit 8-Bit Geräten zu tun haben.Code:#include <reg167.h> #define eins 2000 #define zwei 100 #define drei 50 void softdelay (); void erstes(); void zweites(); void drittes(); sbit port15= P2^15; static unsigned int i_1; static unsigned int Cnt_1; static unsigned int Patt_1; static unsigned int i_2; static unsigned int Cnt_2; static unsigned int Patt_2; static unsigned int i_3; static unsigned int Cnt_3; void main(void) { i_1 = 0; i_2 = 0; i_3 = 0; DP2 = 0xFFFF; Patt_1 = 0x0001; Patt_2 = 0x0100; port15 = 1; Cnt_1 = eins; Cnt_2 = zwei; Cnt_3 = drei; while(1) { if (Cnt_1 > 0) Cnt_1--; else { erstes(); Cnt_1 = eins; } if (Cnt_2 > 0) Cnt_2--; else { zweiter(); Cnt_2 = zwei; } if (Cnt_3 > 0) Cnt_3--; else { drittes(); Cnt_3 = drei; } softdelay(); } } ;---------------------------------------------- void erstes (void) { i_1++; Patt_1 <<= 1; if (i_1 >= 8) { i_1 = 0; Patt_1 = 0x0001; } P2 &= 0xFF00; P2 |= Patt_1; } ;---------------------------------------------- void zweites(void) { i_2++; if (i_2 >= 12) { i_2 = 0; Patt_2 = 0x0100; } else { if (i_2 < 6) Patt_2 <<= 1; else Patt_2 >>= 1; } P2 &= 0x00FF; P2 |= Patt_2; } ;---------------------------------------------- void drittes(void) { port15 ^= 1; } ;---------------------------------------------- void softdelay() { for (j=0; j <2000; j++) {}; }
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
hallo picnic
ich habe versucht dein programm zu simulieren. es waren einige fehler dabei aber die habe ich gefunden und ausgebessert.
und ich gratuliere dir es funktioniert mit einem kleinen fehler.
jedoch so ganz verstehe ich deinen code nicht.
In der while(1)-hauptschleife werden nacheinander die drei Delayzähler runtergezählt, die sind ja am Anfang 2000, 100 u. 50
Solange in denen was drin steht, wird nur EINMAL Softdelay angesprungen.
Der mit 50 wird als erstes Null kriegen. In diesem Fall rufen wir erstes() auf und setzen den Zähler wieder auf 50 fürs nächste mal.
Das passiert so bei allen drei Zählern.
erstes()
der erhöht i_1 und schiebt Patt_1 nach links.
ist (i_1 > 7), setzt er i_1 wieder auf Null und erneuert Patt_1
Jedesmal aber mischt er Patt_1 in P2:
P2 &= 0xFF00; löschen des gesamten Bytes in P2
P2 |= Patt_1; neusetzen aktueller Wert
zweites()
ist ganz ähnlich, nur schiebt er Patt_2 bei i_2: 0 -> 6 nach links, bei i_2: 7 -> 11 nach rechst. Bei zwölf alles wieder neu.
drittes()
der schaltet das bit in Port 15 einfach immer um (toggle) , einmal 1 und einmal 0
Tut mit leid, wenn ein Fehler drin ist![]()
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
hallo
ich habe mir das programm angeschaut und versucht es auf eine andere art zu schreiben
es funktioniert aber überhaupt nicht, kannst du mir vielleicht sagen was an der idee falsch ist
was bedeuten in deinem programm die patt variablen
und in der softdelay funktion ist eine warnung und ich weiß nicht was das ist
es zeigt auf die for schleife
"LAUFLICHT.C(23: warning C137: constant in condition expression "
danke auch für deine hilfe
Code:#define eins 500 #define zwei 250 #define drei 125 void softdelay(); void erste(); void zweite(); void dritte(); sbit port15= P2^15; void main(void) { DP2= 0xFFFF; P2=0x0001; while(1) { int i=0; for(i=0; i<=eins; i++) { if(i==drei) dritte(); else if(i==zwei) zweite(); else if(i==eins) erste(); softdelay(); } } } void erste(void) { if (P2<=0x0080) P2=P2<<1; else P2=0x0001; } void softdelay() { unsigned int j=0; for (j=0; j=2000; j++) {}; }
for (j=0; j=2000; j++)
Das soll heissen
for (j=0; j < 2000; j++)
das andere schau ich mir jetzt an
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen