Fórum témák
» Több friss téma |
Arra, hogy a 18LF4620 2V-ról is üzemeltethető. Igaz, ekkor a maximális frekvencia, amin a gyártó garantálja a működést, az 4MHz.
Ok, köszi. Az oldalt megleltem csak elvesztem benne.
Köszi még egyszer, lesz mit holnap nézni,csinálni.
Sziasztok!
Nekem az lenne a problémám, hogy megépítettem ezt és felraktam rá a mellékelt hex bootloadert, pickit2-vel. Ezek után ha rádugom USB-re és megnyomom a bootload+reset gombokat akkor szépen elkezdenek villogni rajta a ledek, a windows írja, hogy új hardvert talált. Viszont. Amikor kijelölöm a drivert, akkor azt írja a windows, hogy nem talált megfelelő drivert. WinXP SP3-at használok. Valami ötlet? Kieg.: Letöltöttem az mcc18-at, gondoltam lefordítom és feltöltöm valamelyik eredeti firmwaret, viszont azok meg ezt a fordítási hibát dobják, és nem fordulnak: Idézet: „MPLINK 4.37, Linker Copyright (c) 1998-2010 Microchip Technology Inc. Error - section '_cinit_scn' can not fit the section. Section '_cinit_scn' length=0x0000009e Errors : 1 Link step failed.”
Próbaképpen felrakhatod rá a PICCOLO projekt szoftver segédletében (PIC18 példaprogramok) általam közzétett és módosított HID bootloader-t. Tehát innen töltsd le és bontsd ki a code_examples.zip csomagot, s a bootloader mappában található PICCOLO-HID-Bootloader-PIC18F4550.hex állományt égesd be! Ott van mellette a HIDBootLoader.exe is, ami a letöltést irányító PC alkalmazás, .NET 2.0 vagy újabb környezet kell neki, akárcsak a PICkit2 kezelőprogramjának).
Ehhez nem kell drivert telepíteni, s a használata is kellemesebb. Egy negatívuma azért van: nagyobb a helyfoglalása, a vektorokat az 0x1000, 0x1008, 0x1018 címekre kell áthelyezni. Ha véletlenül ez sem megy, akkor a hardvert kell ellenőrizni. Fontos a VUSB-n a 470 nF megléte (bár nekem működött már félig-meddig anélkül is, de nem ajánlom...). A rajzon nem látszik, de ugye a VDD-VSS lábak között vannak a 100 nF-os kondenzátorok? A közzétett bootloader 20 MHz-es kvarchoz való, de 4 MHz bármelyik többszöröse (4, 8,12, 16,20) használható a PLL előosztó módosításával. A bootloaderek csak teljes optimalizálással fordíthatók le, különben nem férnek be a memóriába (a hibajelzésból ítélve te is úgy jártál). A konfig bitek gyári beállítása nem tökéletes, ezért (és csak ennyit) módosítottam az eredetihez képest.
Szia!
Érdemes lenne a fordításkor keletkező üzeneteket is figyelmesen elolvasni, árulkodó dolgok vannak benne: - Több okból is "Argument out of range. Least significant bits used." üzenetet ír: -- 1. A bináris szám megadását nem jól írtad. Amit megadtál pl: 00111100B egy igen hosszú hexadecimális szám a 0x00111100B. Helyesen b'00111100'. |gy már a TRISB, TRISC, ADCON1 beállítása sem jó. -- 2. A KESL rutinban decimális számot szerettél vona megadni, de ez is hexadecimális lett 256 = 0x256. Helyesen .256 - A LATB már a hétszegmenses kijelző mintáját tárolja, nem a számot, így a 9 számjegyet inkább a TEMP változóval kellene viszgálni. Ha még a 9 -et is ki szeretnéd jelezni, akkor inkább a 10 számra kellene nullázni a TEMP -et. - Ahogy már írtuk, a TABLAZAT indexét duplázni kell mivel a RETLW 2 byte - ot foglal a memóriában. - A konfigurációs biteket is be kell állítani a programban. A watchdog timer jár, de a programod nem törli, így minduntalan resetet fog okozni. Az oszcillátor beállítása nélkül a kontroller nem fog elindulni a valóságban... Mindezeket a hibákat a MPLAB SIM szimulátorával sikerült megtalálnom és kijavítanom. Válaszd ki a Szimulátort (Debugger / Select Tool / MPLAB SIM), fordítsd újra a programot. Ekkor a Zöld Nyil az aktuális utasításra fog mutatni. A Debugger menüpont alatt megjelenő pontokkal lehet a programot nyomonkövetni (vannak gyorsbillentyűk is: F6 - kontroller reset, F7 - egy lépes, követi az eljárás hívást, F8 - egy lépés, az eljárást átlépi)...
Lehet, hogy majd írja, de Baxi tudtommal megváltoztatja az alapértelmezett számrendszert és így jó a bináris, ill. decimális szám megadása ( más kérdés, hogy Te nem úgy hoztad létre a projektet! ) .
Steve
Hi, köszi.
Én 10-es radix-ot használok alapból, így van beállítva a fordító prg(Mplab) bevitt értékek jók mert a watch ablakban az történik ami kell adcon stb , kivéve a pcl és w összeadásakor kapott értéket de azt már írtátok hogy miért.A wachdog timer meg configbit-ből van tiltva. Na nézegettem a Watt által írt példa prg-t. Azt nem értem benne hogy hol van a táblázat feltöltve amit a gombnyomásoknak megfelelően kiolvass. Nincs valakinek szájbarágós magyarázata hogy hogy megy ez a táblázatos téma 18f-sorozatban. Mert a 16f nél kell csinálni előre egy táblázatot amiben belerakom az értékeket 8 bit-et. És amikor odaküldöm a a programot a retlw parancsal kiszedi ami aban a sorbn van s visszajön abban a sorban lévő 8 bit-tel. De ez a TBLRD*+= tábla mutató növelése, de milyen érték van benne? és mivel tudom növelni mert itt nincs semmi változó pl.: W amit hozzáadok hogy oda ugorjon. TBLRD*, tábla olvasása, milyen tábla? Van valami táblázat parancs amit beírok és attól a memcímtől lefoglalja táblázatnak ameddig be nem írok egy táblázat vége parancsot, vagy hogy megy ez. Remélem érthető volt hogy mit akarok. Bocsánat a ha hülyeségeket irkálok.
Az odaig renben van, csak ez a 010101B reprezentacio nem tudom honnan jon? Doksi szerint nem igy kellene leirni (ld. meg a mellekelt kiollozast).
Oszinten szolva en meg csak mas rendszerekben lattam ilyet es emiatt azt mondanam az ott nem jo. Azonban mivel tul sokmindent lattam mar eletemben, nem lepodnek meg azon sem, ha mukodne. Mindenesetre ezt felul kellene vizsgalni, es meg ha mukodik is sem szerencses igy hasznalni, mivel ez nem dokumentalt es kulonben sem igy szokas... Pl megkeveri a szakikat akik segiteni tudnanak... vagy nem biztos, hogy ez igy majd mukodik majd mas, kompatibilisnek kikialtott forditokkal, mint pl gnupic/gpasm. Ami a radix allitast jelenti: Az sem egy szerencses dolog ha a menubol allitja at ezt az OP -- jobb az ha a forrasban van, igy nem lenne kerdes es nem lenne komplikacio sem...
Köszi, kipróbáltam ezzel szó nélkül működik. Mondjuk a linkelt oldal nem kicsit vázlatos, de azért kibogozható
Szóval köszi, most már megy
Örülök neki, mert akkor jó az áramköröd!
Egy kérdésem még azért lenne
Letöltöttem az examples.zip-et, gondoltam kipróbálom a benne lévő ledflash.c progit. Leforgattam MPLAB-bal, majd bootloaderrel feltöltöttem a .hex-et és láss csodát... semmi nem történik... Leírás szerint az rd0,rd1,rd2,rd3 ledeket villogtatná, de mégsenemse. Erre valami ötlet?
Útközben talán rájöttem... alapvetően csak megnyitottam, beállítottam a linker és a source librarykat és forgattam is. Lefordult, hiba nélkül. Aztán feltöltöttem és nem ment. Most megnéztem, a Configure->Select Device menüpontban és bizony bizony a 18f14k50 volt bejelölve. Átállítottam 18f4550-re, az eredmény:
Idézet: „MPLINK 4.37, Linker Copyright (c) 1998-2010 Microchip Technology Inc. Error - processor types do not agree across all input files. Errors : 1 ” Tehát 18f4550-re nem fordult le, pedig leírás szerint mind a kettővel működik. Akkor most 18f14k50-ként kell leforgatni és azt a hex-et felölteni vagy 18f4550-ként kell lefordítani?
Nyilvánvalóan 18f4550-ként kell lefordítani, de a linker állományt is ki kell cserélni! (a common könyvtában található PIC18f4550.lkr kell neki)
A későbbi fejezetekben csináltam külön projekt fájlt a 18f4550-nek, azokat érdemes megnézegetni.
Ha csak így nem...
Múkodik minden f@szán, köszönöm szépen a segítséget!
Szia!
Én kezdettől fogva a 01001010B megadást használom ( és én is átállítom az alapértelmezett számrendszert ), eddig jól működött ( valamikor a 4.x MPLAB-al kezdtem, de már nem emlékszem hol találkoztam ezzel a megadási móddal! ) ! Egyetértek, ha nincs publikálva, akkor nem érdemes így megszokni, de amíg nem jelez hibát, addig várhatóan le is fogja kezelni ( mivel számmal nem kezdődhet címke v. szimbólum ) ! Steve
Sziasztok!
Egyetértek Trudnaival: A forrásban kell mindent beállítani. Arra szolgál a radix direktíva. És a konfigurációs biteket, és egyébb az eddig a project állományban, parancssori paraméterekkel beállított értékeket is célszerű lenne a forrásba átvinni. Nem kis időm ment rá, hogy kiderítsem mi is a hiba. Ha tudom, hogy átállítottam a default paramétereket, akkor fel is tölteném a project -et tömörítve, esetleg az Output ablakból kimásolnám a hibajelzéseket. Nem ajánlom a 01001010B formát, mert kétféle számrendszerben is értelmes: kettesben kiértékelve a decimális 74, hexadacimálisan kiértékelve a decimális 268501259, az alacsony helyiértékű 8 bitjére csonkolva a decimális 11. :felkialtas: Nem sikerült így a bináris értéket a kódba tennem, oda 11 került.... This example shows the usage of the radix directive for data presentation. If not declared, then the default radix is in hex(adecimal). Idézet az MpLab Assembler Help -jéből:
Használja a H és az O végjelet a hexadecimális és az oktális számrendszer megadására, de még véletlenül sem használja a B végjelet mert nem egyértelmű.
Nem biztos, hogy minden kód nyilvánosra készül ( abban egyetértek, ha ezt felrakja egy fórumba, akkor érdemes jelezni! ) és ebben az esetben a projektben a beállítás természetesen el van mentve. Én is így szoktam mindig használni, ezért volt nekem "triviális" és az én kódjaimat is ezért tudom ÉN gond nélkül olvasni!
Azért, hogy lefordítsa a 01001010B és jól értelmezze azt kell tenni, hogy a Project ablak Source részén a *.asm fájlra jóbb gomgot nyomva be kell állítani a tízes számrendszert ( természetesen másképp is elérhető menüpont ). Én szeretem a számokat alapértelmezésben, külön jelölés nélkül 10-es számrendszerben írni. Ha beállítod ezt az üzemmódot, akkor a 2-es és 16-os számrendszert írhatod az általad megszokott módon vagy 01001010B, ill. 4AH módokon is! Persze kinek a pap, kinek a papné... Steve
Szia!
Az 50O -t is utálom, nem ordít, hogy oktális... Régi leírásokban olvastam pl. az I8O8O processzor típusát, így O betükkel ítva, hogy véletlenül se lehessen I8O88 -nak olvasni... A fórumra elég annyit feltölteni a programból ami még tartalmazza a hibát, ill. a problémás részt. Egyébként a 16F szériára nagyon jó disassembler van... A 18F -en már meg lehet keseríteni a visszafordító életét egy ilyen résztlettel:
Baxi példeprogramja szerintem nem annyira titkos...
"Baxi példeprogramja szerintem nem annyira titkos..." nem is írtam, csak azt kívántam jelezni, hogy nem biztos, hogy bele kell írni a programba a radix-ot.
Nem tudom, Te hányszor használtad az oktális számrendszert, nekem még az iskolában sem kellett, azóta meg pláne nem ( biztos kell valahova, de én megúsztam ). Befejeztem, mert nem szeretnék off-olni, bár én ezt is szakmainak gondolom... Steve Idézet: Bár nem engem kérdeztél, de elmondom, hogy én 7-8 éven keresztül (KFKI TPA és DEC PDP gépeken). Most lehet, hogy megint elő kell szedni egy Q-buszos ketyere miatt. „Nem tudom, Te hányszor használtad az oktális számrendszert”
Sziasztok.
Szeretném kérdezni, hogy egy szervót egy CCP PWM modulall meg lehet-e hajtani,úgy hogy a hátterben fusson. Amire gondoltam: a szervónak csak jobbra balra kéne mozogni. (0-180-0-180... fok) Odáig eljutottam, hogy a PWM mód menjen szépen, de a 20mS-os periodusidőt nem tudom, hogy kell megadni neki. Sajnos leírást sem találtam (vagy csak figyelmetlen voltam) a neten (főleg magyarul), hogy a PR2 -be, hogy kell 255-nél többet írni, és megváltoztatni menet közben a kitöltési tényezőt. Ha valaki segítene, hogy hogy kell megvalósítani, ezt a projektet, megköszönném (ha elég egy köszönet).
A timer2 előosztóját lehet állítani, de csak akkor tudod elérni a kívánt időzítést, ha a pic oszcillátor frekvenciája 819200Hz maximum.
Ugyanis 20mSec időhöz kell 256 ciklus timer2 előosztó /16 végrehejtási idő osc/4 ebből következik: 1/ 0.02*256*16*4= 819200 Hz járhatóbb út, ha beállítasz számlálókat és valamelyik timer megszakítás kezeli őket. 20MHz oszcillátornál ha használod pl a timer0 -át akkor beállítod, hogy amikor megszakítást generál, akkor hozzáadsz az aktuális értékéhez 6-ot. ezzel 6 ciklussal hamarabb lesz megszakítás, azaz 250 órajel után lesz megint megszakítás. Ezzel hozzájutottál egy 50uSec időzítőhőz. mindem megszakítás növeli csökkenti az általad meghatározott regisztereket és gyerekjáték mostmár a 20mSec és az 1-2 mSec idő beállítása.amit szintén a timer0 kezel. Az 1-2 mSec tartományt is 20 részre oszthatod. Ha ez nem elég, akkor a timer0 megszakítási idejét veheted rövidebbre. Másik: timer1 16 bites időzítő, 4MHz kristály megszakítási időt beállítod 65535- 20000(20msec)-pwm idő és amikor megszakítás keletkezik akkor a pwm-nek kinevezett lábat felemeled magasra ezután a következő megszakítás 65535- (1000től 2000) 1-2mSec akkor a pwm nek kinevezett láb alacsony és megint beírod a szünet idejét. Ez a megoldás is tekinthető háttérnek, mert 21500 utasításonként átlagosan 10-20 utasításidőt használ el. Ennyi jutott eszembe. Üdv.: foxi
Nekem amugy mindegy, hogy otthon ki mit csinal ameddig az kozerkolcsot nem sert De gondolj bele, hogy ha dokumentalatlan valami, akkor lehet most meg erted mit csinalsz, de lehet 10 ev mulva mar nem fog beugrani, mert mit tudom en, a 256 bites mikrokontrollerekkel fogsz foglalkoznies ott minden maskepp van, es hidd el az agy hamar megtanul ujakat, de ehhez ki kell spornie a regi dolgokat. Anno aktivan programoztam a 6502-t, kicst assemblyztem PDP-11-en is, majd ugye a 80x86 (az mai napig napi szinten), aztan M68k kovetkezett, foglalkoznom kellett meg IA64-el is es akkor a PIC-ek meg AVR-eket meg meg sem emlitettem. Tul sok dolog... es bizony nem ugrik be mindig, hogy ezt vagy azt miert ugy csinaltam ahogy.
Pl most leirod '1B' es akkor majd emlekezhetsz, hogy ja, anno a menubol atallitottad a projecthez a radixot es igy az nem 0x1B hanem 0x01 valojaban... Es valamiert majd az uj MPLAB nem veszi be a regi project file-t es ujra letrehozod, elfelejted beallitani a radixot a menubol, es a project hiba nelkul lefordul... csak nem erted egy darabig miert nem azt csinalja amit kellene. De mint mondottam volt, nekem mindegy
Hali
Pontosan nem ertem a problemat, de probalom elmagyarazni a lenyeget. A PR2 regiszter fogja meghatarozni, hogy a TMR2 meddig szamoljon. Ebbol es a TMR2 eloosztojabol meghatarozhato a PWM frekije. A CCPR1L be es a CCP1CON 4-5 bitjebe irod be a duty erteket. A PWM kimeneted addig lesz magas amig a duty nagyobb, mint a TMR2 erteke. Utana alacsony lesz, es addig szamol, amig el nem eri a PR2 erteket. Akkor nullazodik, atirja a duty erteket a CCPR1H-ba es ujra kezdodik a jatek. Viszont ilyenkor meg bonuszkent bebillenti a TMRIF bitet is. Na ilyenkor tudsz uj duty erteket betolteni az elobb emlitett regiszterbe. Figyelni kell, hogy a CCPR1L ertek ne legyen nagyobb mint a PR2, mert akkor nem tud dolgozni a PWM egyseg. Ja a PR2 8 bites, tehat abba nehez 255-nel nagyobb szamot beleirni. Meg annyi, hogy a 18F2431, 4431 rendelkezik Power PWM modullal, es a PTPER regiszter 12 bites. Ott szabadabban lehet garazdalkodni a PWM frekivel es a kitoltessel.
Szia!
Szitko nak nem a pwm-mel van a baja, hanem a pwm periódus idejével ami 1/50 másodperc.
Model/robot szervot CCP modullal meghajtani nem celszeru, hiszen a kitoltesi tenyezo mindig 0.5-1% kozott van. Emiatt ugye a teljes felbontasnak csak egy reszet hasznalhatd ki eleg szuk keretek koztt. Pl van egy 10 bites felbontasod, ugye az 1024 (0-1023) felbontast jelent a teljes tartomanyban, azaz 20ms-ben. Ezazt jelenti, hogy 1ms-re mindossze 51 lepeskoz jut (ugye a szervonal 1ms az egyik, 2ms a masik vegkiteres, ketto kozt 1ms elteres van).
Emiatt nem CCP modullal, hanem szoftveresen szoktak megoldani a kerdest, es akkor valaszthatsz, hogy timer interrupttal, sima ido vesztegetessel avagy a ketto kombinaciojaval szeretned-e megoldani a feladatot. Mindegyiknek van elonye is, hatranya is.
Köszönöm szépen a kimerítő válaszokat mindenkinek. Amúgy elfelejtettem írni, hogy PIC16.ról van szó.
Akkor valószínü megoldom a timer megszakítással, persze azt még nem látom át annyira mint a PWM modult. Egy pár oldallal ezelötti problémámhoz kellet volna a szervó vezérlés, ahol egy ultrahang modul meghajtásán dolgoztam, ami sikeresen megoldodott, de sajnos nem úgy ahogy azt pl. Watt ajánlotta (nem tudom megérteni a CCP capture módját) , de sajnos az uh modul figyelése eléggé lefoglalja a PIC-et ezért gondoltam a PWM modul használatára a szervóhoz. Mégegyszer köszi mindenkinek. Idézet: „nem tudom megérteni a CCP capture módját” A főprogramban: - Elindítod a Timer1-et - Beállítod a CCP modult Input Capture módba, s hogy felfutó élre legyen érzékeny - Nullázol egy változót, ez lesz a szemafor - Triggereled az ultrahangos szenzort - Várakozol addig, amíg a szemafor 1 nem lesz. Közben azt csinálsz, amit akarsz. - Ha a szemafor 1-be állt, akkor a delta változó megadja az impulzusszélességet. Ezzel azt kezdesz, amit akarsz Interrupt szinten: - Ha a CCP modul megszakítást okozott, és a felfutó élre volt érzékenyítve, akkor Timer1-et kiolvasod és t1-ben eltárolod. A CCP modult lefutó élre érzékenyíted. - Ha a CCP modul megszakítást okozott, és a lefutó élre volt érzékenyítve, akkor Timer1-et kiolvasod és t2-be rakod. Kiszámolod a szélességet: delta = t2 -t1, és '1'-be állítod a szemafort. - Bármelyik fenti eset után törlöd a CCP megszakításjelzőjét. A gyakorlatban ezt még annyival kell komplikálni, hogy az esetleges Timer1 túlcsordulásokat is le kell kezelni, ill. egy változóban számlálni kell, s a leszámlált túlcsordulásoknak megfelelő időt is hozzá kell adni a delta időhöz. Ez így minimális terhelést jelent a CPU számára.
Kösz szépen, így már kezd érthetőbb lenni. Megfogadtam a tanácsod és nem egy bizonyos értéket figyelek hanem, tol-ig értéket.A csatolt fájlt leszimuláltam, debuggoltam, próbapanelen összedobtam és megy rendessen. (Ez már nekem egy órjási sikerélmény, hogy nem példákból, hanem magamtól készült a szoftver.) Amúgy ezt az oldalt tanulmányozom folyamatossan és az ott leírt példa alapján próbálgattam a Capture üzemet, kevés sikerrel.
|
Bejelentkezés
Hirdetés |