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   10 / 55
(#) gyengus hozzászólása Máj 18, 2009 /
 
Sziasztok!

Kipróbáltam a 2.4-es Microchip USB Frameworkben lévő USB Device - CDC - Serial Emulator-t PIC18F14K50-el.
Az USB bekötését a PIC18F4550 minimális usb kapcsolási rajzról másoltam.
Az átalakító működik, a sebességet átállítottam 57600 bps-re.
Viszont megnézve a Low Pin Count USB Development Kit Users Guide-ban a kapcsolási rajzot, látok néhány ellenállást amit én kihagytam. A mellékelt képen pirossal bejelöltem.
Ezekre akkor nincs szükség?
A szintillesztőm MAX232CPE és csak az RX és TX vonalak vannak bekötve.

Jelenleg próbapanelon van összekötve, de ha így jó, akkor bedobozolom.

kimaradt.jpg
    
(#) icserny válasza gyengus hozzászólására (») Máj 18, 2009 /
 
Van egy olyan sejtésem, hogy a "bolondbiztos" kapcsolásokba azért terveznek be soros áramkorlátozó ellenállásokat, hogy a helytelen programozás következtében esetleg szembekapcsolódó kimenetek ne nyírják ki egymást.
(#) gyengus válasza icserny hozzászólására (») Máj 18, 2009 /
 
Köszönöm szépen a választ!
Inkább nem spórolom ki ezt a néhány ellenállást.
(#) watt válasza gyengus hozzászólására (») Máj 18, 2009 /
 
De ha véletlenül nem működne, akkor azokat vedd ki legelőször. Én egyébként 150..270 ohm között tennék oda, illetve semilyet.
(#) gyengus válasza watt hozzászólására (») Máj 18, 2009 /
 
Köszönöm a választ!
Működik a rajzon feltüntetett értékekkel.

Ezen a PICen a D+ és az ICSPDAT ill. a D- és az ICSPCLK lábak közösek. Eddig nem mertem úgy USB-re kötni, hogy rajta volt a Pickit2. Nem is szabad ilyen formában? Szükséges valamilyen leválasztás?
Féltem a gépet és az USB portját.
(#) potyo válasza gyengus hozzászólására (») Máj 18, 2009 /
 
Na igen, ezt nem értem, microchipnél hogy gondolták ezt, hogy ugyanoda teszik a két csatlakozást. Én is agyaltam már rajta, hogyan lehetne ezt üzembiztosan csinálni, de igazából nem sikerült semmi megoldást találnom. Talán az analóg kapcsolókkal (74HC4066) lehetne a legbiztosabban leválasztani az USB portról a chipet, és a programozás idejére összekötni a Pickit2-vel, vagy inkább itt kellene a bootloadert használni... De én is kíváncsi vagyok mások véleményére.
(#) gyengus válasza potyo hozzászólására (») Máj 18, 2009 /
 
Köszönöm a választ.
Nem próbálkozok, inkább felváltva csatlakoztatom az USB-re és a Pickit2-re, vagy marad a bootloader .
(#) szilva válasza potyo hozzászólására (») Máj 18, 2009 /
 
Ha tényleg ilyen eszetlenül van kialakítva a bekötés, akkor a fejlesztői panelre egy kétáramkörös "beakadós" nyomógombot tennék inkább (bontani az USB adatvonalakat, amíg programletöltés folyik). Az USB kommunikációba szerintem nem lenne szabad a rádugott, de inaktív PICkit2-nek bekavarnia, viszont a programozáskor az USB 3.3V-os vonalait "nem illik" 5V-os logikai jelekkel birizgálni.

Apropó: nemrég összeraktam egy AVR-es kütyüt, amiben szoftveres (bitbanging) USB firmware két portbiten kommunikál (low speed) USB-n. Az asztali gépen rendben működött, a laptopon fel sem ismerte az eszközt. Más AVR-es, hasonló cuccok mentek rendben. Kis kínlódás után kiderült, hogy az 5V-os USB adatvonalakat a laptop nem szerette, egyszerűen nem vette a küldött adatokat. Rátettem két 3.6V-os zenert az adatvonalakra és azóta minden jó. Tudni kell, hogy az AVR-es USB-knél a két portbiten van két soros 68 ohm-os ellenállás, és ajánlás szerint az USB csati felőli oldalon 3.6V-os zenerek. Ebben az áramkörben kispórolták a zenereket. Általában működik is, de mint ahogy látjuk, nem mindig... Szóval itt megtanultam, hogy illik figyelni az USB adatvonalak jelszintjére!
(#) szilva válasza gyengus hozzászólására (») Máj 18, 2009 /
 
Fejlesztés esetén, amikor viszonylag sűrűn változtatod a firmware-t ez egyrészt kényelmetlen is, másrészt a csatlakozók sem erre vannak kitalálva sajnos. Ha van más mód, én inkább elkerülném a dugdosást.
(#) potyo válasza szilva hozzászólására (») Máj 18, 2009 /
 
Múltkor olvastam olyat, hogy ezek a 1xK50 jelzésű chipek nem fejlesztésre vannak kitalálva, hanem olcsó sorozatgyártásra, ezért nincs is beépített debug lehetőség. Tehát úgy gondolták a gyárban, hogy majd fejlesztesz valamelyik xy5z chipen, ahol x legalább kettő, a már letesztelt, kész kódot csak lefordítod 1xK50-re, és sorozatban égeted, majd rakod be a kész áramkörbe és dobozolod.
(#) gyengus válasza szilva hozzászólására (») Máj 18, 2009 /
 
Van a PICben bootloader.

Ezt annyira nem nevezném fejlesztésnek :
Csak egy kicsit módosítottam a Microchip demoján:
Felvittem a sebességet 57,6kbps-re és kiszedtem a LEDek villogtatását.
A bootloadert is módosítottam picit:
Engedélyeztem az MCLR-t és tettem be egy boot gombot.

Amúgy bootloadert szoktam használni USB-s PIC esetén.
(#) szilva válasza potyo hozzászólására (») Máj 18, 2009 /
 
Ez hihető magyarázat (ha jól emlékszem a flash endurance is elég kicsi szám ezeknél a PIC-eknél), ettől függetlenül nem biztos, hogy a portolásnál elég a chip típusát átírnod fordítás előtt, tehát minimális fejlesztési lehetőségekre azért szükség lehet. A fejlesztői környezetben szerintem mindenképpen célszerű valami olyat kitalálni, ami szükségtelenné teszi a csatlakozók ki-be dugdosását.
(#) gyengus válasza szilva hozzászólására (») Máj 18, 2009 /
 
A programmemóriát ezerszer, míg az EEPROM-ot 100 000-szer lehet újraírni.
Hobbi célra elég lehet. Én úgy szoktam, hogy ha valamelyiket fejlesztésre használom, azt hagyom a kész áramkörben.
(#) Seclusion hozzászólása Máj 22, 2009 /
 
Sziasztok!

Olyan kérdésem lenne, ha USB eszközként használom a PIC-et (akár HID, akár CDC), mindenféleképpen belefutok abba, hogy kikapcsolja a megszakításokat?
Egy olyan eszközt akarok csinálni, melyre a működéséhez szükséges adatokat USB-n keresztül töltöm fel, de ezek az értékek bármikor változhatnak, tehát fixre nem építhetem bele a programba.
Viszont a megszakításokra szükségem van, és már egy alap USB-s programnál is kiírja a PIC C, hogy kikapcsolja a megszakításokat. (Interrupts disabled during call to prevent re-entrancy: (usb_token_reset))
Ilyenkor mit tudok tenni?
(#) potyo válasza Seclusion hozzászólására (») Máj 22, 2009 /
 
Valami bővebbet írják, hogy miért is lenne szükséged a megszakításokra, mert a feladatok nagy része valódi megszakítás nélkül is megoldható, elég ha csak a főprogram végtelen ciklusából figyeljük a megszakításjelző flageket.
(#) watt válasza Seclusion hozzászólására (») Máj 22, 2009 /
 
Milyen C-ben programozol? Mert nekem nem írta ki ezt az MCC18-ban. Jelenleg is megszakítást haszálok magára az USB pollingra is(CDC).
(#) icserny válasza watt hozzászólására (») Máj 22, 2009 /
 
Idézet:
„Jelenleg is megszakítást haszálok magára az USB pollingra is(CDC).”

Hű, pont ilyen kellene nekem is! A CDC demót módosítottad? Beavatnál a részletekbe?
(#) potyo válasza icserny hozzászólására (») Máj 22, 2009 /
 
Mintha a legújabb microchip usb csomagban már lenne HID és CDC is megszakításból használva. Én is csináltam régebben egy ilyen módosítottat az 1.3-as csomagból, valahol ebben a témában be is linkeltem úgy emlékszem, de az biztos, hogy több terhelést jelentett az enyém a processzorra nézve, mint a pollingos módszer. Persze lehetett volna rajta optimalizálni, de én csak azt akartam megnézni, hogy működik-e, és tovább nem csináltam vele semmit.
(#) Seclusion hozzászólása Máj 22, 2009 /
 
Gyújtásszögvezérlőt csinálok, a megszakítások a timerek miatt kellenek, meg a holtpontjelzés miatt.
Van 3 megszakítás az EXT, ami a jeladótól jön - a holtpont figyelés, van egy timer ami bekapcsolja a trafó töltését/megszakítja a trafó töltését, és van egy timer, ami reseteli a munkaállapotot (túl sokáig nincs jel, akkor leállt a motor, nem töltünk, nem számlálunk)
Szerintem ezek mindenképp kellenek. :/

Szerkesztve: PICC-t használok
(#) icserny válasza potyo hozzászólására (») Máj 22, 2009 /
 
Idézet:
„Én is csináltam régebben egy ilyen módosítottat az 1.3-as csomagból, valahol ebben a témában be is linkeltem úgy emlékszem”
Itt találtam egy csomagot. Köszönöm!

Ez egyébként 1.2 verziónak mondja magát...
(#) watt válasza icserny hozzászólására (») Máj 22, 2009 /
 
A Timer0 high megszakítást okoz, kevesebb mint 1ms-onként. A lekezelés a következő:
  1. //USB <-> Timer0
  2.         if(INTCONbits.TMR0IF && INTCONbits.TMR0IE)
  3.         {
  4.                 Timer0_Count++; //Számláló növelése
  5.                 if (Timer0_Count==5859/2)
  6.                 {
  7.                         Timer0_Count=0;
  8.                 } //End if
  9.                 USBTasks();
  10.                 INTCONbits.TMR0IF=0;
  11.         } //End if INTCONbits.TMR0IF


A main-ban pedig van egy főciklus:
  1. while(True)
  2.     {
  3.         if(!(usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1))
  4.         {
  5.                 User_Process(); // USB és más processzek..
  6.             }//End if
  7.         USART_Controll();    //Egyéb soros vonali teendők kezelése
  8.     }//end while


A User_Process és a USART_Controll a user.c fájlban van.
Az USART_Controll nálam egy RS485 hálózatot jelent, de helyette nyílván bármilyen az USB-től független folyamatok lehetnek.
Ja igen a Timer0_Count itt nem érdekes, máshol használom...
(#) watt válasza potyo hozzászólására (») Máj 22, 2009 /
 
Igen, a terhelés több, de nem történhet meg, hogy egy megszakítás lekezelése miatt nem biztosított a válasz a PC pollingjára. Én se csináltam volna így, ha nem lett volna gondom pl. amikor egy USART megszakítás jött.
(#) icserny válasza watt hozzászólására (») Máj 22, 2009 /
 
Köszönöm az információt! Ez így egyszerűnek látszik.
A főprogram ciklusa már ismerős, s pont ez volt a célom, hogy az USBTasks() kikerüljön onnan, hogy a főprogramban ne legyen időkritikus tevékenység.

Egy egyszerű parancsértelmezőt szeretnék a User_Process() helyére tenni, ami a PC-ről jövő utasítások szerint tevékenykedne (impulzusszámlálás, DAC vezérel tápegységek beállítása, feszültségmérés, miegyéb). Az adatokat meg külön parancsra átadná a PC-nek.

(#) watt válasza icserny hozzászólására (») Máj 22, 2009 /
 
Nincs mit! Én is pont ilyen formán használom.
(#) qwer85 hozzászólása Jún 1, 2009 /
 
Üdv!

Van valakinek tapasztalata PIC USB+SPI kombóval?
Mert a kettő külön-külön frankón működik, de ha "összerakom" a kódot a PIC-be akkor sem az USB sem az SPI nem megy. Egyik sem megszakításos, hanem 'simán' végtelen ciklusba futnak.
Ja még annyi, hogy 18F14K50 mplab c18 fordító, és hardveres SPI. (az USB és az SPI is a példaprogram alapján )

Köszi
(#) watt válasza qwer85 hozzászólására (») Jún 1, 2009 /
 
Idézet:
„Egyik sem megszakításos, hanem 'simán' végtelen ciklusba futnak.”

Pont ez az ok.
(#) qwer85 válasza watt hozzászólására (») Jún 1, 2009 /
 
  1. while(1)
  2.     {
  3.         // Check bus status and service USB interrupts.
  4.         USBDeviceTasks();
  5.         ProcessIO();
  6.         curr_pos=ControlSPI(curr_pos);
  7.     }//end while


Akkor ezek közül valamelyiknek vagy mindkettőnek interrupt-al kellene működnie?

Egyébként lehet hogy az SPI annyira visszafogja, hogy nem tud 100mikrosec-enként lefutni az USBDeviceTasks();? Csak 2 bájtot küld ki az SPI
(#) watt válasza qwer85 hozzászólására (») Jún 1, 2009 /
 
Az USB igényli, hogy 1ms-enként választ kapjon a pollingjára. Ezt megszakításban meg lehet oldani. Nemrég volt erről szó, olvass vissza pár oldalt.

Az SPI nem ennyire időkritikus.
(#) potyo válasza qwer85 hozzászólására (») Jún 1, 2009 /
 
Idézet:
„Akkor ezek közül valamelyiknek vagy mindkettőnek interrupt-al kellene működnie?”


Nem muszáj egyiknek sem, csak nem szabad, hogy az SPI-s rutin hosszú ideig fusson, és lefogja a processzort. Jó lenne ismerni a ControlSPI() függvényt belülről, de szerintem jobban járnál, ha kézzel beállítanád az SPI reigsztereket, és figyelnéd a while(1) ciklusban a megszakításjelző flagjének a bebillenését (SSPIF vagy valami ilyesmi), ha bejövő adatra vársz. Bár ha a kontroller a master, akkor végülis nem kell adatra várni, előre ismert idő alatt jön be az adat. Szóval szerintem az a ControlSPI() csinál valami galibát...
(#) qwer85 válasza potyo hozzászólására (») Jún 1, 2009 /
 
  1. int ControlSPI(int curr_pos)
  2. {
  3.                 int val;
  4.                 int x;
  5.                 //xInitPOT();
  6.                 val =0;// xReadPOT();
  7.                 x=(int)(fabs((float)(val-curr_pos)));
  8.                
  9.                 TRISCbits.TRISC4 = 0;
  10.                 TRISCbits.TRISC5 = 0;
  11.  
  12.                 OpenSPI(SPI_FOSC_4, MODE_00, SMPMID);                  
  13.                 SPI_SS_0         = 0;                                                          
  14.                 putcSPI(val);                                                          
  15.                 Delay10KTCYx( 1 );                                                     
  16.                 SPI_SS_0 = 1;                                                          
  17.                
  18.                 SPI_SS_1 = 0;
  19.                 Delay10KTCYx( 1 );
  20.                 if(val-curr_pos>=0)
  21.                 {
  22.                         putcSPI(0x10);
  23.                 }
  24.                 else
  25.                 if(val-curr_pos<=0)
  26.                 {
  27.                         putcSPI(0x11);
  28.                 }
  29.                 Delay10KTCYx( 1 );
  30.                 putcSPI(x);
  31.                 Delay10KTCYx( 1 );
  32.                 SPI_SS_1 = 1;
  33.  
  34.                 CloseSPI();                                                                            
  35.                 Delay10KTCYx( 1 );
  36.  
  37.                 curr_pos=val;
  38.                 return curr_pos;
  39. }


x=(int)(fabs((float)(val-curr_pos))); tudom, tudom ez jól lelassítja de enélkül is 'megakad'
Egyébként visszább olvasva, valaki írta hogy teliszórta USBTask() metódussal az egész kódját, na énis megtettem (a kódot nem másolom be mert undorító lett ) de most legalább működik igaz a státuszledek villogása a 100-ad részére lassult
Következő: »»   10 / 55
Bejelentkezés

Belépés

Hirdetés
XDT.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