pic programmierung

Gast #2145326
Lesenswert?

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...
Gast #2145388
Lesenswert?

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
Gast #2145445
Lesenswert?

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)!???
Gast #2145533
Lesenswert?

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.
Gast #2147139
Lesenswert?

Hab das Problem jetzt so gelöst...

clrf    PORTB      ;clear PORTB
  BANKSEL TRISB    ;auf Bank1 umschalten
  clrf    TRISB    ;configure PORTB as all outputs
  BANKSEL PORTB    ;auf Bank0 umschalten




    clrf testmin_2
  loop1
    clrf min_2
  loop2

    incf min_2,F    ;increment min2
    movf min_2,W          ;min2 ins Wreg
     movwf PORTB    ;Wreg ins PORTB
    movlw 0x9             ;10 in Wreg
    subwf min_2,w    ;min2=10?
      movwf testmin_2          ;control bit
    decfsz testmin_2,0  ;skip if min2=10
    goto loop2
    goto loop1
Gast #2147409
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren