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
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); }
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
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)
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
RTFCBible... (Sprich: beschaff' Dir einen Kernighan/Ritchie.) void SetCommandPins (uint8_t cmd) { PORTD = ((cmd << 3) & 0xf8); }
PORTD = (cmd & 0xf0); Mit dem Wert hinter "&" Maskierst Du das Byte.
Hab ich das jetzt irgendwie missverstanden? Ich glaube, ich sollte mich heute wieder ins Bett legen...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.