Atmega8515 Alternative Portadressierung

OP #736780
Lesenswert?

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.
#736829
Lesenswert?

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_t bit;
5
    uint8_t value;
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 (int cou=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....
#737315
Lesenswert?

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?
#737324
Lesenswert?

Alle Pins auf Zufall:
1
while (1)
2
{
3
    PORTA = rand();
4
    PORTB = rand();
5
    PORTC = rand();
6
    PORTD = rand();
7
}

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
  else if (tmp == 1)
8
    PORTB ^= 1 << (rand() & 7);
9
  else if (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ö ;)
#737329
Lesenswert?

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 ...
OP #737340
Lesenswert?

>
1
while (1)
2
> {
3
>   tmp = rand() & 3;    // weil 4 Ports: A, B, C, D
4
>   if (tmp == 0)
5
>     PORTA ^= 1 << (rand() & 7);
6
>   else if (tmp == 1)
7
>     PORTB ^= 1 << (rand() & 7);
8
>   else if (tmp == 2)...
9
> }

also sowas ist nicht schlecht, aber es ist nicht gegeben das jeder wert 
nur einmal vorkommt, dafür sicher.
#737346
Lesenswert?

> 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.....
OP #737347
Lesenswert?

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
#737353
Lesenswert?

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....
#737354
Lesenswert?

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!
#737360
Lesenswert?

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.
#737365
Lesenswert?

>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...
#737369
Lesenswert?

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_t Remaining[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
24
     // einfacher werden
25

26
     for( i = 0; i < 8; ++i )    // alle am Port A
27
       if( Remaining[i] < Now )
28
         PORTA |= ( 1 << i );
29

30
     for( i = 0; i < 8; ++i )    // alle am Port B
31
       if( Remaining[i + 8] < Now )
32
         PORTB |= ( 1 << i );
33

34
     for( i = 0; i < 8; ++i )    // alle am Port C
35
       if( Remaining[i + 16] < Now )
36
         PORTC |= ( 1 << i );
37

38
     for( i = 0; i < 8; ++i )    // alle am Port D
39
       if( Remaining[i + 24] < Now )
40
         PORTD |= ( 1 << i );
41

42
     _delay_ms( 10 );   // 10 ms * 32767 ( = RAND_MAX ) = 327 Sekunden,
43
                        // also etwas über 5 Minuten
44
  }
#737376
Lesenswert?

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.
#737405
Lesenswert?

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.
#737568
Lesenswert?

Meine Idee wäre:
1
uint8_t *port;
2
DDRA=DDRB=DDRC=DDRD=255;
3
PORTA=PORTB=PORTC=PORTD=0;
4
do 
5
{
6
  switch (rand()&3)
7
  {
8
      case 0:
9
         port=PORTA;
10
         break ;
11
      case 1:
12
         port=PORTB;
13
         break;
14
      case 2:
15
         port=PORTC;
16
         break;
17
      default:
18
         port=PORTD;
19
         break;
20
   }
21
   port|=(1<<(rand()&7));
22
   delay_ms (50);
23

24
} while (PORTA!=255 || PORTB!=255 || PORTC!=255 || PORTD!=255) ;

Bin mir nur gerade nicht sicher, ob die defintion "uint_8 *port;" 
stimmt. Sollte sich aber herrausfinden lassen...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren