C18 c_var in inline assembler benutzen

Gast #528605
Lesenswert?

Ohne jetzt viel Plan zu haben, ist es doch so, dass der PIC18 ein 8-Bit 
Controller ist. Dein "DECFSZ ShiftCnt, 1, ACCESS" decrementiert hier 
aber eine 16-Bit Variable => kann nicht gehen.

> Das funzt aber nicht.

Das ist natürlich sehr präzise...
OP #528624
Lesenswert?

achso... ja symbol a war schon wieder mein nächster versuch =) probiere 
es mal so wie du es angegeben hast...

.
.
.
ne, gleiche Fehlermeldung...

aber evtl. kannst du damit was anfangen?

Given the following written in C:
unsigned int c_variable;
void main (void)
{
...
}
to modify the variable c_variable from assembly, an external declaration 
must be
added for the variable in the assembly source file:
EXTERN c_variable ; defined in C module
MYCODE CODE
asm_function
MOVLW 0xff
; put 0xffff in the C declared variable
MOVWF c_variable
MOVWF c_variable+1
done
RETURN
; export so linker can see it
GLOBAL asm_function
END
3.2.5.4 USING ASSEMBLY VARIABLES IN C
When using assembly variables in C:
• The variable must be declared as global in the ASM module.
• The variable must be declared as extern in the C module.
• If case sensitivity is disabled for the ASM module, the variable must 
be declared
as ALL CAPS in the C module.


ja und das ist mein code
1
void Service2Timer0(void)
2
{
3
extern unsigned int A;
4

5
_asm
6
  DECFSZ A, 1, 1
7
_endasm
8
}
Gast #528700
Lesenswert?

> • The variable must be declared as global in the ASM module.
> • The variable must be declared as extern in the C module.

Meine Vermutung: es funktioniert nicht mit inline Assembler. Wirst 
wahrscheinlich ein eigenes File für die Assemblerfunktion anlegen 
müssen. Das Compiler-Manual ist zu dem Thema ist ja wirklich nicht der 
Hammer...
OP #528705
Lesenswert?

Eigenes File anlegen? Hmm... ist es dann möglich zB. den Befehl INCF 
cnt,1,ACCESS auszuführen? cnt ist eine c variable mit dem wert 0.

Wie mache ich das kurz beschrieben ein eigenes asm-file anlegen?


Mein eigendliches Problem ist nämlich: habe ein var byte x[4].
jetzt schiebe ich 8 byte in x[0]. Nun wollte ich mit INCF MemoryAdr, 1, 
ACCESS das nächste Byte im Speicher ansprechen und über ADDWF MemoryAdr, 
1, BANKED mein neues Bit an die nullte Stelle von x[1] addieren. Aber 
wie kann ich die MemoryAdr erhöhen? wollte das eben über diese c 
Variable machen.

kurz gesagt: wie kann ich eine adresse eines speichers in eine zelle 
schreiben?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren