Port-Pin Konfiguration, Grundsatzfrage

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Port-Pin Konfiguration, Grundsatzfrage

      Hallo zusammen

      Wenn ich einen Pin per Alias Konfiguriere, den ich als Eingang mit int. PullUp verwenden will schreibe ich bisher immer folgendes:

      PIN_EINGANG Alias PinB.0 : Set PortB.0

      Doof ist, wenn ich den Pin ändere, dann muss ich den Port von Hand extra ändern.

      Jetzt hatten wir letztes mal das Thema, dass ein Port auch Toggeln kann, ohne den Port.Pin zu lesen, zu ändern und wieder zu schreiben.
      Dazu schreibt man ja auf den Pin (nicht den Port) eine 1.

      Das sollte doch auch mit den Input gehen.

      Wenn ich also schreibe
      PIN_EINGANG Alias PinB.0
      Set PIN_EINGANG

      Dann sollte der int. PullUp eingeschaltet werden.
      Wenn ich erneut schreibe
      Set PIN_EINGANG,
      dann müsste der PullUp wieder aus sein.


      Bei den IO-Ports steht im Datenblatt (Beispiel Mega8) folgendes:
      All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports. This means that the direction of one port pin can be changed without unintentionally changing the direction of any other pin with the SBI and CBI instructions. The same applies when chang- ing drive value (if configured as output) or enabling/disabling of pull-up resistors (if configured as input). Each output buffer has symmetrical drive characteristics with both high sink and source capability. The pin driver is strong enough to drive LED displays directly. All port pins have indi- vidually selectable pull-up resistors with a supply-voltage invariant resistance. All I/O pins have protection diodes to both VCC and Ground as indicated in Figure 21. Refer to “Electrical Charac- teristics – TA = -40°C to 85°C” on page 235 for a complete list of parameters.

      Die Übersetzung fällt mir aber etwas schwer.


      Meine Frage: Stimmt meine Vermutung und trifft das auf alle AVR's zu (Tiny, ATMega, XMega)
    • Mitch64 schrieb:

      Wenn ich also schreibe
      PIN_EINGANG Alias PinB.0
      Set PIN_EINGANG

      Dann sollte der int. PullUp eingeschaltet werden.
      Wenn ich erneut schreibe
      Set PIN_EINGANG,
      dann müsste der PullUp wieder aus sein.
      nein, nur das Portregister hat auf den Pullup Zugriff, nicht das Pinregister.
      Da gibt es auch irgendwo im Datenblatt ein Blockschaltbild, wie das bei den neuen Atmegas mit dem Toggeln funktioniert. Nebenbei sieht man die anderen beiden Funktionen.
    • CBI/SBI sind Instruktionen mit denen man einzelne Bits in einem I/O-Register setzen/löschen kann, es gibt keinen Single-Cycle-Befehl der ein Bit togglen kann.
      In den alten AVRs (zb. Mega8) haben die GPIOs nur Status-Register, die entweder den Register-Inhalt 1:1 am Port ausgeben oder 1:1 einlesen (also Spannung da: 1, nicht da: 0). Hier kann man also nicht mit einer einzelnen Instruktion Togglen, man muss den aktuellen Registerwert einlesen, EOR ausführen und den Wert wieder schreiben.
      Neuere AVRs (zb. Attiny3217, S. 149) haben zusätzlich noch Toggle-Register, bei denen das Schreiben einer 1 das betreffende Bit im Statusregister invertiert, da kann man mit Set (wird in SBI übersetzt) den Pin tatsächlich togglen.
    • zaubara schrieb:

      Neuere AVRs (zb. Attiny3217, S. 149) haben zusätzlich noch Toggle-Register, bei denen das Schreiben einer 1 das betreffende Bit im Statusregister invertiert, da kann man mit Set (wird in SBI übersetzt) den Pin tatsächlich togglen.
      OK, damit wäre eine Frage geklärt: Nicht alle AVR's können das.

      Bleiben wir mal bei einem neuen Controller.

      Wenn ich einen Eingang konfiguriert habe, und ich schreibe in das Port-Register, wird der int. PullUp aktiviert/deaktiviert.
      Was passiert aber, wenn ich in das PIN-Register schreibe?
    • Mitch64 schrieb:

      PIN_AUSGANG Alias PortB.0

      Config PIN_AUSGANG=Output
      Set PinB.0 ' Ausgang toggeln
      Set PinB.0 ' nochmal toggeln

      Ist das richtig?
      ja

      Mitch64 schrieb:

      Wenn ich einen Eingang konfiguriert habe, und ich schreibe in das Port-Register, wird der int. PullUp aktiviert/deaktiviert.
      Was passiert aber, wenn ich in das PIN-Register schreibe?
      gar nix.
      Die interne logische Verknüpfung auf dein Pin-Toggeln geht nur, wenn der Pin auf Output ist.
    • Problem gelöst

      Es hat mir jetzt keine Ruhe gelassen.
      Ich hab es jetzt einfach ausprobiert.

      Also den int. PullUp Toggeln und den Output Toggeln geht, indem man in das Pin-Register schreibt.
      Allerdings gehts nicht beim Mega 8, Da hat Michael recht.

      Mir gings dabei aber um den PullUp einzuschalten.

      Aber ich habs mit dem Mega 168 getestet und da geht es.

      Im Datenblatt atmega48_88_168.pdf Seite 79 (Datei in Bascom PDF-Verzeichnis) steht hierzu
      Spoiler anzeigen

      14.2.2 Toggling the pin

      Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
      Note that the SBI instruction can be used to toggle one single bit in a port.


      Kann jeder selber nachprüfen:
      Den Toggel-Effekt kann man mit dem Oszi sehen oder mit dem Multimeter, wenn man die Frequenz verlangsamt.

      Hier das Testprogramm um den PullUp zu toggeln.

      BASCOM-Quellcode

      1. $Regfile = "m168def.dat"
      2. $HWStack = 32
      3. $SWStack = 32
      4. $FrameSize = 32
      5. $Crystal = 8000000
      6. ' Dieses Programm Toggelt den int. Pullup.
      7. PIN_TEST Alias PinB.0 ' Pin ist Eingang
      8. Do
      9. Set PIN_TEST ' Toggelt PullUp
      10. Waitms 500
      11. Loop
      Alles anzeigen

      Und hier noch das Programm um den Ausgang zu toggeln.

      BASCOM-Quellcode

      1. $Regfile = "m168def.dat"
      2. $HWStack = 32
      3. $SWStack = 32
      4. $FrameSize = 32
      5. $Crystal = 8000000
      6. ' Dieses Programm toggelt den Ausgang, indem in das Pin-Register geschrieben wird
      7. Config PortB.0 = Output ' Pin ist Ausgang
      8. Do
      9. Set PINB.0 ' Toggelt Ausgang
      10. Waitms 500
      11. Loop
      Alles anzeigen
      Jetzt kann ich meine anfangs gestellte Frage selber beantworten.

      Mitch64 schrieb:

      Das sollte doch auch mit den Pin als Input gehen (PullUp einschalten).

      Wenn ich also schreibe
      PIN_EINGANG Alias PinB.0
      Set PIN_EINGANG ' PullUp einschalten
      Ja es geht definitiv!

      Allerdings nicht mit jedem Controller. Das Feature ist Controllerabhängig. Daher Datenblatt ansehen.
      Und man darf logischerweise auch nicht 2x in das Pin-Register schreiben. Sonst wird der PullUp ja wieder ausgeschaltet.