Forum: Mikrocontroller und Digitale Elektronik C18 c_var in inline assembler benutzen


von Ron N. (blitzgeist)


Lesenswert?

Hallo zusammen,

kann mit jemand an hand eines code beispiels zeigen, wie ich beim C18 
compiler eine c var im inline assembler benutze?
1
extern unsigned int ShiftCnt; 
2
_asm  
3
  DECFSZ ShiftCnt, 1, ACCESS
4
_endasm

Das funzt aber nicht.

lg,
blitzgeist

von Katzeklo (Gast)


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...

von Ron N. (blitzgeist)


Lesenswert?

Hallo,
habe den PIC18F2550. Den Befehl habe ich aus dem instruction set 
entnommen...

Was net funzt ist:
Error - could not find definition of symbol 'A' in file 
'C:\Test\fw\_output\user.o'.
Errors    : 1

von Katzeklo (Gast)


Lesenswert?

Symbol A?

Seltsam, aber jetzt wo du es sagst:

DECFSZ ShiftCnt, 1, 1

Geht's so?

von Ron N. (blitzgeist)


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
}

von Ron N. (blitzgeist)


Lesenswert?

keiner mehr ne ahnung? ...

von Katzeklo (Gast)


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...

von Ron N. (blitzgeist)


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?

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
Noch kein Account? Hier anmelden.