Forum: Mikrocontroller und Digitale Elektronik Bit Adressierung beim ATMEGA8


von FireFox (Gast)


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)

von Hubert.G (Gast)


Lesenswert?

Hier sollte alles stehen
www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Schreiben_eines_I.2FO- 
Registers

von FireFox (Gast)


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

von Alex (Gast)


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.

von Peter Dannegger (Gast)


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

von Rahul (Gast)


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

von Matthias (Gast)


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

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.