Autor Thema: Was ist der Vorteil von LATB anstatt PORTB?  (Gelesen 14498 mal)

Offline RoProe

  • Jr. Member
  • **
  • Beiträge: 85
    • Profil anzeigen
Was ist der Vorteil von LATB anstatt PORTB?
« am: April 07, 2005, 15:44:19 Nachmittag »
Hallo,

ich bin vor kurzen von PIC16F auf PIC18F umgestiegen und jetzt sehe ich da so ein LATB Register. Welchen Vorteil hat das??

Ich habe am PortB 4 Inputs die einen Interrup-on-Change auslösen sollen. Ich frage einfach imemr nur PORTB ab. Wenn der Interrupt gekommen ist. Habe ich da was falsch verstanden??

Robert

Offline Bernd

  • Hero Member
  • *****
  • Beiträge: 3820
    • Profil anzeigen
Was ist der Vorteil von LATB anstatt PORTB?
« Antwort #1 am: April 07, 2005, 17:09:59 Nachmittag »
Hallo Robert,

wenn Du  Portpins als Eingang benutzt, mußt Du die PORTx-Register zum Auslesen des Zustands an dem Portpin verwenden. Die LATx-Register sind nur für die Ausgabe von Werten an die Portpins geeignet. Ihr großer Vorteil ist die Vermeidung des "read-modify-write" Problems bei Portpins.

;Angenommen PORTB = 0, TRISB = 0
  bsf PORTB, 0   ; RB0 auf 1
  bsf PORTB, 1   ; RB1 auf 1
Nach der Abarbeitung des obigen Codes ist das Ergebnis etweder RB0 = 1 und RB1 = 1 (korrekt) oder aber RB0=0 und RB1=1. Welches der beiden Ergebnisse zutreffend ist, hängt von äußeren Faktoren ab (Taktfrequenz des PICs, (kapazitive) Belastung der Ausgänge).

Der eventuell falsche Wert von RB0 entsteht dabei folgendermaßen:

Bei dem bsf-Befehl wird grundsätzlich das komplette Register PORTx eingelesen (also die momentan an den Pins anstehenden Werte), ein Bit des eingelesenen Wertes modifiziert und dieser modifizierte Wert zurückgeschrieben. Wenn der Ausgangspin stark belastet ist, kann es passieren, daß beim zweiten bsf-Befehl an dem Pin RB0 noch eine "0" erkannt wird, und dieser falsche Wert dann zurückgeschrieben wird.

Dies ist bei der Verwendung der LAT-Register ausgeschlossen, da zwar auch hier eine read-modify-write Operation stattfindet, aber der an PORTx anliegende Pegel keine Rolle spielt. Es wird der Sollzustand des Ausgangs-Latch-Register gelesen, nicht der aktuelle Zustand am Portpin. Dieser Thread könnte auch hilfreich sein.


Viele Grüße

Bernd

Edit: Link korrigiert
« Letzte Änderung: September 27, 2006, 17:37:03 Nachmittag von Bernd »

Andre

  • Gast
Was ist der Vorteil von LATB anstatt PORTB?
« Antwort #2 am: Mai 14, 2005, 11:26:34 Vormittag »
Hallo,

da kann man ja böse reinfallen(16 Typen).
Wenn ich z.B. an RBO einen Widerstand mit LED hänge, und diesen Pin dann setzte, und an RB1 z.B, einen Mosfet habe, diesen im nächsten Schritt setze...

also konkret:

PORTB=0, TRISB=0
bsf    PORTB,0    ; Led
bsf    PORTB,1   ; Mosfet

 wenn Zeit im Programmablauf dann keine Rolle spielt, kann man dann einige NOP 's einfügen um das Problem zu umgehen, oder?

Gruß
andre

Offline Bernd

  • Hero Member
  • *****
  • Beiträge: 3820
    • Profil anzeigen
Was ist der Vorteil von LATB anstatt PORTB?
« Antwort #3 am: Mai 14, 2005, 12:31:42 Nachmittag »
Zitat
wenn Zeit im Programmablauf dann keine Rolle spielt, kann man dann einige NOP 's einfügen um das Problem zu umgehen, oder?

Das ist eine Möglichkeit. Eine andere Möglichkeit besteht darin, für den Port eine "Shadow"-Variable zu verwenden und den Port nur komplett zu beschreiben (kostet aber natürlich auch zusätzliche Zeit).

cblock ...
  portb_shadow
endc

...

bsf    portb_shadow, 0
bsf    portb_shadow, 1
movf   portb_shadow, W
movwf  PORTB            ; kein read-modify-write Problem

 

Viele Grüße

Bernd

 


* Recent Topics