Forum: Mikrocontroller und Digitale Elektronik Bit 2 bis 5 als EINE Variable ansprechen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Marcel Lieser (Gast)


Lesenswert?

Hallo

An die C Hirschen... (bin noch Anfänger)

Ist es in C möglich (verwende Codevision-Umgebung) die Pins 2,3,4,5 von 
Port C als EINE Variable anzusprechen (Nibble)?
Oder muss ich mit einer Maske die unbenötigten maskieren???

Danke

von Oliver (Gast)


Lesenswert?

Hallo Marcel,

Port C (8 Bit?) auslesen: c <-- Port C
2 mal rechts shiften und maskieren: c = (c>>2)&0x0F
Jetzt liegen die Pinwerte 2,3,4,5 als eine Variable vor.

Grüße
Oliver

von Marcel Lieser (Gast)


Lesenswert?

Hallo Oliver

Ich möchte nicht auslesen, sondern ausgeben. Und wenn ich die 4Bit auf 
den ganzen Port mit 8Bit schreiben würde, wären die Bits 0-3  gesetzt 
anstatt Bit 2-5.

Ich suche irgendwas in der Form von:

#define BCD_Output [PORTC.2;PORTC.3;PORTC.4;PORTC.5]

Vielleicht könnte ich selbst einen Datentyp definieren (#typedef) aber 
ich weiss nicht, was ich schreiben soll...

von Oliver (Gast)


Lesenswert?

Ich weiss nicht, wie Du Deine Ports in C ansprichst, aber so müßte es 
gehen:

PortC = PortC | (Deine_Variable&0xF)<<2

Deine_Variable enthält den Wert(low nibble). High Nibble wird 
ausgeblendet und alles an die Bitstelle 2 bis 5 verschoben.

von Schmittchen (Gast)


Lesenswert?

@Oliver
So ist es aber leider nicht möglich eine 0 auszugeben, wenn der Portpin 
vorher auf einer 1 stand.

von Oliver (Gast)


Lesenswert?

Stimmt!
Hüftschuß:
PortC = (PortC&0xC3) | (Deine_Variable&0xF)<<2

Muß aber irgendwie eleganter gehen!?
Denke noch mal darüber nach

von Olaf (Gast)


Lesenswert?

Hi Marcel,

um das Maskieren wirst du wohl nicht herumkommen; schreib dir doch 
einfach ein Makro. Weiß gerade nicht, ob CV mit dieser Terminologie 
arbeitet, aber so ungefähr wird es gehen:

#define LCD_PORT(X) PORTC = ((PINC&0xC3)|X)

Beim GCC:
#define LCD_PORT(X) outp((inp(PINC)&0xC3)|X,PORTC)

Gruß
Olaf

von Michael Kiausch (Gast)


Lesenswert?

hi,
probier doch mal ein bisschen inline assebler und bastel dir was mit SBI 
und CBI (set bit in I/o register und das gleiche mit clear)

beispielfetzen:

asm volatile("cbi portc, 0") // setzt pb0 <- 0
asm volatile("sbi portc, 1") // setzt pb1 <- 1

natürlich noch ne nette funktion und ne schleife und ein par ifs und 
viele klammern drumbasteln (asm ist eben doch unkomplizierter ;D)
ich hab wirklich keine ahnung, obs so geht, aber meiner meinung nach 
wärs ein möglicher ansatz :D

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]
  • [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.