Ports und Pins über Funktion setzen

Gast #100419
Lesenswert?

Halli hallo an Alle!

ich habe folgendes Problem.ich habe 14 Adressleitungen die ich über
zwei Ports ausgeben muss. nun möchte ich mit einer Funktion alle
Adressen gleichzeitig setzen. Wie kann ich also vom zweiten Port die
ersten 6 Adressen setzen und die anderen nicht?

Um das vielleicht noch ein bissl verständlicher zu machen, hier mal ein
Code...der aber so mit Sicherheit nicht stimmt:

struct {
    WORD A0:1;    // Bit 0 für Adresse 0
    WORD A1:1;    // Bit 1 für Adresse 1
    WORD A2:1;    // Bit 2 für Adresse 2
    WORD A3:1;    // Bit 3 für Adresse 3
    WORD A4:1;    // Bit 4 für Adresse 4
    WORD A5:1;    // Bit 0 für Adresse 5
    WORD A6:1;    // Bit 1 für Adresse 6
    WORD A7:1;    // Bit 2 für Adresse 7
    WORD A8:1;    // Bit 3 für Adresse 8
    WORD A9:1;    // Bit 0 für Adresse 9
    WORD A10:1;    // Bit 1 für Adresse 10
    WORD A11:1;    // Bit 2 für Adresse 11
    WORD A12:1;    // Bit 3 für Adresse 12
    WORD A13:1;    // Bit 3 für Adresse 13
                        // Die verbleibenden 3 Bits
                        // der Variable werden nicht
                        // genutzt.
} AdressPins;


void SetAdressPins (int AdressPins)
{
  A0  = AdressPins.A0;
  A1  = AdressPins.A1;
  A2  = AdressPins.A2;
  A3  = AdressPins.A3;
  A4  = AdressPins.A4;
  A5  = AdressPins.A5;
  A6  = AdressPins.A6;
  A7  = AdressPins.A7;
  A8  = AdressPins.A8;
  A9  = AdressPins.A9;
  A10 = AdressPins.A10;
  A11 = AdressPins.A11;
  A12 = AdressPins.A12;
  A13 = AdressPins.A13;
}


Da dies nicht mein einziges Problem dieser Art ist, würde ich mich sehr
über eine allgemeine Lösung freuen, in der man erkennt wie es möglich
ist, mit einer Funktion an die ein Wert übergeben wird, mehrere Ports
bzw. Pins davon zu setzen.

Vielen Dank schon mal im Vorraus,

MFG Thomas
Gast #100420
Lesenswert?

Du programmierst aber nicht gerade das bereits in der Hardware
vorhandene Memory-Interface neu, nicht wahr? ;-)

Ansonsten:

void
setaddr(uint16_t addr)
{

  PORTB = (addr >> 8) & 0x0f;
  PORTC = (addr & 0xff);
}
Gast #100421
Lesenswert?

Hallo Jörg!

Danke für die schnelle Antwort! So werde ich es gleich einmal
ausprobieren. Kannst Du mir bitte noch den Syntax mal beschreiben, da
ich es auch noch für andere Funktionen verwenden möchte. Ich versteh
das mit der Hexzahl dahinter nicht so recht!

Danke nochmal!

Thomas
Gast #100423
Lesenswert?

hey danke nochmal!

hm klingt logisch! Danke! Nur habe ich das ganze jetzt mal versucht auf
ein anderes Problem zu übertragen und da gehts wieder nicht so recht.
also bei Port D will ich nur die Bits 4-8 beschreiben. Dachte dann so
etwa:

void SetCommandPins (uint8_t cmd)
{
  PORTD = (cmd & 0xf8);

}

nur so werden nur die oberen 4 bits beschrieben.

also ich will bspw.: 10111 auf bit 4-8 bekommen. Übergabewert
wäre:0x17...wie geht das nun wieder?

sorry, wenns nervt....aber bin ein newbie ;-)))

Danke Thomas
Gast #100427
Lesenswert?

Hi Jörg!

also nochmals vielen lieben Dank...habs gleich getestet und es geht!
Was meinst Du mit:
RTFCBible...  (Sprich: beschaff' Dir einen Kernighan/Ritchie.)

ist das ein gutes Buch? Habe bis jetzt im Netz das Tutorial von
Christian Schifferle gefunden und benutzt. Es wollten auch schon
anderen im Forum eine Art Übersich praktischer Befehle. Nur gabs da
immer keinen Link. Klar im Prinzip muss man nur C richtig gut
beherrschen. Aber dennoch ist es auf die Anwendung bzgl. des µC
irgendwie gewöhnungsbedürftig und dafür wäre das nicht schlecht.
Gibts das so was in der Art?

Ciao Thomas
Gast #100428
Lesenswert?

Der ,,Kernighan/Ritchie'' ist die C-Bibel schlechthin.  ``The C
programming language'' heißt es wohl offiziell, gibt's auch in
Deutsch, und dem Vernehmen nach ist die zweite Auflage im Gegensatz
zur ersten in der deutschen Fassung sogar brauchbar.

Nach der ISBN kannste hier im Forum suchen, hat erst einer vor paar
Tagen gepostet.

C lernt man in der Tat am besten auf einer Universalmaschine.  Statt
der Ein-/Ausgaben kann man ja dort die Bits auf stdout darstellen oder
sowas.

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