www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Malte Marwedel (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTFCBible...  (Sprich: beschaff' Dir einen Kernighan/Ritchie.)

void SetCommandPins (uint8_t cmd)

{

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



}

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTD = (cmd & 0xf0);

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

Autor: OldBug (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

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.