Hallo, habe diese Zeilen in mplab geschrieben
clrf PORTB ;
clear PORTB
clrf TRISB ; configure PORTB as all outputs
clrf testmin2
loop1
clrf min2
loop2
incf min2,F ;increment min2
movf min2,W ;min2 ins Wreg
movwf PORTB ;Wreg ins PORTB
movlw 0xA ;10 in Wreg
andwf min2,0 ;min2=10?
movwf testmin2 ;control bit
btfss testmin2,0 ;skip if min2=10
goto loop2
goto loop1
Port B soll von 0-10 zählen, bei 10 wieder auf Null gehen!
Beim debuggen wird allerdings nur das Workregister inkrementiert, nicht
aber das PortB! Warum?
Danke im voraus...
Beim PIC16F876 liegt PORTB auf Speicherbank 0 und TRISB auf Speicherbank
1. Du musst vor dem Zugriff auf die Register auf die entsprechende
Speicherbank umschalten.
;nach Reset ist Bank 0 aktiv
clrf PORTB ;clear PORTB
BANKSEL TRISB ;auf Bank1 umschalten
clrf TRISB ;configure PORTB as all outputs
BANKSEL PORTB ;auf Bank0 umschalten
Beim Compilieren ersetzt MPLAB den Befehl
BANKSEL [Register]
mit den entsprechenden Bit-Set und Bit-Clear Befehlen, die die Bits RP0
und RP1 im Statusregister auf die Bank einstellen, auf der sich
[Register] befindet.
In Bank 0 stehen dir (beim PIC16F876) ab Adresse 20Hex 96 Bytes zur
Verfügung. Weitere in Bank 2-3 -> Siehe Datenblatt.
Gruß
John
Was ist der pseudobefehl clear, ? ab welcher version sollte es den
geben.
Ansonsten sollte es so sein, damit die pins outputs werden:
clrf STATUS
clrf PORTB ;
;clear PORTB
bsf STATUS,RP0
clrf TRISB ; configure PORTB as all outputs
bcf STATUS,RP0
Ich sehe das Zeitmodell des Programmierens für mich etwa so:
ca 1/3 programmieren
ca 1/3 Fehler suchen + lernen
ca 1/3 Doku lesen
Mit Letzterem beginnen.
1.)das clear sollte eigentlich hinter dem ; stehen!!!
2.)Hab die Doku gelesen(durchgeflogen), dort können Variablen mit Add
Symbol im Watch Window hinzugefügt werden, allerdings kann ich das bei
mir nicht machen(grau markiert)!???
Ist "Add Symbol" grau oder das PopUpMenue?
Deine Variablen sollten sich nach dem Compilieren im rechten PopUpMenue
befinden. -> Auswählen und "Add Symbol" klicken.
hhhh? wie denn das? bei mir zählt es richtig! Allerdings geht er nicht
von 10 auf 0! Um dieses Problem zu beheben bräuchte ich die Variablen im
Watchwindow. ...??
Versuch es man mit ein paar Leerzeichen von den Variablennamen, sonst
denkt der Compiler es sind Labels.
Hab ich gerade mit Google gefunden. Ich weiß nicht ob es daran liegt.
Probier es einfach mal aus.
Hallo Tom,
Du machst das etwas umständlich: vom Zählerstand 9 abziehen, Ergebnis
speichern, dann 1 abziehen. Und wenn das Ergebnis dann null ist war der
Zähler auf 10.
movlw 0x9 ;9 in Wreg
subwf min_2,w ;min2=10?
movwf testmin_2 ;control bit
decfsz testmin_2,0 ;skip if min2=10
Einfacher: 10-Zählerstand.
Das ist praktisch identisch mit dem was pic_user vorgeschlagen hat.
sublw 0x0A ; 10 - Wreg (min_2) -> Wreg
btfss STATUS,Z ; Zero-bit=1 wenn Ergebnis=0
Gruß
John
Korrektur, es muss
sublw 0x0B ; 11 - Wreg (min_2) -> Wreg
heißen, sonst ist die Ausgabe auf Port B nur 0..9.
Tom schrieb:> Port B soll von 0-10 zählen, bei 10 wieder auf Null gehen!