Fórum témák
» Több friss téma |
Ezzel az erővel a programod végére odabiggyeszthetted volna ezt is:
Kevésbé bonyolult, és biztos, hogy ott van.
Az biztos, hogy ennél érthetetlenebb példaprogramot nehezen tudott volna kreálni. Pont csak azt nem lehet belőle kitalálni, hogy mi is a baja (de végül, ha nehezen is, de kiderült).
![]()
Ezt nem fordítja be automatikusan a programba, be kell másolni a project könyvtárába a többi forrás közé és hozzá kell adni a projecthez. Ezután már beleírhatsz amit akarsz. Jelen esetben egy 'BSF NVMCON1, 7' utasításra kell kicserélni a goto előtti nop-t, és utána minden rendben fog működni (remélhetőleg). Ez így van jól, mert nem lenne jó ha egy másik projectbe is automatikusan belekerülne a (másik chip-en esetleg nem is értelmezhető) módosítás.
Ja, és az elejére be kell még szúrni egy sort is: #include <pic18.inc> ,hogy tudja mi az a NVMCON1
Idézet: „Akkor az összes PIC18 nál ez nem működik ? Idézet: „nop ;Suggested Microchip errata workaround”” Ez a nop a 0x000 címen van a program memóriában az ICDx debug előírások betartása végett. Minden 16F, 18F típusra ezt a megoldást ajánlják. Ugyanis a reset után a 0x0 címen levő utasítás végrehajtódik mielőtt a debugger átvenné a vezérlést. Idézet: „Azon viszont csodálkozom, hogy egyesek, akik itt lenézik a C nyelv lehetőségeit és azt is, aki használja, de a nagy assembly tudásukkal rendszeresen kérkednek, hozzá se tudnak szagolni.” Esetleg nem érnek rá, nincs feltelepített MpLabX náluk, az XC8 fordítót az eredményei elismerése mellett régebben leinstallálták... Itt fentebb hangoztatják azt is, hogy a magasabb szintű nyelvek használata sokkal kényelmesebb, elvont szintű leírással kell csak foglalkozni, az assembly ismerete nem is szükséges... A hozzászólás módosítva: Nov 28, 2017
Mindenkinek köszönöm a hozzászólását és nem volt szándékom senkit sem elmarasztalni, sem megszólni.
Itt semmi sem kötelező, akinek nem volt ideje, nem érdekelte, nem foglalkozott vele. A példaprogram 8 soros C volt, ami le volt fordítva asm-re, kezdőcímekkel ellátva. Aki itt megfordul, egyik sem teljesen érthetetlen számára. Hogy ne legyen szükség telepített MPLABX-re, XC8-ra, azért tettem közzé ezt az egyszerű példát: Bővebben: Link
Köszönöm!
Időnként más 18-as sorozatot is használok, így azt mindegyikbe beletenné. Maradok az egysoros asm-nél.
Kicsit off, ezért leszíneztem.
1-tengelyes gyorsulásmérőre lenne szükségem. Valami extrém olcsó kivitelben. Ami elektronikák vannak, 3-tengelytől kezdődnek, és legalább 1k huf-ba kerülnek. Azok a legolcsóbb lehetőségem, vagy van olcsóbb?
Nem követtem egészen a fordulatokat.
C program: const int *p; ... p=&x[0]; Ha a p pointer konstans, miért adsz neki értéket? Nem a deklarációkor kellene? Illetve nem kellene const prefix neki. Assembly lista: Mi az igazi probléma: Nem teszi ki a konstans értékeket a LATA regiszterbe? A tblrd* nem lépteti a TBLPTR regisztert. A tblrd*+ az olvasás után növeli a címet. Ekkor valahogyan gondoskodni kellene a tartomány végének teszteléséről. Kikapcsol minden LED -et 1 másodperc után?
Nem a mutató a konstans, hanem az amire mutat (ROM címet tartalmaz).
Olvastad a tegnap esti hozzászólásomat (igaz, hogy f2f2-nek címeztem)? Ott pont ezt írtam le, hogy hogyan kell az aktuális projectbe berakni. Ha a C programod elejére teszed, akkor nem lesz a globális változóidnak kezdőértéke, mert a BSF NVMCON1, 7 csak a változók (így sikertelen) inicializálása után fog lefutni.
Ugye mennyivel egyszerűbb volt a C18 esetében:
A deklaráció elmondott mindent.
A p egy konstansra mutató pointer. Értéke a konstans címe, a konstans értékét a *p adja.
A gond az volt, hogy bármilyen globálisan deklarált konstans és változó 0 értéket adott vissza. Ezért aludt el a LED. A példában egy ROM-ban elhelyezett konstans tömb elemeit olvastam ki, amit kitettem LATA-ba. A TBLRD hiába futott le a megfelő táblapointerek beállításával, mert nem volt engedélyezve a tábla olvasása. Erre hívta fel a figyelmem benjami fórumtárs, ez benne van az eszköz errata-jában. A megoldás egy bit beállítása, BSF NVMCON1, 7 utasítással, még mielőtt bármi más lefut. Ezután a konstansok inicializálása hibátlanul működik, a LED már nem alszik el. (Mindez nem volt látható a szimulátorban.) Egyelőre ezt a C forrás elejére raktam, mert az MPLABX-ben nem találom, hogyan lehet benjami fórumtárs javaslatát kivitelezni. Az utasítás így is végrehajtódik még mielőtt az adatok lehívása megkezdődik. A konstansok inicializálása így megoldott, de a globális változók továbbra is 0 értéket adnak vissza típus és értéktől függetlenül. Remélhetőleg ennek a megoldása sem lesz sokkal bonyolultabb.
Olvastam és öszönöm!
Nézegettem, de nem találom, hogyan tudom kivitelezni. Lefut így is a fontos részek előtt, de ha tudom, átalakítom.
MPLAB-x et próbálgatnék lefordítástechnikailag tesztelni. Tudna prezentálni valaki egy projektet vagy fájlokat, amit hibátlanul fordít . Mindegy milyen PICre van és hogy mit csinál. Kössz
Eddig a minta mappából se sikerült a .mk nél hibákkal vérez el a build munkánál.
Itt már írtam, hogy a startup kódban nincs benne az inicializáló ciklus, ami a ROM -ban levő listából a RAM -beli helyekre másolná a globális változó kezdeti értékeit.
Abban a bizonyos C18 -ban kellett egy linker vezérlő állomány, amiben meg lehetett adni a startup kódot: Ha voltak inicializált globális változók:
Ha nem voltak inicializált globális változók:
A képen láthetó projectben vannak inicializált globális változók, a 0x7248 -től egy rakás tblrd*+ segítségével átmásolja az értékeket a megfelelő RAM területekre. Amit a belinkelt forrásodból fordítottam a 18F25K50 -re, abból ez a rész teljesen hiányzik, csak az egy nyomorult i változót írta 0 értékre. Feltettük a kérdést az XC8 szakértőknek, hogy mit és hogyan kell még beállítani, de eddig nem jött válasz. - A Microchip fórumán és a 26K40 errata -jában ez az NVMCON bug szerepel. Másold le a <Windrive>:\Program Files\Microchip\xc8\<verzio>\sources\pic18\powerup.as állományt a saját projectedhez, vedd fel a forrás állományok közé. Tedd bele a BSF NVMCON1, 7 a goto start elé. --- Ettől még a globális inicializált változók problémája nem oldódik meg... - Microchip fórum --- Ehhez viszont a legújabb MpLabX kellene...
Pedig feltölti, a fordítás után ott lesz a programmemóriába feltöltő kód, csak a disassembly listing file-ba nem kerül be.
Mellékeltem egyet (pic18f452, xc8).
Idzet az állományodból:
Idézet: „Microchip\xc8\v1.33” Ez a verzió nem ismeri a 18F25K40 -et. Az XC8 v1.42 -vel fordítgattam az MpLab 8.90 alatt. Ez sem ismeri a 18F25K40 -et, helyette a 18F25K50 -el próbálkozom, de nincs benne a fordított kódban a kezdőértékkel rendelkező globális változók inicializálása, pedig a linker Initialize opciója be van kapcsolva.
Nálam is csak 1.33 van, így én sem tudom a 18f25k40-et kipróbálni. Az alábbi próba 18f452-re van. Ami nem látszik a képen, a 0. címen a nop után egy goto 0x3FE8 van.
Az ugrás a start_initialization címre megvan itt is, de a start_initialization lényegében üres, nem tartalmaz tblrd utrasítást. Csak a globális p pointer -t törli, pedig neki nem volt kezdeti értéke - így inkább a változók törlésének része.
Majd valamikor kipróbálom a régi mplab alatt. A lenti fotókon levő beállításokat használtam. A linker beállításainál be van pipálva az initialize data (nem állítottam, ez volt az alapértelmezett).
A hozzászólás módosítva: Nov 29, 2017
Felkínlódtam az MpLabX 4.05 -öt a gépre, megcsináltam a projektet, lefordítottam....
Láss csodát ebben a környezetben működik minden... Olvasgattam a fordító readme állományát. Vannak benne szekció átnevezésekre utaló bejegyzések (fő a kompatibilitás), vélhetőleg ezek okozzák a problémát. Sajnos az MpLab 8 -cal már nem tud együttműködni ezek szerint... A hozzászólás módosítva: Nov 29, 2017
A 4.05 öst tettem fel én is
Kipróbálhatjuk mi is ? a fájljaiddal Egy szinte üres C fájlt fordítva ez így jó? CLEAN SUCCESSFUL (total time: 47ms) make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf make[1]: Entering directory 'F:/X_microchip/MPLABXProjects/PIC16F84A_test.X' make -f nbproject/Makefile-default.mk dist/default/production/PIC16F84A_test.X.production.hex make[2]: Entering directory 'F:/X_microchip/MPLABXProjects/PIC16F84A_test.X' "F:\X_microchip\XC8(v144)\bin\xc8.exe" --pass1 --chip=16F84A -Q -G --double=24 --float=24 --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/default/production/newfile.p1 newfile.c A megadott nevet (F:\X_microchip\XC8) a rendszer nem ismeri fel bels� vagy k�ls� parancsk�nt, futtathat� programk�nt vagy k�tegf�jlk�nt. A megadott nevet (F:\X_microchip\XC8) a rendszer nem ismeri fel bels� vagy k�ls� parancsk�nt, futtathat� programk�nt vagy k�tegf�jlk�nt. A megadott nevet (F:\X_microchip\XC8) a rendszer nem ismeri fel bels� vagy k�ls� parancsk�nt, futtathat� programk�nt vagy k�tegf�jlk�nt. "F:\X_microchip\XC8(v144)\bin\xc8.exe" --chip=16F84A -G -mdist/default/production/PIC16F84A_test.X.production.map --double=24 --float=24 --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" --memorysummary dist/default/production/memoryfile.xml -odist/default/production/PIC16F84A_test.X.production.elf build/default/production/newfile.p1 Microchip MPLAB XC8 C Compiler (Free Mode) V1.44 Build date: Sep 13 2017 Part Support Version: 1.44 Copyright (C) 2017 Microchip Technology Inc. :: warning: (1273) Omniscient Code Generation not available in Free mode A megadott nevet (F:\X_microchip\XC8) a rendszer nem ismeri fel bels� vagy k�ls� parancsk�nt, futtathat� programk�nt vagy k�tegf�jlk�nt. A megadott nevet (F:\X_microchip\XC8) a rendszer nem ismeri fel bels� vagy k�ls� parancsk�nt, futtathat� programk�nt vagy k�tegf�jlk�nt. A megadott nevet (F:\X_microchip\XC8) a rendszer nem ismeri fel bels� vagy k�ls� parancsk�nt, futtathat� programk�nt vagy k�tegf�jlk�nt. Memory Summary: Program space used 12h ( 18) of 400h words ( 1.8%) Data space used 5h ( 5) of 42h bytes ( 7.6%) EEPROM space used 0h ( 0) of 40h bytes ( 0.0%) Data stack space used 0h ( 0) of 3Fh bytes ( 0.0%) Configuration bits used 0h ( 0) of 1h word ( 0.0%) ID Location space used 0h ( 0) of 4h bytes ( 0.0%) You have compiled in FREE mode. Using Omniscient Code Generation that is available in PRO mode, you could have produced up to 60% smaller and 400% faster code. See http://www.microchip.com/MPLABXCcompilers for more information. make[2]: Leaving directory 'F:/X_microchip/MPLABXProjects/PIC16F84A_test.X' make[1]: Leaving directory 'F:/X_microchip/MPLABXProjects/PIC16F84A_test.X' BUILD SUCCESSFUL (total time: 4s) Loading code from F:/X_microchip/MPLABXProjects/PIC16F84A_test.X/dist/default/production/PIC16F84A_test.X.production.hex... Loading completed A hozzászólás módosítva: Nov 29, 2017
|
Bejelentkezés
Hirdetés |