Fórum témák

» Több friss téma
Fórum » PIC - USB - PC projekt
 
Témaindító: JohnyBravo, idő: Szept 26, 2006
Lapozás: OK   24 / 55
(#) pagaby válasza icserny hozzászólására (») Júl 30, 2010 /
 
Aha! Régi volt a Linker verziója.
(A PIC18F4550-el is ugyanaz volt a helyzet mint a PIC14K50-el.)
(#) pagaby hozzászólása Aug 2, 2010 /
 
Hali!

Megint fordítási proplémám van.
A PICCOLO USB-s projektei közül azokat nem tudom lefordítani amelyekbem a PIC18F14K50 az alkalmazott mikrovezérlő.

Mindegyikre az alábbi hibaüzenetet kapom:
MPLINK 4.35, Linker
Copyright (c) 1998-2010 Microchip Technology Inc.
Error - section 'USB_BDT' can not fit the absolute section. Section 'USB_BDT' start=0x00000400, length=0x00000050
Errors : 1


A PIC18F4550-el semmi gond.
(#) icserny válasza pagaby hozzászólására (») Aug 2, 2010 /
 
Idézet:
„Error - section 'USB_BDT' can not fit the absolute section. Section 'USB_BDT' start=0x00000400”

Ezt hogy csináltad?! Nálam a Microchip/USB/usb_device.c állományban ez áll:
  1. /** USB FIXED LOCATION VARIABLES ***********************************/
  2. #if defined(__18CXX)
  3.     #if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50)
  4.         #pragma udata USB_BDT=0x200     //See Linker Script, usb2:0x200-0x2FF(256-byte)
  5.     #else
  6.         #pragma udata USB_BDT=0x400     //See Linker Script, usb4:0x400-0x4FF(256-byte)
  7.     #endif
  8. #endif

Tehát ha a PIC18F14K50 mikrovezérlő van kiválasztva (Configure/Select Device), akkor USB_BDT a 0x200 címen kezdődik. Ez már csak azért is egészséges, mert a szerencsétlennek 0x0400 címen már nincs is RAM-ja, így érthető, hogy nem fér bele 0x50 db. bájt.
(#) pagaby válasza icserny hozzászólására (») Aug 2, 2010 /
 
Megvan a hiba, fordul gond nélkül, csak nem értem az okát. Ehhez a fájlhoz hozzá se nyúltam.
Nálam így nézett ki ez a programrészlet:

/** USB FIXED LOCATION VARIABLES ***********************************/
#if defined(__18CXX)
#if defined(_18F14K50) || defined(_18F13K50) || defined(_18LF14K50) || defined(_18LF13K50)
#pragma udata USB_BDT=0x200 //See Linker Script, usb2:0x200-0x2FF(256-byte)
#else
#pragma udata USB_BDT=0x400 //See Linker Script, usb4:0x400-0x4FF(256-byte)
#endif
#endif


A biztonság kedvéért letöltöttem a PICCOLO oldaláról a legfrissebb (tutibiztos általam érintetlen) code_examples-t.
(#) icserny válasza pagaby hozzászólására (») Aug 2, 2010 /
 
Szerintem az MPLAB hülyesége lehetett az oka! Ha pl. nem léptél ki az MPLAB-ból, és Project/Opennel nyitottad meg a PIC18F4550-es projekt után a PIC18F14K50 projektet, előfordul, hogy a Configure/Select Device menüben "beragad" a PIC18F4550, hiába van benne a megnyitott projectben a device=PIC18F14K50 sor.

Nálam bevált módszer az, hogy projektváltáskor kilépek az MPLAB-ból, s a következő projektre duplán kattintva nyitom meg azt, nem pedig az MPLAB-ból.

U.i.: a kódrészletet egyáltalán nem azért mutattam, mintha hozzányúltál volna, hanem azért, mert abból derült ki egyértelműen, hogy a hibás fordításkor valamiért nem a PIC18F14K50 volt kiválasztva, mert akkor nem 0x400 lett volna a változóblokk címe.
(#) icserny válasza icserny hozzászólására (») Aug 2, 2010 /
 
Az "érdekes" viselkedés MPLAB 8.41-gyel is reprodukálható: ha megnyitom pl. az USB fejezetben hello-int-4550.mcp projektet, majd Projekt/Close menuben bezárom, s megnyitom Projekt/Open-nel a hello-int-14k50.mcp projektet, akkor a Configure/Select Device azt mutatja, hogy továbbra is a PIC18F4550 van kiválasztva, ami nyilvánvalóan akadálya a sikeres fordításnak.
(#) pagaby hozzászólása Aug 2, 2010 /
 
Én azért az MPLAB-tól egy kicsit megbízhatóbb működést várnék el.

Időközben elkészítettem a PIC18F14K50-el a gyakorlópanelem. Alapul a Microchip "Low Pin Count USB Development Kit"-et vettem. Eléggé leegyszerűsítettem, tápellátása csak USB-ről történik. A PORTA kivételével az összes I/O láb jumperekre van kivezetve. A jumperekre végülis "bármit" rá lehet dugni. Gyakorlásra nekem tökéletes.


(Csak az a baj, hogy a munka meg a tanulás mellett egyre kevesebb időm van vele foglalkozni.)
(#) mps hozzászólása Aug 5, 2010 /
 
Sziasztok!
Végigolvastam Gory cikkét, és neki álltam kipróbálni. A gondom az, ha a feltöltöm a picbe a fw-t. akkor nem történik semmi, a bootloader az megy, ha bekepcsolom. Jól gondolom, hogy meg kellene jelenni az eszközkezelőben egy com portnak? Ha a soros emulátort teszem a picbe, működik.
Mit nézek át? Mi az, ami ilyenkor hiba lehet? Gondolom az áramkörrel nem lehet gond, mert akkor más usb-s progi sem működne.
Előre is köszi a segítséget!
(#) icserny válasza mps hozzászólására (») Aug 6, 2010 / 1
 
Idézet:
„Jól gondolom, hogy meg kellene jelenni az eszközkezelőben egy com portnak?”
Igen.

Idézet:
„Gondolom az áramkörrel nem lehet gond, mert akkor más usb-s progi sem működne.”
Ezt úgy érted, hogy ugyanezen az áramkörön korábban már sikeresen futtattál USB-t használó programot (pl. gyári demót)? Ha igen, akkor az áramkörrel tényleg nem kellene gondnak lennie...

A kipróbálandó alkalmazás lefordításánál arra kell ügyelni, hogy a megfelelő linker scripttel történjen a fordítás. Néha kavarodást okoz, hogy a PIC18F4550-hez kétféle bootloader is van, s ezek mérete különböző, ezért nem ugyanoda kerülnek a reset és interrupt vektorok. Az MCHPFSUSB bootloadernél 0x0800,0x808, 0x0818, a HID bootloadernél pedig 0x1000, 0x1008, 0x1018 a vektorok címe.

Én a .map fájl elején szoktam ellenőrizni hogy hova kerültek a linkelés után.

Megjegyzés: A Gory cikkében bemutatott ábrával ellentétben a 11, 12 lábakat (Vdd, Vss) is be kell kötni, és egy 100 nF-os kondi is kell közéjük!
(#) mps válasza icserny hozzászólására (») Aug 6, 2010 /
 
Köszönöm a segítséget!
A bootloaderekel volt a kavarodás. Kiexportálva és beégetve már ment, igaz az a/d része nem, de ezen majd szórakozok, ha nem megy, még biztos kérdezek.
(#) icserny válasza mps hozzászólására (») Aug 6, 2010 /
 
A PIC18F4550-ről azt kell tudni, hogy az analóg bemenetek csak az AN0-tól indulva engedélyezhetők (szemben pl. a PIC18F14K50-nel, ahol az egyes analóg csatornák függetlenül engedélyezhetők/tilthatók).

Az AN0-ra kötött potméterhez az AN0 csatorna így inicializálható (ezt rakd be a hardver profilba):
  1. #define mInitPOT()          {TRISAbits.TRISA0=1;    \
  2.                                  ADCON0=0x01;           \
  3.                                  ADCON2=0x3C;           \
  4.                                  ADCON2bits.ADFM = 1;}  // POT on RA0


A főprogram elején egyszer meg kell hívni mInitPOT()-ot.

A mérés és kiolvasás pedig ennyi:
  1. unsigned int ReadPOT(void)
  2. {
  3.   unsigned int w;
  4.   mInitPOT();
  5.   ADCON0bits.GO = 1;              // Start AD conversion
  6.   while (ADCON0bits.NOT_DONE);    // Wait for conversion
  7.   w = ADRESH;
  8.   w = (w<<8) + ADRESL;
  9.   return w;
  10. }//end ReadPOT


Nézd meg a PICCOLO projekt-et is, abban is támogatott a PIC18F4550 mikrovezérlő. Az általam bevezetett usb_cdc_putc(), outString(), out4hex() és outdec() függvényekkel (szerintem) lényegesen egyszerűbb a kiíratás, mint a gyártó eredeti függvényeivel, státuszgépes kínlódásokkal.

Megoldottam a printf() egyszerű használatát is, csak nem szeretem használni, mert a PIC18F14K50-nek hamar teleköpi a memóriáját.

Megjegyzés: Arra vigyázz, hogy nálam a HID bootloader az alapértelmezett, s ha a MCHPFSUSB bootloadert használod, akkor a piccolo_config.h állományban és az összes projektben (a linker opciók között) át kell állítani: HID_BOOTLOADER helyett az MCHPUSB_BOOTLOADER szimbólumot kell definiálni. A kísérleti áramkör c. fejezetet nézd meg ezzel kapcsolatban.
(#) mps válasza icserny hozzászólására (») Aug 6, 2010 /
 
Már olvastam az oldalad. Csak valamiért nem akart lefordulni nekem semmi. Gondolom, könyvtár, elérési út gondok lesznek. Este neki fekszek annak, most ezzel volt "sikerélmény", adott az energia. HID bootloader van fenn, azért is úgy csináltam, hogy export, és pk2.-vel beégetve.
Köszi mindent, de még biztosan lesznek kérdéseim, és gondolom egy darabig egyre több
(#) icserny válasza mps hozzászólására (») Aug 6, 2010 /
 
Idézet:
„Gondolom, könyvtár, elérési út gondok lesznek.”
Ha belenézel egy .mcp állományba, akkor abból kiderül, hogy nálam a C:/Program Files/Microchip/MCC18 könyvtárban lakik a C18 fordító. Vagy telepítsd ide te is, vagy pedig szerkeszd át az .mcp fájlokat (keresés/csere). Akár a Notepad.exe is megteszi...

Megjegyzés: a fórummotor háklija miatt backslash helyett sima "per" jelet kellett írnom.
(#) mps válasza icserny hozzászólására (») Aug 6, 2010 /
 
Áttelepítettem, de nem fordul. Amit kiír a mellékletben van. A forrás az asztalra van téve, még azt megpróbálom átrakni valami rövidebb helyre.

hiba.txt
    
(#) mps válasza mps hozzászólására (») Aug 6, 2010 /
 
Átraktam a forrást (PIC18 teljes mappa) a c, és d gyökérbe is, ugyanez az üzenet, és egyszer véletlenül a 14k50-est nyitottam meg, és ha már megnyitottam akkor kipróbáltam, ez volt a reakció: "Unknown processor '18F14K50'", ez a proci volt kiválasztva a select device-ban.
(#) pipi válasza mps hozzászólására (») Aug 6, 2010 /
 
pedig a hibaüziben -p=18F4550 van...
biztos jók a proci/include/lkr megadások? ha igen
lépj ki az mplabból, újra nyisd meg a projektedet, időnként állítólag meghülyül ha a projektet vált az ember kilépés nélkül
(#) mps válasza pipi hozzászólására (») Aug 6, 2010 /
 
Ezt a "hülyülést" tapasztaltam én is. Ezért mindig kilépek, és duplakatt az .mcp-n. Ez amit a piccoló honlapról letöltöttem forrás, nem nyúltam semmihez. De azért újra letöltöm, sohasem lehessen tudni aztatat az ámítástechikában...
(#) icserny válasza mps hozzászólására (») Aug 6, 2010 / 1
 
Idézet:
„MPLINK 4.1, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - Unrecognized input in '..\common\PIC18f4550.lkr:5': #IFDEF”
A jelek szerint a Linker állományban használt feltételes elágazásokat "nem érti" az MPLINK program. A verziószámból és a 2006-os dátumból ítélve egy kicsit elavult...

Én sem a legfrissebb verziót használom, mert 2008-as kiadású MPLAB 8.15 és a hozzá illő (vele egykorú) fordítók vannak fenn. Ebben 4.22-es verziójú MPLINK fut. Ennél újabb verziókkal lehet próbálkozni, de régebbiekkel nem kellene...
(#) mps válasza icserny hozzászólására (») Aug 6, 2010 /
 
Akkor keresek újabbat. Azt írták, egy másik topicban, hogy a legújabb nem az igazi. Attól érdemes még azt leszedni, vagy keressek egy régebbit, már ha találok?
(#) icserny válasza mps hozzászólására (») Aug 6, 2010 /
 
Próbálkozz a legfrissebb változattal! Mire kiderülnek a hibái, úgyis lesz 2-3 újabb verzió...
(#) mps válasza icserny hozzászólására (») Aug 6, 2010 /
 
OK. Köszi! Ugye a lite változat kell nekem? Mondjuk már elkezdtem letölteni, röpke 25 perc és itt is van.
(#) potyo válasza mps hozzászólására (») Aug 6, 2010 /
 
Inkább a Standard-Eval, de végülis a Lite is megfelel.
(#) mps válasza icserny hozzászólására (») Aug 6, 2010 /
 
Nagyon köszönöm a segítséget mindenkinek!!!
Már fordul!
(#) mps hozzászólása Aug 7, 2010 /
 
Helló!
Új kérdésem van. Próbálok ledeket kapcsolgatni, mivel a panelomon 8db van, ezért nyolcat. Úgy gondoltam, picit módosítom a cdc_demo.c-t. A vett karaktereket bepakolom egy tömbbe, és onnan kiírom a portra. Ez így kb. működik is. Egészen az utolsó karakterig, venni jót vesz, de a tömbbe nem azt teszi. Az egyes helyett nullát, a nulla helyett viszont valami "furát", mellékeltem a képet, és azokat a fájlokat, amiken módosítottam.
Köszönöm a türelmetek!
(#) mps válasza mps hozzászólására (») Aug 7, 2010 /
 
És a kapcsolás, biztos mi biztos.

4550proba.pdf
    
(#) El_Pinyo válasza mps hozzászólására (») Aug 7, 2010 / 1
 
Első körben az biztosan probléma, hogy Te 7 elemű karakter tömböt deklarálsz és ebben a tömbben 8 elemet akarsz eltárolni. Módosítsd a változók deklarálásánál lévő led tömböt erre:
  1. char led[8];
(#) mps válasza El_Pinyo hozzászólására (») Aug 7, 2010 /
 
Megtettem. Működik!
Köszönöm szépen! Ezt, hogy néztem el, kissé szégyellem magam. Na jó, a kissé nem igaz.
(#) El_Pinyo válasza mps hozzászólására (») Aug 7, 2010 /
 
Megesik az ilyen baleset, a lényeg az, hogy megjavult.
Szégyenkezni nem kell, általában az ilyen bagatell hibákat a legnehezebb kiszúrni, mert az ember nem is számít rá, hogy elrontotta volna.
Sok sikert a továbbiakban!
(#) icserny válasza mps hozzászólására (») Aug 8, 2010 /
 
Egy megjegyzés: A működést valószínűleg nem zavarja, de kicsit zavaró az olvasata a
  1. led[ix] = uc;

sornak. Az uc változó értéke ugyanis nem 1 vagy 0, hanem 49 vagy 48 (az '1' vagy '0' karakter ASCII kódja).

Írd inkább így: led[ix] = (uc & 1);

Egy kérés: Ha módosítod és közreadod a kódot, akkor légy szíves egyértelműen jelezni a kommentekben, hogy ez már egy általad módosított változat - hogy ne legyen belőle kavarodás!

Egy tipp: A program átírása esetén célszerű átnevezni a projektet/forrásfájlt. Talán így a legegyszerűbb:

copy CDC-p18f4550.mcp CDC-mydemo-4550.mcp
copy CDC-demo.c CDC-mydemo.c

Utána a CDC-mydemo-4550.mcp állományt megnyitod a notepad editorral és CDC-demo.c állománynevet átírod CDC-mydemo.c-re.

Utóirat:
  1. for (ix = 0; ix<=7; ix++)


Az ix<=7 helyett én szívesebben írok ix<8-at.
(#) mps válasza icserny hozzászólására (») Aug 8, 2010 /
 
Köszönöm a tanácsokat, megfogadom! Sajnos nem csak az usb-t, de a c-t is csak tanulgatom, és a Te általad közzé tett anyag nagyon tetszik, sok a magyar komment, ezért (is) indulok ki ebből. Valamint az egész cikksorozat, vagy inkább tananyag sokkal érthetőbb mint más amit találtam, köszönet érte!
Ez: "led[ix] = (uc & 1);" mit csinál? És létezik e valami nagyon egyszerű könyv, leírás a c-ről? Találtam jó párat, de mind elég terjengősen ír. Anno a Pascalt, egy olyan könyvből tanultam, amiben szinte csak tőmondatok voltak, felsorolva a típusok, függvények, eljárások, egy két sorban kitárgyalva mi mire való. Sajnos még az angolom sem az igazi, és a fordító programok sokszor félre veztik az embert, ha nem a hétköznapi nyelvről van szó.

És még egy kérdés:jól gondolom, hogy ez a függvény:usb_cdc_getc() mindig egy karaktert olvas ki a bufferből?
Következő: »»   24 / 55
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem