mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bit Adressierung beim ATMEGA8


Autor: FireFox (Gast)
Datum:

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

Autor: Hubert.G (Gast)
Datum:

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

Autor: FireFox (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

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

Autor: Peter Dannegger (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

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.