Bit Adressierung beim ATMEGA8

Gast #167139
Lesenswert?

Gibt es denn beim GCC die Möglichkeit einzelne Bits direkt zu
adressieren?

Ich denke dabei an sowas: (so hab ich beim C515C z.B. Taster
definiert)

sbit Schalter1 = PortB.7;

Im Programm muss ich dann nur noch:

Schalter1 = EIN;
Schalter1 = AUS;

(natürlich mit der entsprechenden define Anweisung)
Gast #167141
Lesenswert?

Naja, das mein ich nicht. Dass man die Portregister maskieren kann ist
schon klar.

Was ich möchte ist eine Variable, die direkt auf die einzelnen Portpins
zugreift.

Also Schalter1 = 1; --> z.B. PortD.5 hat 5V
Gast #167142
Lesenswert?

Tja, und das geht nunmal so nicht, es sei denn du definierst dir ein
Makro. Lies mal ein bischen im Datenblatt und dir wird vielleicht sogar
klar, warum das so ist.
Dann hast du auch ein wenig mehr verstanden, wie ein Mikrocontroller
funktioniert.
Gast #167143
Lesenswert?

Es gibt AVR Kompiler, die sowas können, aber der GCC definitiv nicht.

Mich hat das auch schon gestört.

Man muß also für jeden einzelnen Pin umständlich 2 defines machen:

#define KEY1_PIN  PINB  ;Input port
#define KEY1_NO   PINB2 ;pin number

if( KEY1_PIN & 1<<KEY1_NO )
  mache was

usw.


Peter
Gast #167144
Lesenswert?

@Peter:
stimmt, das ist ziemlich umständlich.
Ich bin mir jetzt nicht ganz sicher, aber es könnte sein, dass die Pins
in der "avr/io.h" schon definiert sind.
Sonst ist es mit "1<<n" doch relativ elegant, wobei n ja die
Pin-Nummer angibt.

für das Ein- bzw. Ausschalten kann man sich natürlich Makros scheiben,
die die Arbeit erleichtern.

Ich verwechsle auch regelmässig PORTA &= ~(1<<N) mit PORTA |= (1<<N).
Ich weiß dann immer nicht welche Variante den Ausgang auf ein- und
welche ihn ausschaltet.
Erschwerend kommt dann noch das Leuchten der LEDs auf dem STK550 hinzu
(L-aktiv).

Gruß Rahul
Gast #167145
Lesenswert?

Hi

ich definier mir deshalb immer für jeden Ausgangspin zwei Makros der
Art

#define HS1_ON          PORTC|=(1<<0)
#define HS1_OFF         PORTC&=((unsigned char)(~(1<<0)))

wobei ON und OFF nicht unbedingt High und Low entsprechen müssen. Für
Eingänge gibts dann noch

#define IN1             (PINA&(1<<6))

Matthias

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren