Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziasztok!
18f67j60-as picet programozok C18-as fordítóval, és az lenne a problémám van egy függvényem,
Az átadott stringet megtaláltom a program memóriában a 1xyz címen. Próbáltam a far operátort használni, ekkor a mutató ugyanazon a címen tárolt stringre 2xyz címet kata meg a függvényen belül. Természetesen még mindig Restricted memory. Ha azt átírom a "valós" címre akkor is hasonló eredményt kapok. A code modellem kicsire van állítva, és az adat modell nagyra a stack model pedig single-bank. Miért nem tudok a pointerrel hozzáférni? Segítségeteket előre is köszönöm!
Ehhez hasonló függvényem nekem is van:
Használata pedig így történik:
A mutató (nálad String, nálam psz_s) a programmemória területére mutat, ezért a c=*psz_s értékadás táblázatolvasással (TBLRD*) utasítással veszi elő a soron következő karaktert (előtte a mutatót TBLPTRL/TBLPTRH-ba másolja a program).
Az Explorer16 hajdanában PIC24FJ128GA010-hez készült. Fogalmam nincs, hogy az általad felsorolt mikrovezérlőknél hogy van a lábkiosztás és a PIM modulok lábainak összerendelése. Lehet, hogy egy olyan portbitet vagy periféria kivezetést használsz, ami az egyes mikrovezérélőknél máshol van kivezetve az IC tokból, vagy máshová van kötve a PIM kártyán. Szép feladat lesz ezeknek az aprólékos ellenőrzése!
A PIM modulok kivezetései nem egyformák, de az általam használt portok megegyeznek. A PIC32MX790 és a PIC32MX460 PIM modulok kivezetései megegyeznek, mégsem működik a PIC32MX460-assal. Fogalmam sincs mi lehet a kettő között a különbség.
Pedig ezt neked kell végignyálazni az adatlapok segítségével. Egy biztos, ha egyformák lennének, működne!
Szia!
A C -ben a '\r' a 0x0D , a '\n' a 0x0A kódú karakter. Ha a szövegeket a outString("Hello world!\r"); alakban adod meg, nem kell a futás idejű konverzió. Idézet: „A C -ben a '\r' a 0x0D , a '\n' a 0x0A kódú karakter.” Ez amugy platform fuggo. Unixban a '\n' 0x0A (LF) valoban, de pl regebbi MacOS-en ez 0x0D (CR), Windows-ban pedig 0x0A0D (CR+LF, tehat 16 bites).
Ugyan így van nekem is. Sajnos még mindig nem működik, most már a disassembly ablakban vizsgáltam hogy mi történik, és azt vettem észre, hogy a pointer címét helyesen tölti be a TBLPTRL/TBLPTRH, de amikor megpróbálja kiolvasni a TBLRD*-vel akkor mindig 0xFF-et olvas ki.
Annyi még hogy mivel nagyobb tömbjeim vannak, emiatt a linker fájlban a bankokat egyesítettem egy nagyobbá. Természetesen a szoftveres stacket békén hagytam.
Ez nem konverzió, hanem kiegészítés: LF elé automatikusan beszúr egy CR-et is.
Szia!
Az olvasás eredményét befolyásolja még a TBLPTRU regiszter taratlma is. A TBLPTR 22. bitje választ a program és a konfigurációs memória között.
Nem, neked a 'rom' szerintem rossz helyen van. Az a 'char' ele kell keruljon, es neked nem kell 'unsigned', nem is ertem miert tetted azt bele? De amugy minden qualifier-t a 'char' ele kell tenni nem moge, tehat a 'const' ill. 'far' is oda kell keruljon ('const' pl jo helyen van).
Irtad, hogy nayobb tombben vannak a stringek, amiket egy kulon erre fenntartott szekcioba helyeztel? Ugy tunik neked kell az a 'far' qualifier akkor... Idézet: „Ugy tunik neked kell az a 'far' qualifier akkor...” A nagyobb tömböket az adatmemóriában helyezi el, tehát azoknak a deklarációjánál kell használnia a far módosítót (bár ha nem csalódom, az a default). A "const rom" deklaráció mellé pedig akkor kell a "far" módosító, ha 64 kbájtnál magasabb címeket is használ a programmemóriában.
Üdvözletem!
PIC18F2431-en szeretnék soros kommunikációhoz crc16-t számolni, de a hozzá szükséges táblázat nem fér el 2 databankban sem. Összesn 521 bájt a program ebből 512 a táblázat, a gpr0, gpr1, gpr2-be összesen 671 bájt fér. Próbáltam darabolni is a táblázatot de mindig hibára fut a C18 compiler. A legidegesítőbb az, hogy ha a táblázat 3/4-ét teszem be csak, akkor lefordul. Mit lehet ilyenkor tenni? Egyáltalán nem létezik crc16-hoz táblázat nélküli módszer?
Hova akarod tenni a táblázatot? Nehogy ne férjen már el egy 16kbyte-os PIC-ben!
Köszönöm a gyors választ!
Próbáltam úgy, hogy gpr0-ban van az első negyede, gpr1-ben a fele, gpr2-ben a maradék. De csak nem megy. Error - section 'gpr0' can not fit the section. Section 'gpr0' length=0x00000080. Ezt kapom, ez meg azért érdekes mert ha jól látom gpr0 0x9F tehát el kéne férnie. #pragma idata gpr0-val próbálom elhelyezni. Lehet, hogy ez nem jó?
A RAM-ba akarod tenni? Tedd a program memóriába, azt oda szokás! Konstansokat RAM-ba?
Sejtettem, hogy nem itt a helye, de ennek a mikéntjét nem ismerem, elég kezdő vagyok még
Valami ilyesmi:
Neked persze a tábládat kellene betenned egy, vagy több tömbbe. valahogy így:
Igen! Sikerült, legalábbis lefordult, kipróbálni majd csak akkor tudom ha arra is rájövök hogyan kell kiszámolni a crc-t Köszönöm a segítséget!
Már sikerült megoldani, de azért köszönöm!
Jó estét az uraknak!
Elég sok kezdő kérdésem lenne Ma beszereztem egy Pickit debug exp2-t és a Kónya-Kopják féle könyv is megvan, ki is olvastam szorgalmasan. Az első szoftveres kérdésem az lenne, hogy C-ben mit javasoltok, hogyan oldjak meg egy olyan kapuvezérlést, ami nyit-stop-zár üzemmódban működik, tehát ha menetközben újra kap impulzust akkor megáll, aztán a következőre fordítva indul el. Ez kezdetre elég nagy fa a fejszémhez, el is akadtam a lehetőségeken, nem áll össze a kép a fejemben. Nem tudom eldönti, hogy külön függvényeket csináljak az egyes állapotoknak, vagy egy kupac HA döntéssel oldjam meg vagy switch-case szerkezettel, ebben szeretnék tanácsot kérni mi a célszerűbb. A másik, hogy a "gombot" pollinggal vagy megszakítással kéne-e kezelni? Ha valaki tudna egy egyszerű megoldást felvázolni, onnantól már megküzdök vele. A hardveres részéről az lenne a kérdésem, hogy hogyan tudnék kimeneti lábbal 12 vagy 24 voltról működő reléket meghúzatni? (gondolom tranzisztort kéne rátenni) Illetve a 12/24V-os bemeneti jeleket hogyan tudnám illeszteni a PIChez? Ez elég sok kérdés így elsőre, de sajnos abból amit a suliban tanultunk nem áll össze a dolog a fejemben :no: A segítséget előre is köszönöm!
Szia,
Allapot gepet tipikusan switch-case-el szokas megvalositani. A case agakban nyilvanvaloan bele tehetsz kozvetlen program reszleteket is, de ha szepen akarod tagolni a forras filet akkor erdemes azokat kulon fuggvenyekbe rendezni es a case-bol hivatkozni ra. A gomb nyomas vagy mas esemenyek fogjak a switch-case-edet vegrehajtani, az esemeny eltarolod valahol, es a switch-case-ban a pillanatnyi allapotban dontod el, hogy adott esemenyre hogyan kell reagalni. Tehat ha pl lampa vezerles: Ket allapot, BE ill KI, egyetlen esemeny kovetkezhet be, a gomb nyomas. Ilyenkor a BE agban az esemeny bekovetkeztekor a statuszt atvaltod KI-re es kikapcsolod a lampat. KI eseten a gombnyomas esemeny bekovetkeztekor forditva cselekszel... Azt, hogy a gombot hogyan kezeled le teljesen mindegy, pollingozas is teljesen jo. Nyilvan a perges mentesitest is meg kell oldanod, de utana a lenyeg, hogy a fent leirt modszer alapjan jarj el.
Ötletadónak nézd meg a honlapomon a Mintaprogram: LED vezérlése nyomógombbal II. c. programot és az utána következőt. A másodikban ha az SW2==1 ágat követed, az nagyjából olyan (a LED-nek három állapota van), mint amit keresel.
Ha nincs más tennivalója a programnak, akkor a polling is tökéletes. Relé vezérlés (csak az elrendezést nézd, a tápfesz és a tranzisztor... lesz) Bemenő jel illesztése: feszültségosztó, vagy ellenállás+zener, stb.
Sziasztok!
Először is szeretném megköszönni a segítséget amit a DS89C4.. mikrokontroller programozóhoz kaptam. Megépítettem és működik is kifogástalanul. Viszont akadt még egy kis gondom. Bascom-8051-et használom program írásra, és az időzítés nem jól működik. Tehát pl beírom hogy Waitms 1000 és ő csak a harmadát várja ki. Gondolom hogy meg kellene adnom egy regfile-t, de sajnos sehol sem találtam őket. Van rá megoldás, vagy más szoftvert kell beszereznem? Köszi szépen a segítséget előre is.
Szia!
Írj 4 sorban Wait 250 -et. Lehet, hogy csak 8 bites értéket kezel....
Jól sejtem, hogy ha relé kapcsolja a bemenetet akkor is kell pergésmentesíteni? Mert a bemenetet egy külső rádióvevő adja, ami tulajdonképp egy relét húz meg rövid időre, ha jelet kap a távirányítóktól.
Igen, minden mechanikus érintkezőknél szükséges a pergésmentesítés.
Valószínűleg nagyon amatőr kérdés, de már egy órája kb. szívok vele... 44 lábas pickit2 demó panelem van, ezer módon probáltam beolvasni az RB0-on lévő gombot és nem akarja az igazat, mit szúrtam el?
Ez már nem az első változat, kb. 6 féle módon probáltam az if feltételt megadni, de úgy tűnik nem ott van a hiba. Vagy PORTB felső 7 bitje nem 0 ha az alsó bemenet?
|
Bejelentkezés
Hirdetés |