mikrocontroller.net

Forum: Compiler & IDEs Bitadressierung beim ATmega


Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, weiss jemand, ob und wie man einzelne Port-Bits ansprechen kann:

zur Zeit verwende ich etwa die Form PORTA = PORTA|0x01, um den PIN
PORTA-Bit0 zu setzen. Daraus resultieren aber 3oder 4 Assembler
schritte. Gibts da nichts Bitadressierbares, etwa

  "PORTA.0 = 1;"


Gruß Martin

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

also PORTA = PORTA|0x01; wird bei meinem AVRGCC (aus aktuellem WINAVR)
zu einem SBI genauso wie PORTA = PORTA&(unsigned char)~(0x01); zu einem
CBI wird.

Matthias

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibt sich übrigens etwas eleganter

PORTA |= 1;

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die tips!

aber weiss denn auch jemand, wie man ein Portbit toggeln kann, etwa in
der Form

   PORTA ^= 0x01;

aber ohne dass der compiler daraus

     LDI     R22,0x01         Load immediate
     IN      R24,0x1B         In from I/O location
     EOR     R24,R22          Exclusive OR
     OUT     0x1B,R24         Out to I/O location

macht? schliesslich ist das ja ein mehrfacher bytezugriff mit der
Gefahr, dass ein Interrpt "dazwischenhaut" und alles
durcheinanderbringt. Hier hätte ich gerne einen Bitbefehl!!!



Gruß M.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

den gibts beim AVR nicht.

Matthias

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke!

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interrupt darf den Ablauf nicht durcheinander bringen. Um das
sicherzustellen werden die Register, welche in einer Unterroutiene
verwendet werden auf dem Stack gesichert.

Gruß, Florian

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Interruptroutine den Port selbst aber manipulieren könnte,
dann muß man das entsprechende Stück Code allerdings mit cli()/sei()
absichern.

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Joerg:

ich weiß zwar nicht genau was du meinst, aber wenn der AVR in eine
Interruptroutiene springt, so wird automatisch das Interrputflag
gelöscht und nach dem Verlassen der Routiene wieder gesetzt. So kann
die Abarbeitung eines Interrupts nicht durch einen anderen Interrupt
unterbrochen werden.

Der AVR-GCC hat 2 Interruptfunktionen: einmal Signal und Interrupt. Die
eine funktion funktioniert wie oben beschrieben. Bei der anderen wird
bei Beginn der Funktion das Interruptbit wieder gesetz. So kann dieser
Interrupt durch einen weitern Interrupt unterbrochen werden.

Gruß, Florian

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das meine ich nicht.  Wenn Du obige xor-Geschichte in Deinem
main() hast, eine Interruptroutine potentiell aber auf dem gleichen
Port Ausgaben machen kann, dann mußt Du die xor-erei in main() mit
einem cli()/sei() schützen um sicherzustellen, daß der temporäre
Wert, der vor dem xor vom Port gelesen wird, auch der korrekte ist.

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, jetzt hab ichs verstanden. Ist natürlich richtig.

Gruß, Florian

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.