Forum: Mikrocontroller und Digitale Elektronik Verstreute Portpins zu einem Port zusammenlegen


von Michael (Gast)


Lesenswert?

Hallo,

ich programmiere einen ATtiny2313, und da dort die TWI Pins und die 
RS232 Pins  mitten in den Ports liegen kann ich keinen vollständigen 
Port benutzen. Außerdem sind es noch 9 Pins.
Wie kann ich am elegantesten z.B. die PINS PA1,PA2, PB0-3, PD3-5 über 
eine Variable setzen und rücksetzen, ähnlich PORTA = 0x05?

Vielen Dank

Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gar nicht.

von Sebastian (Gast)


Lesenswert?

Du schreibst in C?
Dann wohl noch am comfotabelsten (nicht unbedingt am elegantesten!) wenn 
du dir eine Funktion schreibst die das Aufspitten übernimmt.
Das wirst du aber wohl händisch machen müssen. Und bei dieser 
Bitschupserei sollte man fast über inline-Assambler nachdenken.

Sebastian

von Michael (Gast)


Lesenswert?

Hallo,

ja ich programmiere in C, und hab auch schon eine Funktion.
Die Pins stehen in einer struct mit 9 einzelnen Bit's

struct S
{
  unsigned Bit0:1;
  unsigned Bit1:1;
  .....
  unsigned Bit8:1;
}s;

Die Ports setze ich in einer Funktion mit 9 if else abfragen.
Dauert mir aber zu lange.

Hätt ja sein können das es etwas einfacheres gibt:-(

Vielleicht hat ja jemand noch etwas.

von Paul Baumann (Gast)


Lesenswert?

In BASCOM kann man zum Beispiel eine Subroutine vereinbaren:

Declare Sub Schreibe_Port (x as Byte)

und dann dort sagen:

Sub Schreibe_Port (x as Byte)

Portc.0=x.0
Portc.1=x.1
Portd.2=x.2
....
usw.
End sub

Das heißt, man kann so verschiedene Bits von verschidenen Ports in eine
Variable x einlesen.

MfG Paul

von Sebastian (Gast)


Lesenswert?

Hätte einfach ein char übergeben und dann über schieben und ausmaskieren 
den rest gemacht.
Wenn man die Pins halbwegs intelligent in dem Char anordnet sollte das 
auch recht gut gehen.
Würde wohl so ordnen:

PA1,PD5,PD4,PD3,PB3,PB2,PB1,PB0

(PA2 dann hänisch ansprechen ;-)

PortB = Ausgabe & 0b00001111;

gibt dann den Teil für PortB aus.

PortD = (Ausgabe >> 1) & 0b00111000;

gibt den Teil für PortD aus.

PortA darfst du dir selbst überlegen ;-)

Sebastian

von Michael (Gast)


Lesenswert?

Ja klar,

zusammenschieben, probier ich mal.

Danke

von Simon K. (simon) Benutzerseite


Lesenswert?

Paul Baumann wrote:
> In BASCOM kann man zum Beispiel eine Subroutine vereinbaren:

In C geht das schließlich nicht ;) Okay, stimmt. Es heißt dort Funktion.

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.