mikrocontroller.net

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


Autor: Marcel Lieser (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Marcel Lieser (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

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

Autor: Olaf (Gast)
Datum:

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

Autor: Michael Kiausch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]
  • [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.