Fórum témák
- • Mozgásérzékelős lámpa
- • Számítógép hiba, de mi a probléma?
- • WiFi / WLAN alapkérdések
- • LG Mini HiFi kijelző hiba
- • Napelem alkalmazása a lakás energia ellátásában
- • Kivezérlésjelző, de nem LED-ekkel
- • Sprint-Layout NYÁK-tervező
- • Akkumulátor töltő
- • Nokia 3310 (adapter programozáshoz; de ha van hozzá, minden más mod cucc is)
- • Általános antennás kérdések, válaszok
- • Szobatermosztát bekötése
- • NICE garázskapu elektronika + egyéb
- • Sütő javítás
- • DSC riasztó
- • Szárítógép problémák
- • Autórádió beszerelése
- • Villanyszerelés
- • Indukciós főzőlap javítása
- • Arduino
- • Videoton EA 6383 s (tuning)
- • Folyamatábrás mikrokontroller programozás Flowcode-dal
- • Hardveresen / szoftveresen nyílt forrású, egyszerű "gombos" mobiltelefon?
- • Elfogadnám, ha ingyen elvihető
- • Dobozolási technikák, műszerdobozok
- • Porszívó javítás
- • Kazettás magnó (deck) javítása
- • Internetes rádióvevő
- • Függvénygenerátor építése
- • STK erősítők javítások
- • Westen 240 Fi gázkazán hiba
- • Speciális LED meghajtás
- • Villanypásztor
- • Készletnyilvántartás
- • Elektronikai témájú könyvek újságok
- • Erősítő építése elejétől a végéig
- • Számítógép tápegység
- • Elektronyika orosz digitális órák
- • Erősítő mindig és mindig
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Felajánlás, azaz ingyen elvihető
- • Vásárlás, hol kapható?
- • Csörlő átalakítása relés vezérlésűre
- • LED-es világítás
- • Tranzisztorok helyettesítése
- • LED rákötése 230V-ra
- • Mágneskapcsoló bekötése
- • Kapunyitás gombnyomásra olcsón! - avagy automata kapu házilag
- • H osztályú erősítők
- • Ventilátor javítás
- • Transzformátor készítés, méretezés
- • Rendelés külföldről (eBay - Paypal)
- • Elektromos távirányítós kapunyitó
- • Muzeális készülékek-alkatrészek restaurálása
- • Death of Zen (DoZ) 20W-os A osztályú erősítő
- • Castone erősítő javítás
» 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.
Köszi, akkor törlöm a config world ok közül, bár offra van definiálva. Az Mplab ban Release re volt / van állítva.
Apropo... Új project létrehozása vagy egy régiverziós MpLab al írt project megnyitása előtt az MpLab megkérdi hogy "Absolute" vagy "Relocatable"? Én Absolute ra szoktam állítani, bár nem vágom hogy ez micsoda és miért kérdezi. Ez mi és miért van?
Na jo... a többi port sem működik. Vagy döglött ez a PIC vagy nincs órajele mert nem rezeg a quartz. Teszek bele a 12MHz es helyett 4MHz est, az tuti van. Az MCLR láb H ban van, fel van húzva tápra. Ez is kilőve. Marad a szkóp, vagy a chip csere. Lehet lejárt a PIC szavatossága a 10 év alatt vagy koronavírust kapott. Mára elegem lett belőle, köszi a segítséget mindenkinek,
Mekkora kondik vannak a kvarcon?
Milyen órajelforrást adtál meg a konfigban?
A reset rendesen fel van húzva?
Van másik PIC-ed? A hozzászólás módosítva: Márc 14, 2020
4MHz -hez XT osszcillátor beállítás kell.
Lejjebb van a komplett kód, de 12MHz es kvarc ot használok és "_HS_OSC" nak konfigoltam. Ez szerintem rendben van. A 12MHz es kvarc lábain 22p van, de próbáltam 33p vel, 47p vel 15p vel. Semmi változás. A 4MHz eshez már XT beállítás kell ahogy Hp41C is írta. A MCLR láb most néztem, 82K val lett felhúzva. Valószínűleg benéztem, ez 8,2K akart lenni. De a 82K mellett is H ban van, 5,04V a táp és 4,75V ot mérek az MCLR lábon. Kicseréltem a 82K - t 10K ra de így sem megy. Az MCLR lábon nem változott a H szintje számottevően, 4,88V. Előtúrom a szkópot majd, csak az a padláson van dobozban valahol, most költöztem. Azt se tudom hol keressem. Másik PIC em nincsen, sőt ez a DIL40 es is a TOP oldalra lett felvarrva "SMD ként", mert lusta voltam furkálni. Vasalt "provizóre panel". De hogy ekkorát szívjak ezzel ez nonszensz... Murphy törvénye, gyorsan kell, nincs PIC másik tehát tuti hibás és hét vége van. Egy nagyfrekis (10MHz - 8GHz) frekimérővel néztem az órajelet szkóp híján de lehet az nem releváns mert ha rámérek a kavrc lábára leszakad a rezgés és nem látok semmit. Ezen a frekimérőn egy BNC s antenna van, és ezt nem erre találták ki. A BNC s szkóp mérőzsinór természetesen a szkóp mellett...
A tok minkét táp kivezetése és föld kivezetése be van kötve? Van mindkét oldalon közvetlenül a lábaknál 100nF kerámia kondenzátor? A tápfeszültség értéke meghaladja az előírt minimális értéket ill. a BOR értékét?
A fix érték kiírása mellett a B port -ra írj ki egy értéket, amit a ciklus minden lefutásánál növelsz. Így 8 eltérő periódusú négyszögjelet kellene kapnod. Ezzez a TRISB -t is 0 -val kell feltölteni.
Igen, mindkét oldali VDD és VSS lábak bekötve, a 100n sőt egy 22u is van mindkét oldalon. A tápfeszültség 5,07V nem tudom a BOR értéke mennyi, de ha jól emlékszem azt ki is kapcsoltam a konfigban. Most találtam meg a szkópot mindjárt nekiülök és talán "okosabb" leszek, legalábbis az órajel hibát ki tudom zárni. Ha van órajel akkor megpróbálok játszani a B porttal, de ha nincs akkor eleve halott az ügy. Köszi az ötletet.
Ok, egyáltalán nincs órajel. Így nem is fog menni. Cserélek kvarcot és meglátjuk. A táp viszont olyan sima mint a Balaton szélcsendben, azzal tuti nincs gond.
Ritka hiba de néha megesik. Ha a tépfeszültség túl lassan fut fel, nem indul el a kontroller. Adatlapban általában le van írva, maximum mennyi idő alatt kell elérni a minimális feszültségszintet a kontroller táplábain.
Azt hiszem tudom mi a baj... Ezt én csesztem el. Az összes port (A - E, a PORTB is az internal pull up dacára is..)), fel van húzva 82K val VDD re, mivel hol kimenetnek hol bemenetnek lennének használva. Az F877 nél viszont a külső oszcillátor lábai nem használhatók I/O ként. Én lehet hogy azokat a lábakat is fehúztam VDD re... És ez csak akkor fog látszani ha a PIC et kiforrasztom mert az összes felhúzóellenállás a beforrasztott DIL tok alatt van. Tuti hogy ez a gáz. De mindjárt kiderül mert leszedem a tokot a panelről. Mondanom se kell, a csere (6MHz) es kvarc se rezeg... )Vajon miért..? )
Köszi de szerintem nem ez lesz a baj. Sokkal egyszerűbb ennél, én voltam figyelmetlen és megszxvattam saját magam és terheltem a topicot a hülyeségem miatt. Sorry érte, már ha ez a baj. De a nyakamat teszem rá hogy igen.
És igen... Az OSC1 és OSC2 lábak is VDD n vannak 82k val. Ezúton elnézést kérek mindenkitől aki gondolkodott a megoldáson. Erre spec én se gondoltam és azért nem szúrtam ki kapásból mert nem látszanak a felhúzú ellenállások a tok alatt. Mindjárt lövök pár képet hogy is néz ki ez a 2 óra alatt összevart panel. Hát igen hamar munka ritkán jó, főleg ha már tervezés szinten elcseszik. De mentségemre legyen mondva a két ominózus láb mellett sorakoznak az I/O portok, én meg csak raktam befelé a pull up okat sorban és így persze nem hagytam ki a két OSC lábat sem. Még egyszer bocs.
A corpus delicti ami a hibát okozta.
ÉS LÁSS CSODÁT MŰKÖDIK, MÉG EGYSZER KÖSZÖNÖM MINDENKINEK.
Üdv!
Ezt az 1 Bitet hogyan kellene kiküldeni I2C-n? A PIC adatlapjáben nem találok erre regisztert. Vagy hogyan lehetne ezt megoldani? 1 bitet is ki lehetne küldeni a programból?
(AD5933 és PIC24FJ256GA702)
Köszi!
Pedig nem bonyolult, csak el kellene olvasni az eszközök IIC kommunikációját. Minden slave eszközben, (régen a PIC-adatlapjában is volt, ma már nem tudom) le van írva az írás és olvasás lépésről lépésre. A 8 bites cím azzal együtt teljes, és azt a bitet attól függően állítod be, hogy írni vagy olvasni akarod a slave-t.
Tehát ha a 7 bites cím mondjuk 1100101 és írni akarod akkor 11001010-t küldesz el az alső 8 biten ami a cím plusz az írás/olvasás bit, ha olvasni akarsz akkor 11001011-t.
Tényleg! Köszi!
icserni fórumtárs segítségét kérem. C nyelven szeretnék programozni. Ismerkedem a PICCOLO projekttel és megépítettem a PIC18F14K50 kísérleti áramkörét. Az élesztéshez szükséges code_examples.zip illetve a betöltőprogramok a helyi másolatok linken nem elérhetők - 404 not found. Szívességét, segítségét köszönöm!
Hali!
Bővebben: Link Itt még tudsz mazsolázni, a weboldalba ágyazott mnták úgy látom megvannak, de a zip fájl nincs. A hozzászólás módosítva: Márc 24, 2020
Ha ezt keresed akkor itt van a mellékletben.
Üdv!
Egy PIC24 I2C vel kommunikál egy IC-vel (AD5933) és néha lefagy a pic a küldési/fogadási folyamatkor.
Itt egy kódrészlet: (az egészet hasonlóan írtam, de ha kell kirakom az egész kódot)
I2C_Write(unsigned char I2C_Address, unsigned char REG_Address, unsigned char Data){
I2C1CONLbits.SEN = 1; //start allapot inditas
while(I2C1CONLbits.SEN); //varunk mig lezajlik
I2C1TRN = ((I2C_Address << 1) & 0xFE); //kikuldjuk a cimet az utolso bit 0 -> irasi utasitas
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1TRN = REG_Address; //regiszter cime
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1TRN = Data; //kikuldjuk az adatot
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik (8 bits + ACK)
I2C1CONLbits.PEN = 1; //stop allapot
while(I2C1CONLbits.PEN); //varunk a stop feltetel vegeig
} //END i2c_Write
Néha egy ujraindítás után el sem indul. Szerintetek mit ronthatok el?
Köszi! A hozzászólás módosítva: Márc 24, 2020
A 4. sor után ki kellene várni, amíg a SEN bit visszabillen nullába!
Lásd itt, a 00071. sorban.
Üdv!
A 4 sor várja ki. Addig fut a while míg a SEN = 1.
Vagy hogy érted? Ugyan az van ott is mint amit linkeltél.
Bemásolom az összes küldéssel/fogadással kapcsolatos függvényt:
void I2C_Initialize(){
I2C1BRG = 0x0030; //Baud rate beallitas 100kHz
I2C1STAT = 0x0000; //status register nullazas
I2C1CONL = 0x0000;
I2C1CONLbits.DISSLW = 1; //configuracios bitek beallitasa
I2C1CONLbits.SCLREL = 1;
I2C1CONLbits.I2CEN = 1;
I2C1CONLbits.DISSLW = 1;
I2C1CONLbits.RCEN = 0;
I2C1CONH = 0x0000;
} //END Initilalize
void I2C_Set_Address_Pointer(unsigned char I2C_Address, unsigned char Dest_Address){
I2C1CONLbits.SEN = 1; //start allapot inditas
while(I2C1CONLbits.SEN); //varunk mig lezajlik
I2C1TRN = ((I2C_Address << 1) & 0xFE); //kikuldjuk a cimet az utolso bit 0 -> irasi utasitas
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1TRN = AddressPointer; //pointer command (0xB0)
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1TRN = Dest_Address; //a cim amire mutatni kell
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1CONLbits.PEN = 1; //stop allapot
while(I2C1CONLbits.PEN); //varunk a stop feltetel vegeig
}//END Set_Address_Pointer
void I2C_Write(unsigned char I2C_Address, unsigned char REG_Address, unsigned char Data){
I2C1CONLbits.SEN = 1; //start allapot inditas
while(I2C1CONLbits.SEN); //varunk mig lezajlik
I2C1TRN = ((I2C_Address << 1) & 0xFE); //kikuldjuk a cimet az utolso bit 0 -> irasi utasitas
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1TRN = REG_Address; //regiszter cime
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1TRN = Data; //kikuldjuk az adatot
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik (8 bits + ACK)
I2C1CONLbits.PEN = 1; //stop allapot
while(I2C1CONLbits.PEN); //varunk a stop feltetel vegeig
} //END i2c_Write
uint8_t I2C_Read(unsigned char I2C_Address, unsigned char REG_Address){ //az address pointerrel beallitott cimen levo 8 bitet olvas ki
unsigned char Data;
I2C_Set_Address_Pointer(I2C_Address, REG_Address); //a kezdocim beallitasa
I2C1CONLbits.SEN = 1; //start allapot inditas
while(I2C1CONLbits.SEN); //varunk mig lezajlik
I2C1TRN = ((I2C_Address << 1) | 0x01); //kikuldjuk a cimet az utolso bit 1 -> olvasas utasitas
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1CONLbits.RCEN = 1; //Receive enable
//while(!I2C1STATbits.RBF); //Varunt amig a buffer ures majd ha jott adat tovabblepunk
Data = I2C1RCV; //adatbuffer kiolvasas
while(I2C1CONL & 0x001F); //varunk amig az utolso 5 bit u nem lesz (SEN, RSEN, PEN, RCEN, ACKEN) ha 0 nincs semmilyen muvelet
I2C1CONLbits.ACKDT = 1; //NACK kuldes beallitva
I2C1CONLbits.ACKEN = 1; //NACK elküldése - torlodik
while(I2C1CONLbits.ACKEN); //varunk a nyugtazas vegeig
I2C1CONLbits.PEN = 1; //stop allapot
while(I2C1CONL & 0x001F); //varunk a stop feltetel vegeig
return Data;
}//end I2C_Read
void I2C_Block_Write(unsigned char I2C_Address, unsigned char Start_Reg_Address, unsigned char Num_of_Bytes, uint32_t Data){
unsigned char index;
unsigned char shift;
shift = 8 * (Num_of_Bytes - 1);
I2C_Set_Address_Pointer(I2C_Address, Start_Reg_Address); //a kezdocim beallitasa
I2C1CONLbits.SEN = 1; //start allapot inditas
while(I2C1CONLbits.SEN); //varunk mig lezajlik
I2C1TRN = (I2C_Address << 1) & 0xFE; //kikuldjuk a cimet az utolso bit 0 -> irasi utasitas
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1TRN = BlockWrite; //Block write code (0xA0)
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1TRN = Num_of_Bytes; //a kuldeni kivant adatbajtok szama
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik (8 bits + ACK)
for(index = 0; index < Num_of_Bytes; index ++){ //adatbajtok kuldese
I2C1TRN = (Data >> shift); //shifteles alacsonyabb mem. cim MSB, magasabb mem. cim LSB
shift -= 8; //Eltolas csokkentese -> masik bajt kovetkezik.
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik (8 bits + ACK)
}//END for
I2C1CONLbits.PEN = 1; //stop allapot
while(I2C1CONLbits.PEN); //varunk a stop feltetel vegeig
}//END Block_Write
uint16_t I2C_Block_Read(unsigned char I2C_Address, unsigned char Start_Reg_Address, unsigned char Num_of_Bytes){
uint16_t Data;
I2C_Set_Address_Pointer(I2C_Address, Start_Reg_Address); //a kezdocim beallitasa
I2C1CONLbits.SEN = 1; //start allapot inditas
while(I2C1CONLbits.SEN); //varunk mig lezajlik
I2C1TRN = ((I2C_Address << 1) & 0xFE); //kikuldjuk a cimet az utolso bit 0 -> irasi utasitas
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1TRN = BolckRead; //block read code (0xA1)
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1TRN = Num_of_Bytes; //elkuldjuk az olvasni kivant bajtok szamt
while(I2C1STATbits.TRSTAT); //varunk mig befejezodik a kuldes (8 bits + ACK)
I2C1CONLbits.RSEN = 1; //restart allapot beallitasa
while(I2C1CONLbits.RSEN); //varunk mig veget er a restart allapot
I2C1TRN = ((I2C_Address << 1) | 0x01); //az i2c cimet ujra kikuldjuk olvasas utasitassal
while(I2C1STATbits.TRSTAT); //varunk amig elkuldi (8 bits + ACK)
I2C1CONLbits.RCEN = 1; //Receive enable
while(!I2C1STATbits.RBF); //tovabblepunk ha a van bejovo adat
Data = I2C1RCV; //beletesszuk egy tombbe
I2C1CONLbits.ACKDT = 0; //NACK kuldes beallitva
I2C1CONLbits.ACKEN = 1; //NACK elküldése
while(I2C1CONLbits.ACKEN); //varunk mig vege a nyugtazasnak
Data = Data << 8; //Elso adatot eltoljuk a felso 8 bitre
I2C1CONLbits.RCEN = 1; //engedelyezzuk az adat fogadasat
while(!I2C1STATbits.RBF); //varunk amig nem erkezik valami
Data |= I2C1RCV; //adatot kimasoljuk a regiszterbol
while(I2C1CONL & 0x001F); //varunk amig az utolso 5 bit 0 nem lesz (SEN, RSEN, PEN, RCEN, ACKEN) ha 0 nincs semmilyen muvelet
I2C1CONLbits.ACKDT = 1; //NACK kuldes beallitva
I2C1CONLbits.ACKEN = 1; //NACK elküldése
while(I2C1CONLbits.ACKEN); //varunk a nyugtazas vegeig
I2C1CONLbits.PEN = 1; //stop allapot
while(I2C1CONLbits.PEN); //varunk a stop feltetel vegeig
return Data;
}//END Block_Read
Csinálj 1 gyors 10-200ms környéki timert,és együtt figyeld a statbitekkel,így nem fogsz beragadni a while-oknál.Ha még változót is beraksz,akkor még a hiba helye is meglesz.
Ha a PIC elegendően magas frekvenciájú órajelről jár az is megtörténhet, hogy az olyan ciklusok, mint a SEN megszűnésére váró ciklus le sem fut. Az első kiolvasásnál még SEN bitet 0 értékkel olvassa ki, a program tovább lép, pedig a start bit kiadása még el sem kezdődött. A megszakítási állapot bitet kellene használni, azok csak akkor billennek 1 értékre, ha az indított működés véget ért. A következő indítása előtt természetesen törölni kell.
IFSxbits.MI2CyIF=0;
I2C1CONLbits.SEN = 1; //start allapot inditas
while(IFSxbits.MI2CyIF); //varunk mig lezajlik
IFSxbits.MI2CyIF=0;
I2C1TRN = ((I2C_Address << 1) & 0xFE); //kikuldjuk a cimet az utolso bit 0 -> irasi utasitas
while(IFSxbits.MI2CyIF); //varunk amig elkuldi (8 bits
...
Köszönöm a válaszokat!
A PIC 20MHz kvarckristállyal megy.
Ha az utolsó nem jön be kipróbálom a Timeres megoldást.
A TRSTAT bitet is átugorhatja a program? Azt is érdemes lenne kicserélni interrupt flagre?
Erről hol lehet olvasni egyébbként? Errata?
Bocs, csak figyelmetlenül olvastam. A hozzászólás módosítva: Márc 25, 2020
Már a PIC16, PIC18 családban is ezt a megoldást javasolják. A művelet indítása és a status bit beállása közötti maximális időről bölcsen hallgatnak az adatlapok.
|
|