Forum: PC-Programmierung PIC 16F84A Problem mit Speicherbank


von Tobias Möhring (Gast)


Lesenswert?

Ich benutze einen PIC 16F84A mit dem ELV Emulator Programmer und der
Testplatiene, auf der man 8 LEDs zum Leuchten bringen kann, indem man
das jeweils zugehörige Bit von PORTB auf 0 setzt.

Wenn ich im MPLAB auf makeproject klicke läuft der Compiler zwar durch,
aber ich bekomme eine Meldung, die ich nicht verstehe:
Register in operand is not in bank 0. Ensure that bank bits are
correct.

Das scheint sich auf Zeile 10 meines Programms zu beziehen (ich gehe
mal davon aus, das die Zahl, die ich mitgeliefert bekomme die
Zeilennummer ist, da sie sich ändert, wenn ich eine Leerzeile einfüge).
Ich bin aber nun der Meinung, das ich alles richtig gemacht habe, weil
in der Anleitung die ich habe steht drin, das das betreffende Register
(TRISB) in Bank 1 liegt und ich hab doch richtig umgeschaltet, denk ich
zumindest.

Leider muß ich den Quellcode hier in den Post packen, da ich ihn nicht
von dem Rechner runterbekomme, auf dem ich Pragrammiere und ihn somit
auch abtippe.



          LIST     p=16F84A

#include <p16F84A.inc>

          org      00h
          bsf      03h,5   ;Statusregister Bit 5 setzen (Bank 1)
          clrw
          movwf    TRISB    ;Port B als Ausgänge (das ist Zeile 10)
          bcf      03h,5   ;zurück zu Bank 0
          movlw    0fh
          movwf    PORTB

          END


Wenn ich mich nicht irre sollten am Ende dieses Programms 4 Bits von
PORTB auf 0 sein, aber nur 3 Lampen sind an, also nur 3 Bits auf 0.

Und das mit dem Fehler bei der Speicherbank versteh ich echt
nicht........

Schonmal vielen Dank für eure Hilfe......

von Thorsten (Gast)


Lesenswert?

Es ist ja auch nur eine Warnung, ich behaupte du kannst die getrost
ignorieren. Es ist nur ein netter Zug des Compilers, dich auf ein evtl.
Problem aufmerksam zu machen. Habs gerade mal durch den Siumlator
gejagt, scheint doch zu funktionieren. Übrigens, daß Programm ist
wesentlich besser lesbar, wenn du auch die Registernamen benutzt:

org    00h
bcf    STATUS,RP0
clrf   PORTB
bsf    STATUS,RP0   ;Statusregister Bit 5 setzen (Bank 1)
clrw
movwf  TRISB        ;Port B als Ausgänge (das ist Zeile 10)
bcf    STATUS,RP0   ;zurück zu Bank 0
movlw  0fh
movwf  PORTB

END

Thorsten

von Tobias Möhring (Gast)


Lesenswert?

Danke für die schnelle Antwort!

Aber leider funktioniert das Prog nicht so wie es soll. ich dachte ja
erst die eine LED wäre defekt, aber daran kann es nicht liegen. ich
habe gerade noch ein anderes Prog auf dem PIC laufen lassen (das
andere, was ich hier reingeschrieben habe) und dann wieder das oben.
aber jetzt haben die gleichen LEDs geleuchtet, wie nach dem durchlauf
desanderen Progs, also scheint auch der Zugriff auf PORTB nicht zu
funktionieren.........

von Andreas Jäger (Gast)


Lesenswert?

1. falscher Forumzweig -> µC+Elektronik wäre besser

2. Dein Prog startet bei 00h. Das geht so nicht, denn bei 04h ist der
Peripheral Interrupt Vector.

So geht's:

       org  00h
       goto Start          ; nach Reset: Prog starten

Start: org  10h
       bcf    STATUS,RP0
       clrf   PORTB
       bsf    STATUS,RP0   ;Statusregister Bit 5 setzen (Bank 1)
       clrw
       movwf  TRISB        ;Port B als Ausgänge (das ist Zeile 10)
       bcf    STATUS,RP0   ;zurück zu Bank 0
       movlw  0fh
       movwf  PORTB

Loop:  goto   loop         ; Endloosschleife

END

von Tobias Möhring (Gast)


Lesenswert?

Sehe ich das richtig, das Sprungmarken also mit : enden müßen?

Dann würde das auch erklären, warum die Warteschleifen bei meinen
anderen Progs nicht richtig funktionieren........

Aber das hab ich noch nirgends gesehen..........

von Andreas Jäger (Gast)


Lesenswert?

Nein, Label müssen nur in der ersten Spalte beginnen. Der ":" ist
optional. Ich selbst verwende den den ":" bei Sprungmarken, die am
Anfang eine Subroutine stehen. Innerhalb der Sub lasse ich den ":"
weg. Ist aber 'ne persönliche Sache.

Die Syntaxbeschreibung findest Du im MPASM-Manual.

Andreas

von Thomas Winkler (Gast)


Lesenswert?

Hallo Tobias,
könnte es sein, daß Du keine Vorwiderstände bzw. zu kleine
Widerstandswerte verwendest? Versuch´s mal mit 330 Ohm Vorwiderständen.
Wenn ein zu großer Gesamtstrom (Summe aller LED-Ströme) aus den Latches
fließt, dann kann es zu einem solchen Verhalten kommen.
Grüße Thomas

von Thomas Winkler (Gast)


Lesenswert?

Noch was:
Dein Programm kann durchaus bei ORG 0 beginnen, und den Interruptvektor
überlaufen, vorausgesetzt Du verwendest keinen Interrupt.
Verwendest Du einen Interrupt, so ist das Programm von Andreas Jäger
auch noch nicht korrekt, da beim Auslösen des Interrupt zwischen
Adresse 0x04 bis 0x10 NOP`s eingetragen sind. Beim Auslösen des
Interrupt springt Dein Programm an Adresse 0x04, durchläuft die
Adressen 0x05 bis 0x10 ohne etwas zu bewegen und beginnt dann bei 0x10
mit bcf STATUS,RP0.
Einzufügen wäre:

So geht's:

       org  00h
       goto Start          ; nach Reset: Prog starten

       org  04h
       goto Interruptserviceroutine


Start: org  10h
       bcf    STATUS,RP0
       clrf   PORTB
       bsf    STATUS,RP0   ;Statusregister Bit 5 setzen (Bank 1)
       clrw
       movwf  TRISB        ;Port B als Ausgänge (das ist Zeile 10)
       bcf    STATUS,RP0   ;zurück zu Bank 0
       movlw  0fh
       movwf  PORTB

Loop:  goto   loop         ; Endloosschleife

Interruptserviceroutine:
              ; hier steht die IRQ Subroutine
       retfie


END

Grüße Thomas

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.