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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.