Forum: Mikrocontroller und Digitale Elektronik PIC - Port B - Abfrage


von Mario Grimm (Gast)


Lesenswert?

Hallo,

leider hab ich schon wieder eine Anfängerfrage.

Der Port B ist von BIT 1 bis 6 auf Ausgang, BIT 7 und 8 als Eingang
geschaltet.

Um den Port B zu steurn benutze ich zum Bsp.:

MOVLW  B'00100000'    ; BIT 6 gesetzt
MOVWF  PORTB

Zur Abfrage:

MOVLW B'00100000'        ;TEST auf PIN6 an PORT B (WERT = 32)
XORWF PORTB,0
BTFSS STATUS,Z
GOTO MENU           ;  ungleich PIN6
.....

Das Problem scheint zu sein, es geht mal und mal nicht.
Was ist mit den BIT 7 und 8 ? Der Eingang am PIC ist offen, könnte also
auch 1 sein? Eine Falle für Anfänger?
Wie Kontrolliere ich nur die ersten BITs (1-6)?

Und noch so eine Frage:

Mit INCF 0x20,1 erhöhe ich den Wert der Speicherzelle um 1
Was passiert bei:
INCF 0x20,10 ? Den Wert der Zelle um 10 erhöhen ?
Ich habe festgestellt es wird mehr, aber nicht 10 !?

Probieren macht den Meister, mit Hilfe geht es etwas schneller ;o)
Danke schon mal!

von Steffen (Gast)


Lesenswert?

Die einzelnen Bits kannst Du z.B. mit btfss portb,7 testen. Ein offener
Eingang wird als High erkannt, kann aber auch spinnen. Also Eingänge
immer auf deffinierten Pegel (10k Pullup oder Pulldown) legen. An Port
B kanst Du auch die internen Pull-Ups aktivieren.

incf RegX,1 erhöht den Inhalt von RegX und speichert das Ergebnis in
RegX.
incf RegX,0 erhöht den Inhalt von RegX und speichert das Ergebnis in w.

--> siehe Doku, Befehlsübersicht

von Chief Brady (Gast)


Lesenswert?

Ist das Bank-Select auch immer richtig? Eine Abfrage auf PORTB ergibt in
der falschen Bank natürlich nicht das gedachte Ergebnis.

Und noch eine Bemerkung:

Die Bits eines Bytes werden von 0 bis 7 nummeriert, nicht von 1 bis 8.
Dabei ist Bit 0 das LSB und Bit 7 das MSB. Hält man sich nicht an diese
Vereinbarung, kommt es unweigerlich zu Missverständnissen.

von Mario Grimm (Gast)


Lesenswert?

Hallo,
Ich sehe, ich muß noch viel lernen....
BIT 0 bis 7, alles klar !
MIT BTFSS... BIT auf 1 und mit BTFSC ...auf 0 testen, auch kapiert.

Was aber, wenn ich am PORT B BIT 6 und 7 Als Eingang nutze,
wie vergleiche ich dann 0 - 5 ? also zum BSP. 'XX010101'

Die Doku hab ich mir schon ausgedruckt.
Bei INCF 0x20,10 wir aber 0x20 größer (nicht 10), im Chat sind wir dann
auf "increment" gestoßen ?1? "verwirrt bin"
Mit Bank Select hab ich mich noch gar nicht beschäftigt, ich hoffe das
brauch ich bei meinen einfachen Programmen noch nicht. ?!?
Mit den Pull-Ups das werd ich dann mal nachlesen, weis aber was Ihr
meint! ich hoffe mein PIC-Buch kommt heute.

Vielen Dank für die HILFE !!!!

von ----- (Gast)


Lesenswert?

Hab zwar mit den PICs nix am hut (will auch nicht) aber Increment heißt
erhöhen, aber nur um 1.
Wie ein Vorredner bereits erwähnte heißt

 INCF 0x20,0 erhöhe den Inhalt der Adresse 0x20 um 1 und schreibe
 das Ergebnis in W.
 Der Inhalt in Adresse 0x20 bleibt unverändert.

 INCF 0x20,1 erhöhe den Inhalt der Adresse 0x20 um 1 und schreibe
 das Ergebnis zurück in Adresse 0x20.

Entscheidend dabei ist die Zahl nach dem Komma ",0 ,1".
0 Bedeutet, Ergebnis kommt in das W-Register und 1 bedeutet, Ergebnis
kommt in die angegebene Adresse.

MfG
Andi

von Chief Brady (Gast)


Lesenswert?

Bank-Select musst du auf JEDEN FALL beachten. Du schreibst leider nicht,
welchen PIC du verwendest, aber in der Regel sind die PORT- und die
zugehörigen TRIS-Register in verschiedenen Bänken.

Beispiel:
 PORTA ist in Bank 0
 TRISA ist in Bank 1

Wenn du dann auf PORTA zugreifst, musst du vorher auf Bank 0 geschaltet
haben, Wenn du auf TRISA zugreifst (um die PINs als Ein- oder Ausgang zu
setzen) musst du vorher auf Bank 1 schalten.

von Mario Grimm (Gast)


Lesenswert?

Hallo,

Mit Bank-Selekt habt Ihr natürlich Recht, ich war mir nur noch nicht
über die Zeilen aus dem Demo bewust. (PIC16F628)
ich muß halt noch jeden Befehl nachschlagen :o(


Das mit dem INCF hab ich schon soweit verstanden.
Probiert doch aber mal INCF 0x20,10 was dann passiert.
Vielleicht ist das nicht Dokumentiert, aber die Speicherzelle wird
definitiv um mehr als 1 erhöht !!!?

Wie ich das aber die ersten 6 BIT von Port B prüfe hab ich selbst in
dem Buch was ich heute bekommen habe auch noch nicht rausfinden können,
das ist schon wieder mehr für Profis, und nicht für mich als Anfänger in
Sachen PIC und ASM.

von Chief Brady (Gast)


Lesenswert?

So kannst du PORTB auf 'xx010101' testen:

movf   PORTB,W      ; portb lesen
andlw  b'00111111'  ; bit 6 u 7 ausblenden
xorlw  b'00010101'  ; testen
btfsc  STATUS,Z     ; /
goto   ist          ; PORTB ist 'xx010101'
goto   ist_nicht    ; PORTB ist nicht 'xx010101'

Meintest du das?

von Mario Grimm (Gast)


Lesenswert?

Vielen Dank Chief !!!

Dann will ich gleich mal weiter machen :o)

von Thomas (Gast)


Lesenswert?

Zitat:

"So kannst du PORTB auf 'xx010101' testen:

movf   PORTB,W      ; portb lesen
andlw  b'00111111'  ; bit 6 u 7 ausblenden
xorlw  b'00010101'  ; testen
btfsc  STATUS,Z     ; /
goto   ist          ; PORTB ist 'xx010101'
goto   ist_nicht    ; PORTB ist nicht 'xx010101'

Meintest du das?"

ich hab das Problem mit einem 18f4685 und PortD

so sieht mein quelltext aus:

movf PORTD,0           ; get status
movwf PORTB
movwf r25

PortD ist input, PortB ist output
doch leider sind alle Ausgänge von B 0 und r25 hat den Wert 0x00

was könnte falsch sein? muss ich da was konfigurieren vorher?

von Severino R. (severino)


Lesenswert?

@ Thomas

Die PIC18 haben neben dem PORTx-Register auch ein LATx.
Das PORTx-Register liest, was am Eingang anliegt.
Das Output-Latch ist via LATx les- und schreibbar.

Du müsstest folglich "movwf LATB" schreiben.

Das erklärt aber nicht, warum r25 auch 0 ist.
Was liegt denn an PORTD an? ev. auch lauter Nullen?

Severino

von dennis (Gast)


Lesenswert?

@Thomas:

..ist portd denn als eingang definiert!?

@Mario
du kannst dir auch mit einem "define" ein wenig die arbeit erleichtern, 
und deinen code etwas übersichtlicher machen:

Variable_1     equ     h'20'


informiere dich mal über macros für die bankselect sache, das macht den 
code ebenfalls übersichtlicher.

f steht immer als platzhalter für ein register
w steht immer für das arbeitsregister

mit den befehlen bsf "b-bit s- set f-flag" und bcf "bit clear flag" 
aknnst du auch einzelne bits geziehlt setzten/rücksetzen.

       bsf      Variable_1,0      ;setzt bit null

btfss "b-bit t-test f-flag s-skip if c-clear" so sollte man sich diese 
abkürzungen besser merken können.

d.




Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.