Forum: Compiler & IDEs Ports und Pins über Funktion setzen


von Thomas (Gast)


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

von Jörg Wunsch (Gast)


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);
}

von Thomas (Gast)


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

von Malte Marwedel (Gast)


Lesenswert?

Das & 0x0f bedeutet, dass nur die unteren 4 Bits des PORTB die
Informationen von addr ausgeben. Die oberen 4 Bit bleiben Null, egal
was in addr steht. (0x0f -> 00001111)

von Thomas (Gast)


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

von Jörg Wunsch (Gast)


Lesenswert?

RTFCBible...  (Sprich: beschaff' Dir einen Kernighan/Ritchie.)

void SetCommandPins (uint8_t cmd)

{

  PORTD = ((cmd << 3) & 0xf8);



}

von OldBug (Gast)


Lesenswert?

PORTD = (cmd & 0xf0);

Mit dem Wert hinter "&" Maskierst Du das Byte.

von OldBug (Gast)


Lesenswert?

Hab ich das jetzt irgendwie missverstanden?
Ich glaube, ich sollte mich heute wieder ins Bett legen...

von Thomas (Gast)


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

von Jörg Wunsch (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.