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.