PIC: Falsche Bank ausgewählt - Anfängerproblem

Gast #1281123
Hallo, ich versuche gerade den Einstieg in die PIC Programmierung mit 
Assembler und habe mir das PICKit 2 mit Testplatine gekauft. Nun wollte 
ich mein erstes Program ausprobieren und erhalte einen Fehler, für den 
ich keinen Grund finden kann. Ich möchte eine Leuchtdiode am Pin RC1 zum 
Leuchten bringen.

--
1
  LIST P=16F690
2
  __config 0x3B04
3
w   EQU 0
4
f   EQU 1
5
STATUS  EQU 0x003
6
RP0  EQU 5
7
PORTC  EQU 0x007
8
TRISC  EQU 0x087
9
;
10
  ORG 0
11
  goto start
12
start  bsf STATUS, RP0    ; Bank 1 auswählen
13
  movlw 0xFD    ; Kopiere b11111101 nach W (0 = Ausgang)
14
  movwf TRISC    ; Kopiere Inhalt von W nach TRISC <- Hier enteht der Fehler
15
  bcf STATUS, RP0    ; Setze Bit 0 in RP0 um Bank 0 auszuwählen
16
;
17
  bsf PORTC, 1    ; Setze Bit 1 in PORT C auf 1
18
  END
--

Wenn ich das Programm nun in HexCode umwandeln lassen will, erhalte ich 
für die Zeile mit dem Befehl "movwf TRISC" die

Message[302]: Register in operand not in bank 0.  Ensure that bank bits 
are correct.

Ich habe doch aber zwei Zeilen zuvor die Bank 1 ausgewählt, da TRISC ja 
in Bank 1 liegt und dürfte doch gar nicht in Bank 0 sein. Könnte mir 
bitte jemand erklären, was ich falsch gemacht habe?

Vielen Dank
Sven
>Könnte mir bitte jemand erklären, was ich falsch gemacht habe?

Gar nix. Das ist nur eine Warnung, kein Fehler. Wenn du alle 
Bankselektionen geprüft hast, kannst du die Meldung per
1
errorlevel -302

unterbinden.

Grüße,
Edson
RAM-Banking und Code-Paging ist aber ne Spezialität der PICs, um den 
Programmierern das Leben schwer zu machen.

Benutzer anderer MCs kennen ne Bank nur zum Sitzen oder Geld abheben. 
Sie sind es gewohnt, mindestens 64kB Code oder Daten am Stück 
adressieren zu können. Macht einfach mehr Spaß und man kann sich aufs 
eigentliche Programmieren konzentrieren.
Das erklärt wohl auch, warum die AVRs so schnell Fuß gefaßt haben, 
obwohl sie ja wesentlich jünger (1997) als die PICs sind.


Peter
Persönliche Seite
Ist bei den 16F wirklich recht umständlich gelöst und ist immer wieder 
die Quelle von Fehlern im Programm und stundenlanger Suche danach.

Bei den 18F ist das um einiges besser gelöst, wobei man auch dort nicht 
völlig frei vom Banking ist. Allerdings sind dort die RAM-Bänke 256 
Bytes groß und alle Specialregister liegen zusammen mit 128-Byte 
User-RAM im ACCESS-RAM, sodass man nicht umschalten muss, solange man 
mit diesen 128 Bytes auskommt. Codepaging gibt es bei den 18F aber nicht 
mehr. Ist schon mal ein Fortschritt.

Du solltest aber deinem Programm eine Hauptroutine gönnen (in deinem 
Fall eine Endlosschleife vor dem END), da dein PIC sonst mit dem Befehl 
weiter macht, der im Flash nach deinem letzten Befehl steht. 
Wahrscheinlich wird dein PIC ständig reseten, was du natürlich nicht 
siehst, da es viel zu schnell geht.
Gast
Hi warum wird eigentlich noch "bsf STATUS, RP0" genutzt des geht doch 
wesentlich einfacher mit "banksel <Reg.>".

Jedenfals brauch man sich keine sorgen mehr machen ob man in der 
richtigen Bank ist

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.