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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.