mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8515 Alternative Portadressierung


Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha okay danke für den hinweis. wie kann ich dann alle pins auf 
verschiedenen ports einzeln ansteuern?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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:
struct
{
    uint8_t *port;
    uint8_t bit;
    uint8_t value;
} portbits[9];

portbits[0].port=PORTB;
portbits[0].bit= PB0;
portbits[0].value=0;


portbits[1].port=PORTC;
..
..

for (int cou=0;cou<9;cou++)
{
    if (portbits.value)
       portbits[cou].port|=(1<<portbits[cou].bit);
     else
       portbits[cou].port&=~(1<<portbits[cou].bit);
}

Das wäre allerdings ein resourcenmonster und nicht wirklich schön....

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Rutschmann wrote:

> also es geht mir darum alle PORTS zu nutzen sprich jeden PIN.

Und wieso sagst du das nicht gleich?! grummel *seuftz*

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne muss ich nicht unbedingt. Aber ich sollte mit sicherheit alle pins 
angesteuert haben in einer bestimmten zeit. und so ist die wüllkür am 
wüten

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle Pins auf Zufall:
while (1)
{
    PORTA = rand();
    PORTB = rand();
    PORTC = rand();
    PORTD = rand();
}

Zufälliger Pin auf Zufall (von Karl heinz geborgt):
while (1)
{
  tmp = rand() & 3;    // weil 4 Ports: A, B, C, D

  if (tmp == 0)
    PORTA ^= 1 << (rand() & 7);
  else if (tmp == 1)
    PORTB ^= 1 << (rand() & 7);
  else if (tmp == 2)
    PORTC ^= 1 << (rand() & 7);
  else
    PORTD ^= 1 << (rand() & 7);
}

zumindest, wenn "^=" in C existiert...

Wenn C das kann geht auch ein
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ö ;)

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der zweite Code tut nicht, was er soll. Bitte ignorieren. Auf Wunsch 
korrigiere ich den.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christian Rutschmann (bqzero)
Datum:

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

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

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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.....

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zufälliger übergang heisst hier das in einer unbestimmten reihenfolge 
jedes einzelne licht angehen soll.
also was ein dithering ist weis ich ja nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)
   uint16_t Remaining[32];    // weil 32 Lichter

   ...


   // für jedes Licht mal eine zufällig Zeitdauer festlegen
   for( i = 0; i < 32; ++i )
     Remaining[i] = rand();

   // mal alles aus
   PORTA = 0;
   PORTB = 0;
   PORTC = 0;
   PORTD = 0;

   // und jetzt die Zeiten abarbeiten
   // das Inkrement müsste man anpassen, damit die Gesamtdauer
   // in etwa hinkommt
   for( Now = 0; Now < RAND_MAX; ++Now ) {

     // welche der 32 Lichter müssen eingeschaltet sein, weil
     // ihre Schaltzeit bereits erreicht ist.
     // ich mach das in 4 Gruppen, damit die Portzugriffe
     // einfacher werden

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

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

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

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

     _delay_ms( 10 );   // 10 ms * 32767 ( = RAND_MAX ) = 327 Sekunden,
                        // also etwas über 5 Minuten
  }

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht auf den ersten blick nicht schlecht aus, ausser das halt die ports 
der reihe nach angehen und nicht noch die ports vermischt angehen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay hast ja recht habs noch nicht ganz kappiert gehabt. aber leuchtet 
ein. ist noch genial das script.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Übersetzung in C! Sollte mich doch irgendwann mal mit der 
Sprache auseinandersetzen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Rutschmann wrote:

> ist noch genial das script.

Script?! Mir klingeln die Ohren!

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Idee wäre:
uint8_t *port;
DDRA=DDRB=DDRC=DDRD=255;
PORTA=PORTB=PORTC=PORTD=0;
do 
{
  switch (rand()&3)
  {
      case 0:
         port=PORTA;
         break ;
      case 1:
         port=PORTB;
         break;
      case 2:
         port=PORTC;
         break;
      default:
         port=PORTD;
         break;
   }
   port|=(1<<(rand()&7));
   delay_ms (50);

} 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.