PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Error [1253] constant operand expected



BioSniper
13.06.2010, 17:12
PIC18F14K50 mit C18.

Zeitkritische PIN-Abfrage. Muss natürlich auf richtiger PCL-Adresse stehen, deshalb die NOP's:




_asm
NOP
NOP
Btfss pinTMR13mess //Warten bis Mess-PIN = 1.
Bcf PCL, 1, 0 //<- FEHLER hier !!! PCL - 2: Nur 1 Taktzyklus.
_endasm


Fehler: Error [1253] constant operand expected.

Warum?

So geht es auch nicht:



_asm
NOP
NOP
Btfss pinTMR13mess //Warten bis Mess-PIN = 1.
Bcf 0xFF9, 1, 0 //<- FEHLER hier !!! PCL - 2: Nur 1 Taktzyklus.
_endasm



Ja, Sorry, habs rausgefunden, so ist es richtig:



_asm
NOP
NOP
Btfss PORTC, 6, 0 //Warten bis Mess-PIN = 1.
Bcf PCL, 1, 0 //PCL - 2: Nur 1 Taktzyklus.
_endasm


Bin mir gerade nicht sicher, ob das so überhaupt geht, da das 3 Words sind. Notfalls mache ich es so:



_asm
MovLW PCL-Adresse
Btfss PORTC, 6, 0 //Warten bis Mess-PIN-TMR13 = 1.
MovWF PCL, 0 //$-1
_endasm

BioSniper
13.06.2010, 18:06
Hallo,

die Idee von Dir finde ich gut. Aber so geht das nicht. Wenn, dann must Du
BCF PCL,2 schreiben, denn ich denke mal der PIC soll nicht auf der Stelle springen sondern wieder zur Bitabfrage nach oben.
Ich denke mal, Du wirst angemeckert, weil Du ein Ziel (Destination) angegeben hast, die Zahl hinter dem zweiten Komma, das geht beim BCF Befehl aber nicht. Zudem sparst Du nichts bei dieser Arie.
goto Label benötigt 2 Takzyklen und BCF zeigt bei mir in der Simulation auch 2 Zyklen an. Hier bin ich mir jedoch nicht sicher, ob das wirklich stimmt, da ja ein BCF normalerweise nur einen Zyklus benötigt. In der MPLAB Ide werden jedoch 2 Zyklen angezeigt. Könnte natürlich sein, das hierbei der IDE-Simulator mir einen Streich spielt. Weil so ganz glauben tue ich das auch nicht, was ich grad simuliert habe.

Also mach mal aus
Bcf PCL, 1, 0
nur:
Bcf PCL, 2

ich denke dann ist dein Problem gelöst.
mfg. Siro


Ja, danke für die Antwort.

Ich habe das jetzt eher so vor:



_asm
MovLW PCL-Adresse
Btfss PORTC, 6, 0 //Warten bis Mess-PIN-TMR13 = 1.
MovWF PCL, 0 //$-1
_endasm


Das dürfte besser sein, man muss nur noch die richtige PCL-Adresse laden und aufpassen das man nicht am Umbruch zu einer neuen ROM-Page steht.

Siro
13.06.2010, 18:06
in meiner Simulation läuft es so :

btfss PORTC,6
bcf PCL,2

ja, Du hast recht, aufpassen, daß hier kein Page Übergang auftritt.
Magst Du keinen goto Befehl ?

weil so geht es doch auch und braucht im Simulator die gleiche Zeit.

btfss PORTC,6
goto $-2


mfg. Siro

BioSniper
13.06.2010, 18:42
Braucht die gleiche Zeit? Das kann ja nicht sein. Du springst mit Deinem Befehl ja auch weiter zurück als notwendig (oder?), da Du 4 Dinger vom PCL abziehst, statt 3.

Probier mal diese Methode und mache eine Punktlandung, dann geht das sicher 1 Takt schneller:

_asm
MovLW PCL-Adresse
Btfss PORTC, 6, 0 //Warten bis Mess-PIN-TMR13 = 1.
MovWF PCL, 0 //$-1
_endasm

Ne, den Goto-Befehl mag ich nicht weil der 2 Takte benötigt. Ich will den Duty-Cycle von einem 600 kHz Signal ausmessen, da mag ich das dann nicht.

Zuerst habe ich die ON- und OFF-Time separat ausgemessen. Jetzt mache ich das besser. Ich messe nur die ON-Time und Teile durch die Periodendauer. Die Frequenz kann ich nämlich sehr genau bestimmen. Zumindestens viel genauer als ich einen Impuls ausmessen kann.