Halli Hallo
Hab mal ne frage.
ich würde gerne wissen wie ich die ports ansteuern kann.
habe sie bereits als ausgänge in den datenregister eigetragen.
nun wüsste ich gerne, ob es möglich ist folgenden quelltext irgendwie
schlau auszugeben.
lichter[0]=(1<<PA0);
lichter[1]=(1<<PB7);
lichter[2]=(1<<PC3);
lichter[3]=(1<<PA2);
lichter[4]=(1<<PD5);
lichter[5]=(1<<PB6);
lichter[6]=(1<<PC4);
lichter[7]=(1<<PA4);
lichter[8]=(1<<PD6);
ich sollte dieses array mittels einer for schleife ausgeben, respektive
die pins auf high setzen. hat mir da jemand ne idee?
mit PORTA¦=lichter[1]; funktioniert das ja nicht. wie kann ich
unabhängig ohne PORTA oder so den Pin ansteuern?
Wäre um hilfe froh.
Wenn ich dich richtig verstanden habe, ist das auch unsinn.
Beispielsweise sind PA0, PB0 und PC0 vom Wert her absolut identisch.
Nämlich sind alle drei 0. Du kannst also von dem Wert den du ins
Lichter[]-Array geschrieben hast nicht auf den Port rückschliessen.
Vieleicht solltest du mal genauer erklären, warum du unbedingt aus einem
Array herraus die PortBits adressieren möchtest; vieleicht gibts einen
besseren weg. Bisher fällt mir nämich nur sowas ein:
1
struct
2
{
3
uint8_t*port;
4
uint8_tbit;
5
uint8_tvalue;
6
}portbits[9];
7
8
portbits[0].port=PORTB;
9
portbits[0].bit=PB0;
10
portbits[0].value=0;
11
12
13
portbits[1].port=PORTC;
14
..
15
..
16
17
for(intcou=0;cou<9;cou++)
18
{
19
if(portbits.value)
20
portbits[cou].port|=(1<<portbits[cou].bit);
21
else
22
portbits[cou].port&=~(1<<portbits[cou].bit);
23
}
Das wäre allerdings ein resourcenmonster und nicht wirklich schön....
also es geht mir darum alle PORTS zu nutzen sprich jeden PIN. die werden
dann mittels eines zufallsscript angesteuert. also die reihenfolge etc.
ist willkürlich. wie ich das sonst machen kann weis ich leider nicht
Christian Rutschmann wrote:
> also es geht mir darum alle PORTS zu nutzen sprich jeden PIN. die werden> dann mittels eines zufallsscript angesteuert. also die reihenfolge etc.> ist willkürlich. wie ich das sonst machen kann weis ich leider nicht
so vielleicht?
while( 1 ) {
tmp = rand() % 4; // weil 4 Ports: A, B, C, D
if( tmp == 0 )
PORTA = rand();
else if( tmp == 1 )
PORTB = rand();
else if( tmp == 2 )
PORTC = rand();
else
PORTD = rand();
}
oder musst du die Sequenz unbedingt zwischenspeichern?
@iqzero:
> Aber ich sollte mit sicherheit alle pins> angesteuert haben in einer bestimmten zeit. und so ist die wüllkür am> wüten
Auf die Erklärung, was das jetzt bedeuten soll, bin ich mal
gespannt....oder hat den jemand verstanden?
Zufälliger Pin auf Zufall (von Karl heinz geborgt):
1
while(1)
2
{
3
tmp=rand()&3;// weil 4 Ports: A, B, C, D
4
5
if(tmp==0)
6
PORTA^=1<<(rand()&7);
7
elseif(tmp==1)
8
PORTB^=1<<(rand()&7);
9
elseif(tmp==2)
10
PORTC^=1<<(rand()&7);
11
else
12
PORTD^=1<<(rand()&7);
13
}
zumindest, wenn "^=" in C existiert...
Wenn C das kann geht auch ein
1
switch(rand()&3)...
Bin mir aber immer noch nicht sicher, ob ich verstanden habe, was du
eigentlich brauchst...
ps:
>Auf die Erklärung, was das jetzt bedeuten soll, bin ich mal>gespannt....oder hat den jemand verstanden?
nö ;)
Christian Rutschmann wrote:
> ne muss ich nicht unbedingt. Aber ich sollte mit sicherheit alle pins> angesteuert haben in einer bestimmten zeit.
Das macht ein Lauflicht auch :-)
Ich geh schon mal Popcorn holen. Wenn der Thread nur die
Hälfte von dem hält was ich mir jetzt schon davon verspreche ...
also so was ist na dran. aber im prinzip sollte die random funktion den
bereich 0-7 zwar als bereich haben, aber die randoms sollten bei jedem
durchlauf nur einmal den gleichen wert liefern und dafür jeden einmal.
Wie wäre es wenn du mal erzählst was das Ganze denn werden soll.
Dann kann man sich nämlich mehr drunter vorstellen.
Und wer weiß, vielleicht kommt ja der eine oder andere
brauchbare Vorschlag.
> also sowas ist nicht schlecht, aber es ist nicht gegeben das jeder wert> nur einmal vorkommt, dafür sicher.
Häh?
Das Zufallsprinzip schliesst NIE aus, daß eine Fall nur einmal vorkommt.
Vieleicht solltest du mal zur Sache kommen und mal detailiert
beschreiben, was du überhaupt bauen möchtest. Was soll es werden, wenns
fertig ist?
Sonst raten wir uns hier noch die Lottozahlen zusammen.....
das ganze wäre für eine lichtersteuerung eines modells. ich habe eine
bestimmte zeit in der ich alle lichter brennen haben will dan soll ein
zufälliger übergang folgen, der ebenfalls eine bestimmte dauer hat. in
dieser zeit sollen alle lichter ausschalten. danach ist nichts an und
die sache läuft rückwerts.
im prinzip ist es eine tag nacht simulation. und die 4 ports mit je 8
pins brauche ich, da ich 32 lichter brauche
Christian Rutschmann wrote:
>> [...] zeit in der ich alle lichter brennen hab [...]
dessen bin ich mir bereits im Klaren. Und zwar in jeden Sinne.
> zufälliger übergang folgen, der ebenfalls eine bestimmte dauer hat. in
Was ist ein "zufälliger Übergang"?
> dieser zeit sollen alle lichter ausschalten. danach ist nichts an und> die sache läuft rückwerts.
Bis hin wo du "alle Lichter am brennen" hast?
> im prinzip ist es eine tag nacht simulation. und die 4 ports mit je 8> pins brauche ich, da ich 32 lichter brauche
Wenn du meinst....
Also ein Dithering?
- Jedem Port I/O einen zufälligen Grenzwert verpassen
- Ein Zähler, der runter-/hochzählt
- Für jeden I/O den Zähler mit dem Grenzwert vergleichen und das
Ergebnis dem I/O zuweisen.
Dann gehen nacheinander zufällig irgendwelche Lichter aus.
Meint er das? Übersetz mal einer!
Kai Giebeler wrote:
> Meint er das? Übersetz mal einer!
Stell dir ein Hochhaus vor.
Abends wenn es dunkel wird, gehen nacheinander die Lichter
an, und zwar so lange bis alle Lichter brennen.
Danach gehen sie alle wieder einzeln aus, bis wieder alle
aus sind.
Man kann aber die Reihenfolge nicht vorher sagen.
Karl heinz Buchegger wrote:
> Ich geh schon mal Popcorn holen. Wenn der Thread nur die> Hälfte von dem hält was ich mir jetzt schon davon verspreche ...
Ja??? - Wer ruft mich da??
MfG, BlauBär
>Stell dir ein Hochhaus vor.>Abends wenn es dunkel wird, gehen nacheinander die Lichter>an, und zwar so lange bis alle Lichter brennen.>Danach gehen sie alle wieder einzeln aus, bis wieder alle>aus sind.
Dann hab' ich's richtig (oder zumindest genauso) verstanden und der
obige Algorithmus sollte seinen Dienst erfüllen. Die Übersetzung in C
überlasse ich wer will...
Popcorn und Cola wär' jetzt echt 'ne Maßnahme...
Christian Rutschmann wrote:
> das ganze wäre für eine lichtersteuerung eines modells. ich habe eine> bestimmte zeit in der ich alle lichter brennen haben will dan soll ein> zufälliger übergang folgen, der ebenfalls eine bestimmte dauer hat. in> dieser zeit sollen alle lichter ausschalten. danach ist nichts an und> die sache läuft rückwerts.
Hmm.
Da könnte man auch eine Steuerung über die Zeit machen.
Für jedes Licht gibt es eine Variable, die angibt wie lange
dieses Licht noch hell bzw. dunkel sein soll. Nach Ablauf
der Zeit wechselt das Licht dann in den anderen Zustand.
Ich skizziere mal (für den Fall, dass bei gesetzten 1 Bit ein
Licht leuchtet und die Lichter nacheinander eingeschaltet
werden sollen)
1
uint16_tRemaining[32];// weil 32 Lichter
2
3
...
4
5
6
// für jedes Licht mal eine zufällig Zeitdauer festlegen
7
for(i=0;i<32;++i)
8
Remaining[i]=rand();
9
10
// mal alles aus
11
PORTA=0;
12
PORTB=0;
13
PORTC=0;
14
PORTD=0;
15
16
// und jetzt die Zeiten abarbeiten
17
// das Inkrement müsste man anpassen, damit die Gesamtdauer
18
// in etwa hinkommt
19
for(Now=0;Now<RAND_MAX;++Now){
20
21
// welche der 32 Lichter müssen eingeschaltet sein, weil
22
// ihre Schaltzeit bereits erreicht ist.
23
// ich mach das in 4 Gruppen, damit die Portzugriffe
Christian Rutschmann wrote:
> sieht auf den ersten blick nicht schlecht aus, ausser das halt die ports> der reihe nach angehen und nicht noch die ports vermischt angehen.
Woraus schliesst du das?
Die Leds gehen in der Reihenfolge an den jeweiligen Ports
an, so wie sie ihnen hier:
// für jedes Licht mal eine zufällig Zeitdauer festlegen
for( i = 0; i < 32; ++i )
Remaining[i] = rand();
in Form einer Wartezeit vorgegeben wurde. Und da wird für jede Led
eindeutig eine Zufallszahl vergeben.
Da kann es durchaus sein, dass sich mal 10 Sekunden überhaupt
nichts an den Led rührt und dann gehen 5 Led wild durcheinander
innerhalb von 2 Sekunden an.
Wie im richtigen Leben halt.
Kai Giebeler wrote:
> Danke für die Übersetzung in C!
Gern geschehen :-)
Das schöne ist, dass dieses Schema noch soviel Potential
für eine Spielwiese ohne Ende hat :-)
Einfach nur die Lichter nacheinander einschalten ist doch
fad. Die können auch mit einem Glitzereffekt sich
einschalten (wie die Blitzlichfotografen in einem Sportstadion)
oder ein / aus dimmen oder ...
Noch eine Software-PWM auf alle 32 Led gelegt, für jede Led
noch ein paar zusätzliche Parameter wie Leuchtdauer, Helligkeit
im Zustand aus, Helligkeit im Zustand ein, ...
und dem Spass ist Tür und Tor geöffnet.