Forum: Mikrocontroller und Digitale Elektronik pic programmierung


von Tom (Gast)


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...

von John (Gast)


Lesenswert?

Bankumschaltung?

(welcher PIC?)

von Tom (Gast)


Lesenswert?

pic16f876

von Tom (Gast)


Lesenswert?

Hm, habe jetzt auf Bank 0 geschaltet, hm, auf welcher Adresse speichere 
ich am besten die Variablen?

von John (Gast)


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

von pic u. (pic_user)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

danke werd ich jetzt testen...

von Tom (Gast)


Lesenswert?

und funzt....

von Tom (Gast)


Lesenswert?

hm, noch ne frage, wie kann ich im "Watch" Fenster Variablen, z.B. 
testmin2 anzeigen?

von Joachim (Gast)


Lesenswert?

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.

von Tom (Gast)


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)!???

von John (Gast)


Angehängte Dateien:

Lesenswert?

Ist "Add Symbol" grau oder das PopUpMenue?

Deine Variablen sollten sich nach dem Compilieren im rechten PopUpMenue 
befinden. -> Auswählen und "Add Symbol" klicken.

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

So siehts bei mir aus!

von forget (Gast)


Lesenswert?

Ich habe das mal in MPLAB eingegeben, bei mir zählt PORTB 
folgendermassen:

0x00
0x00
0x02
0x02
0x04
0x04
0x06

etc ....

von John (Gast)


Lesenswert?

@Tom
Wie sieht die Deklaration deiner Variablen aus? Sind Leerzeichen oder 
TABs vor den Namen, oder beginnen die Namen ganz link?

von Tom (Gast)


Lesenswert?

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. ...??

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

...

von John (Gast)


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.

von Tom (Gast)


Lesenswert?

funktioniert auch nicht...

von K. J. (Gast)


Lesenswert?

Hi um einfach mal ein Problem zu beseitigen Grade am Anfang zu entfernen 
setze die Var ab 0x70 dann sind sie in beiden BANKEN vorhanden.

von pic u. (pic_user)


Lesenswert?

dein code:
    movlw 0xA            ;10 in Wreg
    andwf min2,0         ;min2=10?
    movwf testmin2       ;control bit
    btfss testmin2,0     ;skip if min2=10

richtiger code:
    xorlw 0xA            ;10 in Wreg
    skpz

von Tom (Gast)


Lesenswert?

das mit dem "watch" window funzt jetzt, variablen einfach mit RES 1 
deklarieren...
google ist ein wunder...

von Tom (Gast)


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

von John (Gast)


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

von John (Gast)


Lesenswert?

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!

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.