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!
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
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.
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 !!!!
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
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.
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.
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?
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?
@ 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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.