toggle eines PortBits

Gast #104963
Lesenswert?
• ▲
▼
Es treibt mich nun seit zwei Stunden fast in den Wahnsinn:
Ich möchte ein Bit des PortB togglen bei einem Interrupt. Interrupt und
so weiter klappt. Nur das toggeln will nicht hinhauen.
Folgendes habe ich versucht:
  in r16, PINB
        out PORTB, (r16 ^ 0b00000001)
d.h. Port B wird eingelesen, alle Bits werden belassen ausser Bit 0
(XOR Verknüpfung mit 0000 0001).

Nun bringt AVR Studio einen Fehler bei der zweiten Zeile: Illegal
Argument type or count.

Wer weiss Rat bzw. kann mir einen Link auf eine Seite geben wo solche
grundsätzlichen Sachen wie Bits toggeln (u.v.m.) einem Anfänger erklärt
werden.
Gast #104967
Lesenswert?
• ▲
▼
denke nicht, ausser du willst nur einen pin behandeln

  sbic PortB, OutPin2    ; Pin Toggle für Clock aussen
  rjmp ClrBitNow
  sbi PortB, OutPin2
  rjmp BitReady
ClrBitNow:
  cbi PortB, OutPin2
BitReady:

oder geht das noch kürzer?
Gast #104970
Lesenswert?
• ▲
▼
Die Diskussion hatten wir schon mal. Das Problem mit Peters Code ist das
er PINB zweimal sequentiell abfragt und dazu 3 Taktzyklen benötigt.
Innerhalb dieser Takte könnte es zu einem Pegelwechsel am PIN kommen
und somit würde der neue Ausgangstatus falsch sein.
Die XOR Maskierung hat dieses Problem nicht, benötigt auch nur 4
Zyklen, dafür aber verbraucht sie mehr Resourcen.

Gruß Hagen
#104971
Lesenswert?
• ▲
▼
In der Tat hat die von mir gezeigte Routine einen Knackpunkt.
Zwischen der 2. und 3. Instruktion darf kein Interrupt erfolgen, sonst
würde das SBIC ja schon den Pegel des SBI auswerten.

Eine andere Möglichkeit wäre, wenn man nur Pin 8 kippen will:

        in      r16, PORTB
        subi    r16, 0x80
        out     PORTB, r16


Peter

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.