Fórum témák
- • Erősítő mindig és mindig
- • Számítógép hiba, de mi a probléma?
- • Vicces - mókás történetek
- • Frekvenciaváltó
- • Mosogatógép hiba
- • Arduino
- • Vegyes barkácsfogások
- • LED-es világítás
- • Műhelyünk felszerelése, szerszámai
- • Erősítő építése elejétől a végéig
- • Érdekességek
- • Eredményjelző
- • Hűtőgép probléma
- • Sütő javítás
- • PC hűtés fordulatszám szabályzott ventilátorral
- • LCD TV probléma
- • RC távirányítás modellekhez
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Inverteres hegesztőtrafó
- • Biciklilámpa / bringalámpa
- • Elektromos kerékpár akkumulátorának helyettesítése
- • Audiofil, High End Audio
- • Analóg oszcilloszkóp javítása
- • Házilag építhető fémkereső
- • Fejhallgató erősítő
- • Ultrahangos párásító
- • Elektronikai témájú könyvek újságok
- • Akkumulátoros fúró
- • Vásárlás, hol kapható?
- • Retro számítógépek
- • Tranzisztor teszter
- • Tranzisztorok helyettesítése
- • BEKO Mosó/Szárító gép
- • Vezeték nélküli hangátvitel
- • Muzeális készülékek-alkatrészek restaurálása
- • Mobiltelefon hiba
- • Li-Ion saját akkucsomag készítése
- • FOK-GYEM TR9178 tápegység
- • Háromfázisú aggregátor
- • Autós erősítős kérdések, problémák
- • Távirányító javítás
- • VF3 - 6 végerősítő
- • Lemezjátszó beállítása, javítása
- • Padlófűtés vezérlés
- • Számítógépes áramkörszimuláló programok
- • Videoton EA-7386-s erösítő
- • Kombikazán működési hiba
- • Felajánlás, azaz ingyen elvihető
- • Suzuki Swift elektronika
- • Páraérzékelő szenzor
- • VIDEOTON RT (RA) 6380S
- • Nextion érintőképernyős HMI, UART kommunikációval
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Alternativ HE találkozó(k)
- • GPS GSM modulok programozása
» Több friss téma
|
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Szia!
Annyi volt csak a gond, hogy miután elküldtem az ACK-t utánna kellett egy IdleI2C1 parancs, ami azt hiszem azt jelenti, hogy várakozás amíg befejezi. ugyanez kell a NotACK után is. A működő kód:
void main()
{
SYSTEMConfig(SYS_FREQ, SYS_CFG_ALL); //Inicializalas
init();
while(1)
{
StartI2C1();
IdleI2C1();
MasterWriteI2C1(SLAVE_ADDRESS & 0xFE);
MasterWriteI2C1(0x05);
StartI2C1();
IdleI2C1();
MasterWriteI2C1(SLAVE_ADDRESS | 0x01);
IdleI2C1();
fogadottadat = MasterReadI2C1();
AckI2C1();
IdleI2C1();
fogadottadat2 = MasterReadI2C1();
NotAckI2C1();
IdleI2C1();
StopI2C1();
IdleI2C1();
fogadottadat = fogadottadat & 0x1F; //Clear flag bits
if ((fogadottadat & 0x10) == 0x10){ //TA < 0°C
fogadottadat = fogadottadat & 0x0F; //Clear SIGN
Temperature = 256.0 - ((float)(fogadottadat *16 + fogadottadat2) / 16.0);
}else //TA >= 0°C
Temperature = ( fogadottadat * 16 + (float)fogadottadat2 / 16 ) ;
sprintf(felsosor,"TEMP: %2.2f " ,Temperature);
sprintf(alsosor,"TEMP: %lu " ,fogadottadat2);
LCDWriteString("homerseklet",1,1);
LCDWriteString(felsosor ,2,1);
Köszönöm a segítséged!
Szia!
Azt szeretném megkérdzni, hogy nincs véletlen olyan minta kódod, ami kitesz a kijelzőre: 00:00:00
számokat, ora:perc:mp mondjuk, és megnyomok egy gombot és elkezd számlálni, mint egy stopper.
Ha szükséges bemásolhatom az egész mcp9808-os main kodomat, vagy ha igy jó. akkor oké. A hozzászólás módosítva: Nov 25, 2015
Tiszta! Igaz, köszönöm szépen! Valahogy szétszedem.
Azt szeretném emgkérdezni, hogy milyen programsort kell írjak, hogy az Rtc elkezdjen nekem számlálni. Itt tartok. Köszönöm void main()
{
SYSTEMConfigPerformance(72000000L);
// SYSTEMConfig(SYS_FREQ, SYS_CFG_ALL); //Inicializalas
init();
RtccInit();
while(1)
{
RtccEnable();
while(RtccGetClkStat()!=RTCC_CLK_ON);
RtccOpen(0x10073000, 0x07011602, 0);
rtccTime tm;
tm.sec=0x15; tm.min=0x30; tm.hour=01;
rtccDate dt;
dt.wday=0;dt.mday=0x15;dt.mon=0x10;dt.year=0x07;
RtccSetTimeDate(tm.l, dt.l);
mRTCCSetIntPriority(1);
mRTCCClearIntFlag();
INTEnableSystemSingleVectoredInt();
mRTCCIntEnable(1);
sprintf(felsosor,"%d ", tm);
LCDWriteString(felsosor,1,1);
DelayMS(20);
}
}
A Microchip PIC32MX Peripheral Library / RTCC help szerint csupán ennyi a beindítás:
RtccInit(); // init the RTCC
while(RtccGetClkStat()!=RTCC_CLK_ON); // wait for the SOSC to be actually running
RtccSetTimeDate(0x10073000, 0x07011602); // time is MSb: hour, min, sec, rsvd.
//date is MSb: year, mon, mday, wday.
// please note that the rsvd field has to be 0 in the time field!
Köszönöm a segítséget!
Már csak azt nem tudom hogy hogy jelnítsem meg a kijelzön.
Az idő / dátum adatok az RTC -ben BCD kódolású, így nincs nehéz feladatod. pl az órát úgy tudod kiírni, hogy veszed az RTCTIME regiszter 31..28 bitjeiből (HR10) képzett 4 bites számot, hozzáadsz 0x30 - at (a '0' karakter ASCII kódját) és kiírod az LCD -re. Aztán veszed az RTCTIME regiszter 27..24 bitjeiből (HR01) képzett 4 bites számot, hozzáadsz 0x30 - at (a '0' karakter ASCII kódját) és kiírod az LCD -re. Eljátszod a percre (MIN10 a 23..20 és MIN01 a 19..16 biteken) és a másodpercre (SEC10 a 15..12 és SEC01 a 11..8 biteken). A dátumot teljesen hasontóan lehet kiíratni, az évszázad (sajnos) nincs benne a RTCDATE regiszterben.
Köszönöm!
Megtaláltam a PIC32referenci manueljében. Annyiban még kaphatok egy kis segítségett, hogy hogyan kell parancsokkal végrehajtani a regiszeterbitekből a kivételt.
Köszönöm szépen! A hozzászólás módosítva: Nov 27, 2015
Ha már úgyis a Microchip perifériakönyvtárat használod, ne matasd a regisztereket, hanem használd a könyvtári függvényt!
Deklarációs részbe:
rtccTime tm; // time structure
rtccDate dt; // date structure
Kiolvasás:
// we can read the time and date in a single operation
RtccGetTimeDate(&tm, &dt);
tm.sec, tm.min, tm.hour tartalmazza az időt, dt.mday, dt.mon, dt.year pedig a dátumot. BCD kódolással vannak benne az adatok, az évszázad nincs benne...
Bővebb info: Microchip- PIC32MX-Peripheral-Library.chm RTCC szekciója.
(#) |
SKY hozzászólása |
Nov 28, 2015 |
|
/ |
|
|
Sziasztok!
A 18F4550-ben a PWM1 úgy működik, hogy a PR2 regiszterrel és a TIMER2 előosztóval meghatározom a PWM frekvenciát és utána ettől függetlenül a CCPR1L+CCP1CON 2 bitjével (10bit) szabadon választom a kitöltést 0 és 100 között, ezzel az 1024 lépéssel?
A PR2 a CCPR1L és a CCP1CON regiszter is írható anélkül, hogy kikapcsolnánk előtte a PWM-et?
18F4550 (146. oldal)
Válaszotokat köszönöm!
Igen és nem csak ebben a PIC-ben, a legtöbben így működik.
Szeretném meg tanulni a pic programozási nyelvet valaki tudna nekem küldeni le írást hogy melyik utasítás mire való meg hogy épül fel egy pic-es program.
Idézet: „hogy melyik utasítás mire való meg hogy épül fel egy pic-es program”
Én ebből arra gondolok, hogy assembly nyelvre gondolsz, de nem írtad le pontosan, hogy melyik nyelvre is gondolsz. A piccolo projekt-ben van C és assembly, de ha assembly-ben szeretnél programozni az összes PIC(kivéve a 32 bitesek, ott máshol található) dokumentációjában le van írva az utasítás készlet és hogy mi mit csinál.
De még létezik jó pár nyelv amikben lehet PIC-et programozni. Erről van elképzelés milyen nyelvben szeretnél programozni?
A PIC mikrovezérlő termékcsalád sokgenerációs, melynek generációi ( PIC10, PIC12/16, PIC18, PIC24/dspIC30/dsPIC33, PIC32) felépítésükben, működésükben és utasításkészletükben jelentősen különböznek. Melyikre vagy kíváncsi?
Pontosabban: PIC12/16 assembly alapok!
Lehet, de a 31. oldaltól vannak benne olyan utasítások amik inkább a 18F-ekben vannak. Bár lehet, hogy a bővített architecturás 16F1xxx és 12F1xxx is tudják.
(#) |
SKY hozzászólása |
Nov 28, 2015 |
|
/ |
|
|
Mi az SPI-nek az elindító mechanizmusa master módban, vagy azzal indul miután aktív a modul, hogy beleírok az SSPBUF regiszterbe?
Mi a megfelelő beállítás a CKP, CKE és SMP biteknek?
Először SSPSTAT beállítása, utána SSPCON1 és modul engedélyezés, majd írás az SSPBUF regiszterbe? Ezután már csak az SSPSTAT BF-bitjét (buffer teli?) kell figyelni, ha teli, akkor adat elvétel, majd törlés és megint írás az SSPBUF regiszterbe?
A hivatalos Microchip doksi biztos jobb, de a másik vitathatatlan előnye, hogy magyarul van.
Nekem a legkönnyebben meg érthető kellene.
Ojjé!
Ebből megint vita lessz!
Megpróbálok tárgyilagos lenni. Ha nem akarod tudni, mit is csinál voltaképp a processzor, csak minél előbbi sikerélményre vágysz, válaszd a C-t. Ha távlati terveidben olyasmi szerepel, hogy nagyon gyors lefutású kis hardverigényű programokat írj, akkor bizony assembly kell.
Az egyszerű programok, (ledvillogtatás, futófény) assemblyben sem bonyolultak. Viszont alapszinten már fogalmat alkodhatsz a PIC működéséről. A C és társai olyan programnyelvek, melyekben mindent elkészítettek, és könyvtárakba helyeztek profi programozók. Neked szinte annyi a dolgod, hogy kitaláld, mit akarsz csinálni, és megtanuld, ehhez milyen függvények kellenek, és ezeket hogyan kapcsold össze. Az assemly a processzor nyelve. Ezen ért. Tehát a legjobb programokat asm.-ben lehet megírni. Viszont sokkalta munkaigényesebb.
A döntés a tiéd!
Sziasztok! Hogyan lehetne életre kelteni a 18F4550 hardveres SPI communikációját ( MCP4822-vel)? Úgy látom az alábbi programsor hatására nem mutatkozik semmilyen életjel az SPI lábakon. Van valami, amivel indítható az adat kiküldés?
SSPSTAT=0b11000000; //sample bit (csak a 7. és 6. bit írható)
SSPCON1=0b00100001; //ütközés, X, mssp en, clk pol, 3-0:freki
LATB3_bit=0; //csip aktív
delay_us(1);
SSPBUF=0b10111000; //Bdac, 1X gain, felso 4 bit= 1000
if(SSPSTAT.BF!=1) //sdi nincs használatban, de beírja a bufferbe a nullát és jelzi?
{SSPBUF=0;} //alsó 8bit=0 kuldes
if(SSPSTAT.BF!=1){LATB3_bit=1;} //!CS off
delay_us(1);
LATA4_bit=0; //dac buffer áttöltés (!LDAC)
A kiírás nálam ennyi:
/**
* Kiír egy bájtot a kimeneti bufferbe, kivárja, amíg az átvitel lezajlik
* és a bejövő adatbájttal tér vissza. A PIC18F4550 Errata szerint az átvitel
* végét jelző BF bitet nem szabad közvetlenül vizsgálni, ezért helyette a
* programmegszakítás jelzőbitet vizsgáljuk. Szintén az Errata ajánlja, hogy
* adatküldés előtt olvassuk ki az SSPBUF regisztert, ami egyúttal törli a BF bitet.
* Ha elmulasztjuk a BF bit törlését, akkor a következő beolvasott adat nem másolódik át
* az SSPBUF regiszterbe!
* \param data a kiküldeni kívánt adat
* \return a beolvasott adat
*/
uint8 spi_io( uint8 data) {
uint8 tmp;
PIR1bits.SSPIF = 0; // törli az interrupt jelzőbitet
SSPCON1bits.WCOL = 0; // törli az esetleges írás ütközés hibajelzőt
tmp = SSPBUF; // törli a BF jelzőbitet
SSPBUF = data; // kirakja a kimenő adatot az SSPBUF regiszterbe
while( !PIR1bits.SSPIF ); // megvárjuk a busz ciklus végét
return (SSPBUF); // a vett bájttal térünk vissza
}
Természetesen az spi_io() meghívása előtt az eszközkiválasztó vonalat ("chip sleect") aktiválni kell, az spi_io() után pedig inaktiválni kell.
Az inicializálás már komplikáltabb. Például:
//-- Az SPI1 modul konfigurálása 3 MHz-es, Mode_00 master módba.
spi_init(CKP_ACTIVE_HIGH | //aktív állapotban az órajel magas szintű
MASTER_FOSC_16, //SPI órajel FOSC/16 (3 MHz)
SPI_CKE_ON | //kimenet aktív/inaktív átmenetkor (CKE=1)
SPI_SMP_END); //Mintavételezés az adatkimeneti idő végén
A makrók és az inicializáló függvény így néz ki:
/* Makrók az SSPCON1 regiszter beállításához */
#define SSPENB 0b00100000 /* Enable serial port and configures SCK, SDO, SDI */
#define CKP_ACTIVE_LOW 0b00010000 /* Inaktív állapotban az órajel magas, aktív állapotban alacsony szintű */
#define CKP_ACTIVE_HIGH 0b00000000 /* Inaktív állapotban az órajel alacsony, aktív állapotban magas szintű */
#define MASTER_FOSC_4 0b00000000 /* SPI Master mód, órajel = Fosc/4 */
#define MASTER_FOSC_16 0b00000001 /* SPI Master mód, órajel = Fosc/16 */
#define MASTER_FOSC_64 0b00000010 /* SPI Master mód, órajel = Fosc/64 */
#define MASTER_TMR2 0b00000011 /* SPI Master mód, órajel = TMR2 output/2 */
#define SLAVE_SSON 0b00000100 /* SPI Slave mód, /SS bemenet engedélyezve */
#define SLAVE_SSOFF 0b00000101 /* SPI Slave mód, /SS bemenet letiltva */
/* Makrók az SSPSTAT regiszter beállításához */
#define SPI_SMP_END 0b10000000 /* A bejövő adatot az adatkimeneti idő végén mintavételezzük */
#define SPI_SMP_MID 0b00000000 /* A bejövő adatot az adatkimeneti idő közepén mintavételezzük */
#define SPI_CKE_ON 0b01000000 /* Az átvitel az órajel aktív állapotból inaktívba váltásakor történik */
#define SPI_CKE_OFF 0b00000000 /* Az átvitel az órajel inaktív állapotból aktívba váltásakor történik */
/** Az SPI modul konfigurálása és engedélyezése az spi_mode
* paraméterrel megadott módban és adatsebességgel. A paraméterek összeállításához
* a piccolo_spi.h állományban definiált makrókat használhatjuk.
* \param spi_mode az \em SSPCON1 regiszterbe írandó adat
* \param spi_busmode az \em SSPSTAT regiszterbe írandó adat
*/
void spi_init(uint8 spi_mode, uint8 spi_busmode) {
SSPSTAT = spi_busmode;
SSPCON1 = spi_mode;
switch(spi_mode & 0x0F) {
case 5: //-- SLAVE mód, SS bemenet letiltva
SPI_SCK = 1; //SCK bemenet legyen
break;
case 4: //-- SLAVE mód, SS bemenet engedélyezve
SPI_SCK = 1; //SCK bemenet legyen
SPI_SS = 1; //SS bemenet legyen
break;
default: //-- MASTER módok
SPI_SCK = 0; //SCK kimenet legyen
break;
}
SPI_SDI = 1; //SDI legyen bemenet;
SPI_SDO = 0; //SDO legyen kimenet
SSPCON1 |= SSPENB; // az MSSP egység engedélyezése
}
Megjegyzés: SP_SCK, SPI_SDI, SPI_SDO a megfelelő adatirány beállító bitek. Nálam pl.:
#define SPI_SDI TRISBbits.TRISB0
#define SPI_SCK TRISBbits.TRISB1
#define SPI_SDO TRISCbits.TRISC7
#define SPI_SS TRISAbits.TRISA5
Remélem, kimerítő volt a válasz. Bővebb info: PICCOLO projekt, SPI soros periféria illesztő A hozzászólás módosítva: Nov 28, 2015
Szia! Köszönöm a terjedelmes választ! Én mikroC környezetben próbálkozok még, de ha jól vettem ki a leírásból az alábbi soroknak már működnie kellene, sajnos a DAC még mindig nem ad semmilyen jelet, de majd holnap ránézek többcsatornás szkóppal az SPI vonalakra.
//spi inicializálás
SSPSTAT.CKE=1;
SSPCON1=0b00000010; //ütköz, X, mssp en, clk polarity, 3-0:mode select:0010 f/64
TRISC7_bit=0; //SDO kimenet
TRISB1_bit=0; //SCK kimenet
SSPCON1.SSPEN=1; //spi modul engedélyezés
LATB3_bit=0; //chip enable
//spi adatküldés
PIR1.SSPIF=0; //int. jelzőbit törlés
SSPCON1.WCOL=0; //írás ütközés törlés
dc1=SSPBUF;
SSPBUF=0b10111000;
while(!SSPIF); //átvitelre várás
//16 bites küldés második fele
PIR1.SSPIF=0; //int. jelzőbit törlés
SSPCON1.WCOL=0; //írás ütközés törlés
dc1=SSPBUF;
SSPBUF=0x00;
while(!SSPIF); //átvitelre várás
LATB3_bit=1; //chip select off
LATA4_bit=0; //!LDAC adat betölt
delay_us(10);
LATA4_bit=1;
Az 1011 1000 0000 0000 értéket küldeném el, ami a B csatornán 1X erősítéssel a 12 bites felbontás felére 0x800 állítaná a kimeneti jelet. !SHDN =1 Azt hiszem a csatornák függetlenül állíthatók egymástól.
A 16 bites adatküldésnél érzékel valamit az eszköz a bájtok közötti szünetből, vagy a 8 bites küldő függvény többszöri meghívásával ugyan úgy működik a 16, 24 bites küldés/olvasás is?
Idézet: „A 16 bites adatküldésnél érzékel valamit az eszköz a bájtok közötti szünetből?” Elvileg nem, hiszen az órajelek szinkronizálnak, s az eszközt csak az érdekli, hogy #CS alacsony állapotában 16 db. órajel érkezzen.
Az oszcilloszkóp elővétele helyett (vagy előtt) egy szoftveres (bitbang) küldéssel is megpróbálkozhatnál!
Idézet: „A CS lábat vezérled?”
A kódban szerepelnek LATB3_bit=0; és LATB3_bit=1; parancsok, csak a TRSB3_bit = 0; beállítást nem látom a belinkelt kódrészletben.
Az adatirányok be vannak állítva, a CS is vezérelve van. Az alábbi szkópábra látható a programsor hatására.
A sárga az SDO, a lila az SCK. Az SCK jelben látható legelőször egy nagyon keskeny impulzus is, gondolom itt már valami hiba van, ennek a többire kellene hasonlítania.
Ennek az útmutatónak az 54. oldalán az MPLAB source fájlaihoz létrehoz egy lcd mappát és amit beletesz az hol található? Megvannak ezek az előre megírt függvények az MPLAB feltelepített könyvtáraiban valahol? chipcad_tutorial
*Most látom, hogy a chip select csak akkor alacsony, amikor a legelső keskeny órajelimpulzus megjelenik és az sdo egyetlen impulzusának végéig tart. A hozzászólás módosítva: Nov 29, 2015
|
|