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......
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
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.........
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
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..........
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.