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


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

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.