PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC syntax - help needed!



iClou
18.05.2005, 18:08
Hallo

Ich habe vor 3 Tagen PICs kennengelernt, habe mir das Board K8048 besorgt und schon einige kleine Programme geschrieben (hatte vor 15 Jahren mal ein wenig Assembler gelernt). Diese konnte ich auch erfolgreich 'brennen' und laufen lassen.

Zu meiner komischen Frage - was bedeutet die folgende Syntax, insbesondere das Zeichen '^':

bcf TRISB ^ 0x080, 1 ; Enable RB1 for Output

Kann ich das auch anders schreiben?

Ich benutze die gputils mit gpsim und PikDev, PIC ist 16F627

--
Danke für jegliche Hilfe!
Sami

PicNick
18.05.2005, 19:06
Ich kann nur raten, Standard ist das nicht.
TRISB ist in der Bank1 . vielleicht ist der Assembler ein ganz Gescheiter
und denkt sich da was dabei. Keine Doku da ?

EinsamerUser
18.05.2005, 19:46
Also die richtige Syntax dafür ist eigentlich:


bcf TRISB,1

wobei TRISB durch ein beliebiges Register ausgetauscht werden kann (z.B. PORTB, PORTA, TRISA,...) und die "0" gibt das Bit an, welches Gesetzt werden soll.



bcf TRISB ^ 0x080, 1 ; Enable RB1 for Output

Das hab ich noch nie gesehen, noch nichtmal bei Beispiel-Codes von Microchip!! *g*
Allerdings würde es mich mal interresieren ob das bei dir funktioniert.

Ach nochwas der Befehl alleine "Enabled" nicht RB1 als Ausgang, wenn du nicht vorher die richtige Bank für TRISB ausgewählt hast.... ;-)

Gruß
Stefan

iClou
18.05.2005, 20:28
Der code läuft, macht was ich will. Hier ist das gesamt code segement:


bsf STATUS, RP0 ; switch to bank1
bcf TRISB ^ 0x80, 0 ; set on port B pin 0 as output
bcf STATUS, RP0 ; switch back to bank0
movlw b'00000001' ;set bit 0 high in work reg
movwf PORTB ; move work reg to PORTB

Wie kann ich das denn noch schreiben, d.h. ohne das Zeichen '^'

--
Vielen Dank für die Hilfe.
Gruss
Sami

iClou
18.05.2005, 20:32
Wenn ich es folgendermassen schreibe dann bekomme ich eine Fehlermeldung:

bsf STATUS, RP0
bcf TRISB,1
bcf STATUS, RP0
movlw b'00000000'
movwf PORTB

Fehlermeldung ist:
template.asm:93:Message [302] Register in operand not in bank 0. Ensure bank bits are correct.

--
Danke für jegliche Hilfe.
Sami

Max W.
18.05.2005, 20:42
Muss das nicht heißen:

bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 schalten

Hab ich von sprut.de :-)

EinsamerUser
18.05.2005, 20:44
jepp, ist keine Fehlermeldung, sondern nur eine Warnung. Funktionieren tut es normalerweise schon.

Ich glaub wenn du folgendes in den Quellcode eingibst müsste die Meldung unterdrückt werden.


ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES

keine Ahnung warum der Assembler die Meldung immerwieder ausspuckt, obwohl es eigentlich stimmt. Macht er bei mir auch.
Naja...

Viel Spaß beim noch beim rumspielen! ;-)

Gruß
Stefan

EinsamerUser
18.05.2005, 20:47
ach nochwas.....das von Sprut stimmt eigentlich fast immer...*ggg*


bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 schalten


Das ist eigentlich Ok, eine bessere und "schnellere" möglichkeit wäre noch diese:



bsf STATUS, RP0 ; auf Bank 1 umschalten
clrf TRISB
bcf STATUS, RP0 ; auf Bank 0 schalten

iClou
18.05.2005, 21:42
Korrket, es ist eine Warnung, alles läuft normal und wenn ich

ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES

eingebe, dann erscheint auch die warning message nicht mehr.

Es ist einfach nicht schön, wenn eine warning kommt und diese nicht stimmt od einfach ignoriert werden kann.
Mhh wenn man das mit dem ^ Zeichen macht, dann kommt eben keine warning...evt ist das der Sinn!

Uebrigens es muss TRISB,0 heissen.

--
Vielen Dank für die rasche Aufklärung der Situation - echt super!!
Sami

EinsamerUser
18.05.2005, 21:59
TRISB,0 --> RB0 output
TRISB,1 --> RB1 output
TRISB,2 --> RB2 output
....
TRISB,7 --> RB7 output


Ich weis auch nicht warum die meldung kommt und warum Microchip noch nicht dafür gesorgt hat, dass die Meldung nicht mehr kommt.

Schau dir mal das Disassembling an. Ob da vielleicht etwas anders bei dem ^ als bei nur dem TRISB.....wäre vielleicht zur aufklärung interresant. *g*

Gruß
Stefan

BlackBox
19.05.2005, 07:42
Ich würde mal sagen, dass das ^ für die logische Verknüpfung XOR steht (siehe MPASM Hilfe), negiert (löscht in diesem Fall) also Bit 7. Der Autor des Quellcodes unterdrückt damit die Warnung des Assemblers.

EinsamerUser
19.05.2005, 16:26
Also unterdrücken würde ich nicht sagen.

Also ich hab mich gerade mal ein bissle durch ein Datenblätt gefuchst! *g*

Also, meine interpretation wäre, dass die im Assembler hinterlegten Adressen für PORTB und TRISB die identischen sind. Beide Register werden also beim assemblieren durch die Adresse 06h ersetzt.
Der Assembler weis aber, dass TRISB eigentlich an der Adresse 86h liegt und meldet also eine Warnung.
Das würde eigentlich heissen, wenn ich TRISB ^ 0x80 verknüpfe müsste folgendes zustande kommen:

TRISB = 0x06 --> 0x06 ^ 0x80 = 0x86 --> somit stimmt die Adresse für den Assembler, deswegen keine Warnung.

Allerdings müsste es dann reintheoretisch auch möglich sein das ganze anstatt so -->

bsf STATUS, RP0 ; switch to bank1
bcf TRISB ^ 0x80, 0 ; set on port B pin 0 as output
bcf STATUS, RP0 ; switch back to bank0

nur noch so

bcf TRISB ^ 0x80,0

zu schreiben, da die verwendet Physikalische Adresse 0x86h ja schon auf der Bank 1 liegt, muss denke ich nicht extra auf diese Umgeschaltet werden.
Dies Wäre auch logisch, da dadurch ja wieder 2 Befehle wegfallen würden und auch somit wieder Zeit sparen, was bei Zeitkritischen-Anwendungen ein vorteil wäre. Allerding würde das nur bei Adressen bis 0xFFh funktionieren.

Allerdings würde ich wetten, das dies nicht der Fall ist und du trotzdem manuell auf Bank1 umschalten musst, denn sonst wäre Bank 1 ja doch uninteressant. Hat, denke ich, was mit der 8Bit-Struktur der PICs zu tun.

Probiers mal aus ohne umschalten auf Bank1, wenns dann nicht stimmt, dann lass das mit TRISB ^ 0x08 weg, da es doch ein bisschen zu unübersichtlichkeit des Quellcodes beiträgt.

Gruß
Stefan

BlackBox
19.05.2005, 16:49
Schau mal in die *.inc. TRISB ist 0x86.
Um darauf zuzugreifen musst Du natürlich das Bank-Select Bit setzen.

0x86^0x80=0x06 0x06 liegt in Bank0, also keine Fehlermeldung!

EinsamerUser
19.05.2005, 18:55
War nur ne vermutung...hatte nicht in die Include-Datei geschaut.

Also letztendlich gibt es wohl keine Plausible erklärung, warum die Warnung immer wieder kommt.

naja....

Gruß
Stefan

Frank Drebin
20.05.2005, 16:17
Diese Meldung (über die sich immer wieder aufgeregt wird) ist nur ein Hinweis darauf, dass das verwendete Register nicht in Bank0 ist und der Programmierer darauf achten soll, dass die richtige Bank gesetzt ist.

Dieses Bank-Thema führt bei PIC-Einsteigern oft zu nächtelanger Fehlersuche. Daher die (vollig korrekte) Meldung (als Erinnerung). Sobald man einige Erfahrung hat und weiss was man tut, kann man diese Warnung getost mit o. g. Anweisung unterdrücken.

EinsamerUser
20.05.2005, 17:14
jepp....kann ich nur bestätigen :-)