kit Postat Iunie 5, 2009 Partajează Postat Iunie 5, 2009 O situatie jenanta, dar stie cineva de ce codul: unsigned char var1;void main(void){var1=0xaa;_asmbcf STATUS,0,0 ;Carryrlcf var1,1,0btfsc STATUS,0,0bsf var1,0,0_endasm//remaining code}nu merge? var1 ramane 0xaa dupa ce partea de asm este executata. Multumesc. Link spre comentariu
sofian Postat Iunie 5, 2009 Partajează Postat Iunie 5, 2009 chiar ca este jenanta bcf STATUS,0,0 ;Carry bcf variabila,bit este mai bine daca scrii asa bcf STATUS,C Link spre comentariu
kit Postat Iunie 5, 2009 Autor Partajează Postat Iunie 5, 2009 @ sofian: de fapt, in C18 trebuie sa scrii instructiunea asm ca la manual, cu toti parametrii sai. bcf, complet, este bcf registru, bit, access_bit In plus, compilatorul de C18 nu cunoaste "C" ca fiind bitul de Carry, in sintaxa ASM ci cauta o eticheta (pe care nu o gaseste). In concluzie, daca vreau sa scriu cod ASM inline, in loc de: bcf STATUS,CTREBUIE sa scriu bcf STATUS,0,0primul zero este bitul de carry al doilea zero este pentru bitul de adresare. Dupa ce am mai sapat un pic am gasit de fapt solutia, in sensul ca bitul de adresare trebuia setat. Codul corect este: _asmbcf STATUS,0,1 ;Carryrlcf var1,1,1btfsc STATUS,0,1bsf var1,0,1_endasmAcum, as extinde un pic intrebarea: Cum pot muta codul ASM in alt fisier, ca de exemplu: Fisierul C: #include <p18cxxx.h>#include "asmstuff.h"#pragma config OSC = HS, OSCS = OFF, PWRT = OFF, BOR = OFF, WDT = OFF, CCP2MUX = OFF, LVP = OFFunsigned char var1;void main (void);void InterruptHandlerHigh (void); //nu am mai copiat-o extern unsigned char asm_F(unsigned char);void main (){ var1=asm_f(0x00); while (1) { ; }}headerul asm: #ifndef __ASMSTUFF_H#define __ASMSTUFF_H#include <p18cxxx.h>unsigned char asm_F(unsigned char);#endifsi fisierul ASM: #include "P18CXXX.INC" ;processor specific variable definitionsASM_FCODE CODEasm_F movf INDF1, 0, 1 RETURN GLOBAL asm_F ; export so linker can see it ENDla compilare dau eroarea: Error - could not find definition of symbol 'asm_f' in file './main.o'.De ce, cum repar asa ceva? Multumiri anticipate. Link spre comentariu
Liviu M Postat Iunie 5, 2009 Partajează Postat Iunie 5, 2009 C e case sensitive?Adica asm_f nu e totuna cu asm_F. Link spre comentariu
Vizitator yo2lio Postat Iunie 7, 2009 Partajează Postat Iunie 7, 2009 O situatie jenanta, dar stie cineva de ce codul: unsigned char var1;void main(void){var1=0xaa;_asmbcf STATUS,0,0 ;Carryrlcf var1,1,0btfsc STATUS,0,0bsf var1,0,0_endasm//remaining code} var1 este in access bank ? Link spre comentariu
kit Postat Iunie 8, 2009 Autor Partajează Postat Iunie 8, 2009 C e case sensitive? Adica asm_f nu e totuna cu asm_F. Mda, am fost neatent... Am inlocuit cu asm_F. Degeaba, tot mesaj de eroare, dar pentru asm_F.var1 este in access bank ?Se pare ca la adresarea variabilei se tine cont de BSR.Interesant ca variabilele locale nu pot fi accesate in cod asm in aceasta maniera, deoarece adresarea lor de face indirect, prin LFSR. Doar variabilele globale pot fi adresate in acest mod. Revenind la intrebarea mea. Totusi, am scris rutinele de aceeasi maniera in care au fost scrise rutinele de delay din bibliotecile compilatorului. De ce alea merg si mizeriile mele nu? Link spre comentariu
Liviu M Postat Iunie 8, 2009 Partajează Postat Iunie 8, 2009 Nu stiu daca asta aici e problema, da' eu pana acum de cate ori am folosit variabile/functii externe in C am facut invers decat e la tine. Adica am definit variabila/functia intr-un fisier .c si am folosit-o cu extern in .h. In cazul tau #include <p18cxxx.h>#include "asmstuff.h"#pragma config OSC = HS, OSCS = OFF, PWRT = OFF, BOR = OFF, WDT = OFF, CCP2MUX = OFF, LVP = OFFunsigned char var1;void main (void);void InterruptHandlerHigh (void); //nu am mai copiat-ounsigned char asm_F(unsigned char);void main (){ var1=asm_f(0x00); while (1) { ; }} pentru fisieru .c si #ifndef __ASMSTUFF_H#define __ASMSTUFF_H#include <p18cxxx.h>extern unsigned char asm_F(unsigned char);#endif pentru header. Cred ca asta e varianta corecta (chiar daca nici asa n-o sa-ti mearga, pentru viitor), pentru ca Kernighan si Ritchie zic ca variabilele externe trebuie definite exact o data in afara oricarei functii si ca trebuie declarate in fiecare functie care le foloseste. Declararea se poate omite atunci cand nu exista confuzii. Mai zic ei ca e "common practice" sa colectezi declaratiile extern intr-un fisier header, fisier inclus la inceputul fiecarui fisier sursa. Daca tu definesti o variabila in fisierul .h, cand incluzi fisierul respectiv, practic redefinesti variabila in fiecare fisier "incluzator". Link spre comentariu
kit Postat Iunie 10, 2009 Autor Partajează Postat Iunie 10, 2009 Multumesc pentru ajutor, intr-un fel am rezolvat-o. Pur si simplu am adaugat la source files fisierul asm si gata, a mers. Dar... a mai ramas sa conving var1 sa preia valoarea care ar trebui returnata de asm_F(). Rutina ASM nu era corecta. FSR1 arata urmatoarea locatie libera din stiva, deci trebuia mai intai decrementat si abia apoi atribut catre WREG. La return WREG va fi atribuit lui var1. #include "P18CXXX.INC" ;processor specific variable definitionsASM_FCODE CODEasm_F: movf POSTDEC1, 1, 0 movf INDF1,0,0 RETURN GLOBAL asm_F ; export so linker can see it ENDCodul C: ...unsigned char var1;void main (void);void InterruptHandlerHigh (void); extern unsigned char asm_F(unsigned char);void main (){ var1=asm_F(0x05); Delay10TCYx(1); while (1) { ; }}...Mai departe, am vrut sa vad daca acel extern e musai. Nu-i, programul merge si fara, desi la manual scrie: to call the function asm_delay from a C source file, an external prototype for the assembly function must be added, and the function called using standard C function notation: /* asm_delay is found in an assembly file */extern void asm_delay (void);void main (void){ asm_delay ();}Pana cand n-am adaugat fisierul ASM la proiect, n-a mers, chiar si in varianta propusa de Liviu M. Daca analizam, de exemplu, rutina Delay10TCYx(), vedem ca arata cam la fel cu ce am scris eu, dar merge fara a fi adaugata la proiect si fara alte fineturi ca de exemplu "extern". Nu stiu de ce, cand o sa mai prind la minte ma voi dumiri. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum