Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- 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.
Lapozás: OK   737 / 1210
(#) jocka0012 hozzászólása Jan 2, 2016 /
 
Üdv!A DS18B20 hőmérséklet érzékelőt próbálgatom , feléleszteni több kevesebb sikerrel.Sikerült a kommunikációt létrehoznom , csak annyi a baj , hogy valamiért néha ugrál az érték a hétszegmenses kijelzőn.Van amikor beáll 25 fokra de van amikor 05-öt mutat és így ugrál.A kódomból a részletet mellékeltem
  1. if(!Reset_18B20()){
  2.            
  3.             Write_18B20(Skip_ROM);
  4.             Write_18B20(Convert_T);
  5.             __delay_ms(750);
  6.            
  7.             Reset_18B20();
  8.             Write_18B20(Skip_ROM);
  9.             Write_18B20(Read_scratchpad);
  10.  
  11.             tempL = Read_18B20();
  12.             tempH = Read_18B20();
  13.            
  14.             temp = ((tempH & 0x0F) << 4) | (tempL >> 4);
  15.            
  16.             maradek = temp%10;
  17.             temp = temp/10;
  18.                
  19.             segment_3 = temp;
  20.             segment_4 = maradek;
  21.             }
ez van a végtelen ciklusban a main függvényben
A timer 0- val multiplexelem a kijelzőt.Köszönöm előre a segítséget!
(#) kissi válasza jocka0012 hozzászólására (») Jan 2, 2016 /
 
Tégy fix értéket a tempL-be és tempH-ba, akkor kiderül, hogy olvasási vagy feldolgozási hiba ( de minden egyéb függvényt hagyj meg!) !
(#) jocka0012 válasza kissi hozzászólására (») Jan 2, 2016 /
 
Ha fixet írok be akkor jól működik tehát akkor az olvasással van probléma.Mellékeltem a ds1820-as függvényeket is.
  1. char Reset_18B20() {
  2. Tx_18B20; // Tris = 0 (output)
  3. Port_18B20 = 0; // set pin# to low (0)
  4. delay480(); // 1 wire require time delay
  5. Rx_18B20; // Tris = 1 (input)
  6. __delay_us(60); // 1 wire require time delay
  7.  
  8. if (Port_18B20 == 0) { // if there is a presence pluse
  9. delay480();
  10. return 0; // return 0 ( 1-wire is presence)
  11. } else {
  12. delay480();
  13. return 1; // return 1 ( 1-wire is NOT presence)
  14. }
  15. }
  16.  
  17. void Write_18B20 (char Cmd){
  18. char i;
  19. Rx_18B20; // set pin# to input (1)
  20. for(i = 0; i < 8; i++){
  21. if((Cmd & (1<<i))!= 0) {
  22. // write 1
  23. Tx_18B20; // set pin# to output (0)
  24. Port_18B20 = 0; // set pin# to low (0)
  25. __delay_us(1); // 1 wire require time delay
  26. Rx_18B20; // set pin# to input (release the bus)
  27. __delay_us(60); // 1 wire require time delay
  28. } else {
  29. //write 0
  30. Tx_18B20; // set pin# to output (0)
  31. Port_18B20 = 0; // set pin# to low (0)
  32. __delay_us(60); // 1 wire require time delay
  33. Rx_18B20; // set pin# to input (release the bus)
  34. }
  35. }
  36.  
  37. }
  38.  
  39. char Read_18B20 (){
  40. char i,result = 0;
  41. Rx_18B20; // TRIS is input(1)
  42. for(i = 0; i < 8; i++){
  43. Tx_18B20; // TRIS is output(0)
  44. Port_18B20 = 0; // genarate low pluse for 2us
  45. __delay_us(2);
  46. Rx_18B20; // TRIS is input(1) release the bus
  47. if(Port_18B20 != 0) result |= 1<<i;
  48. __delay_us(60); // wait for recovery time
  49. }
  50. return result;
  51. }
(#) Hp41C válasza jocka0012 hozzászólására (») Jan 2, 2016 /
 
A Write_18B20 -ban, a 25. sorban késleltetést vidd fel 10us -re, a 27. sorban csökkentsd le a késleltetést 50 us -re.
A Read_18B20 -ban, a 45. sorban késleltetést vidd fel 10us -re, a 46. és 47. sorok közé tegyél be egy 40us -es késleltetést, a 48. sorban pedig csökkentsd le a késleltetést 10 us -re.
A hozzászólás módosítva: Jan 2, 2016
(#) jocka0012 válasza Hp41C hozzászólására (») Jan 2, 2016 /
 
  1. char Reset_18B20() {
  2. Tx_18B20; // Tris = 0 (output)
  3. Port_18B20 = 0; // set pin# to low (0)
  4. __delay_us(480); // 1 wire require time delay
  5. Rx_18B20; // Tris = 1 (input)
  6. __delay_us(60); // 1 wire require time delay
  7.  
  8. if (Port_18B20 == 0) { // if there is a presence pluse
  9. __delay_us(480);
  10. return 0; // return 0 ( 1-wire is presence)
  11. } else {
  12. __delay_us(480);
  13. return 1; // return 1 ( 1-wire is NOT presence)
  14. }
  15. }
  16.  
  17. void Write_18B20 (char Cmd){
  18. char i;
  19. Rx_18B20; // set pin# to input (1)
  20. for(i = 0; i < 8; i++){
  21. if((Cmd & (1<<i))!= 0) {
  22. // write 1
  23. Tx_18B20; // set pin# to output (0)
  24. Port_18B20 = 0; // set pin# to low (0)
  25. __delay_us(10); // 1 wire require time delay
  26. Rx_18B20; // set pin# to input (release the bus)
  27. __delay_us(50); // 1 wire require time delay
  28. } else {
  29. //write 0
  30. Tx_18B20; // set pin# to output (0)
  31. Port_18B20 = 0; // set pin# to low (0)
  32. __delay_us(50); // 1 wire require time delay
  33. Rx_18B20; // set pin# to input (release the bus)
  34. }
  35. }
  36.  
  37. }
  38.  
  39. char Read_18B20 (){
  40. char i,result = 0;
  41. Rx_18B20; // TRIS is input(1)
  42. for(i = 0; i < 8; i++){
  43. Tx_18B20; // TRIS is output(0)
  44. Port_18B20 = 0; // genarate low pluse for 2us
  45. __delay_us(10);
  46. Rx_18B20; // TRIS is input(1) release the bus
  47. __delay_us(40);
  48. if(Port_18B20 != 0) result |= 1<<i;
  49. __delay_us(10); // wait for recovery time
  50. }
  51. return result;
  52. }

Most így módosítottam a kódot , de így sajnos folyamatosan csak egy 5 - ös számjegyet mutat a kijelzőn.Ezt az 5 - ös értéket , akkor írja ki szerintem , hogyha valamiért nem tudjak kiolvasni az értéket.Mert még mielőtt módosítottam a kódot úgy , ahogy leírtad akkor ugrált a kijelzés , hogy hol a jó értéket mutatta , hol átugrott 5 -ös értékre , de ha kihúztam a ds18B20-at a foglalaltból , akkor folyamatosan 5 - ös értéket mutatott.Most is ezekkel a módosításokkal végig egy 5 -ös számjegy van a kijelzőn úgy , hogy most benne van a foglalatba a hőmérő.
(#) nyekk hozzászólása Jan 2, 2016 /
 
Sziasztok!
Lcd - re való kiírást szerettem volna gyakorolni,MikroC ben ,egy 16F628A -val meghajta a kijelzőt .A fordító gond nélkül ,lefordította a megírt programot .De a PICkit2 már nem akarta beleégetni a hex.fájlt .
A következő hibaüzenetet írta ki " Verification of configuration failed ". A PIC jó, egyéb programot minden gond nélkül bele tudok égetni.Mikor importálom a hex-et,a pickit2 jobb felső sarkában megjelenik egy "code protect"üzenet a configuráció alatt. Van valami ötletetek ,merre keressem a hibát?
Elöre is kösz!
A hozzászólás módosítva: Jan 2, 2016
(#) Hp41C válasza jocka0012 hozzászólására (») Jan 2, 2016 /
 
A 32. sorban miért 50 us a késleltetés ?
A 34. sor elé is kell egy 10 ms késleltetés.
Adatlap: Figure 14 és 15...
A hozzászólás módosítva: Jan 2, 2016
(#) Hp41C válasza nyekk hozzászólására (») Jan 2, 2016 /
 
A PICkit2 programozás során végrehajtott műveletei:
Azonosítás, törlés, program írása, eeprom beírása, nem írásvédett konfiguráció beírása, ellenőrzés (program, eeprom, konfiguráció), írásvédett konfiguráció beírása.
Egy írásvédett program beírása sikeres, mert az ellenőrzés még nem írásvédett konfigurációval történik. A későbbi ellenőrzés már sikertelen.
A konfigurációban kapcsold ki az írásvédelmet.
(#) jocka0012 válasza Hp41C hozzászólására (») Jan 3, 2016 /
 
Sajnos nem nagyon értem azokat az idődiagramokat , ezt a kódot is neten találtam.
(#) Hp41C válasza jocka0012 hozzászólására (») Jan 3, 2016 /
 
(#) jocka0012 válasza Hp41C hozzászólására (») Jan 4, 2016 /
 
Köszönöm!Azt már észre vettem , hogy akkor működik rendesen , hogyha letiltom a timer interruptot addig , ameddig a kommunikáció zajlik a hőmérő szenzorral , csak akkor az a baj , hogy nem tudom multiplexelni a hétszegmenses kijelzőt.750 ms-ot várni kell a hőmérséklet konvertálásra a ds18B20-nál , és ez nagyon lefoglalja a kontrollert.Vajon hogy lehetne megoldani ezt a problémát , hogy legyen kijelzés a kijelzőn , úgy , hogy a timer interruptot le kell tiltani?
A hozzászólás módosítva: Jan 4, 2016
(#) bbalazs_ válasza jocka0012 hozzászólására (») Jan 4, 2016 /
 
Ha az idoablakba nem fer bele, akkor sehogy (nezd meg, mennyi ido alatt tudod kiadni a parancsot, illetve beolvasni az eredmenyt).
A ketto kozotti varakozasra viszont termeszetesen van megoldas, tehat nem kell haromnegyed masodpercet varni a kovetkezo kijelzesig. De mivel a kommunikaciod idoalapu, ertelemszeruen azt nem zavarhatja meg semmi, addig kizarolagos prioritasa kell, hogy legyen.
(#) Hp41C válasza jocka0012 hozzászólására (») Jan 4, 2016 / 1
 
Az adatlap Figure 14 ábráján van egy Trec adat: 1uS < Trec < végtelen.
Megoldható hogy a megszakítás csak egy-egy "time slot" (egy bit beírása vagy kiolvasása) és a "reset - presence" szekvencia idejére legyen tiltott.
(#) jocka0012 válasza bbalazs_ hozzászólására (») Jan 4, 2016 /
 
Hat koszonom majd megnezem.Akkor lehet jobban jarnek valami mas megoldassal.Ismer valaki mas fajta homersekket szenzort ami nem one wiren kommunikal?Lehet hogy termisztorral kene megoldani?Az mennyire foglalja le a kontrollert?
(#) jocka0012 válasza Hp41C hozzászólására (») Jan 4, 2016 /
 
Na akkor azt is megnezem hatha ugy meg lehet oldani.Koszonom!
(#) jocka0012 válasza Hp41C hozzászólására (») Jan 4, 2016 /
 
Sikerült megoldani a problémát!Köszönöm a tippet Hp41C!Nagyon sokat segítettél!
(#) Marko Ramiusz hozzászólása Jan 4, 2016 /
 
Szép napot, Mindenkinek! Azt kérdezném, hogy egy PIC 16F887-es mikrokontrollerből hogyan tudnám kiolvasni a működő programot? Sajnos elfelejtettem, hogy melyiket töltöttem fel. Egy MikroElektronika easyPIC6-osban van, a szoftver MicroC for PIC version 3.2 . Köszönöm a választ.
(#) DJozso válasza Marko Ramiusz hozzászólására (») Jan 4, 2016 /
 
A hex filét le tudod menteni a PIC-ből MPlabbal. A C file szerintem felejtős.
(#) DJozso hozzászólása Jan 4, 2016 /
 
Bocsi az új hózzászólásért, de mire az előző hozzászólásom módosítottam, nem engedte menteni, kicsúsztam az időkeretből. Bocs.
Ha lehet, viszont én is szeretnék kérdezni. Adott egy 18f4550 PIC . Adott egy encoder (végtelenített potméter). A PORTE.F0 és a PORTE.F1 bemeneteket szeretném a PIC-en használni a encoder dekodolásához. A TRISE regiszter 0b00001111 értéken van. A PIC látja a bemeneten változó jel sorozatot, de az encoder a változómat nem növeli, csökkenti. A mikroC kód a következő:
  1. while (Push_Sw == 0) {}  //Körciklus, míg az encoder záró gombja nincs lenyomva
  2.       new_encoder = (PORTE & 0x03); //new_encoder és last_encoder char tipusú változók
  3.       if (new_encoder != last_encoder) {
  4.         if(new_encoder.F1 == last_encoder.F0) {
  5.           Fel = 0;  // ha balra forog
  6.           Le++;  // Fel Le változók funkciója, hogy minden negyedik bemenet változásnál növelje a MenuSzam értékét eggyel
  7.           if (Le == 4) {
  8.             Le = 0;
  9.             MenuTxtUpdate = 1; // Menu frissitése az LCD-n
  10.             if (Menuszam == 0 ) Menuszam = 4 ; //Menuszám max értéke 4.
  11.             else Menuszam--;}}
  12.        else {
  13.           Le = 0;
  14.           Fel++;
  15.           if ( Fel == 4) {
  16.             Fel = 0;
  17.             MenuTxtUpdate = 1;
  18.             if (Menuszam == 4) Menuszam = 0;
  19.           else Menuszam++;}}
  20.         last_encoder = new_encoder;}


Miért nem müködik a PORTE 0 és 1 es bitjeivel? PORTB ugyan ezen bitjeivel tökéletesen müködik. Valakinek valami ötlet? Lehet az miatt, hogy a PORTE bemenetei az adatlap szerint ST (gondolom Schmitt trigger) tipusúak, míg a portb Digin (gondolom digitális?). Valammi ötlet?
(#) foxi63 válasza DJozso hozzászólására (») Jan 4, 2016 / 1
 
Szia!
Ha ST bemenet, akkor a magas szint VDD * 0,8 ( 5V nál 4V kell kegalább).
üdv.: Foxi
(#) DJozso válasza foxi63 hozzászólására (») Jan 4, 2016 /
 
Köszi a segítséget. A bemeneti szint elvileg 0V vagy 5V. Az encoder közepe a gnd-re van kötve, az A pont a PORTE.F0-ra a B pont a PORTE.F1-re. És a két bemenet fel van húzva a VDD-re egy-egy 2k2 ellenállással. Ez így jó nem?
(#) Hp41C válasza DJozso hozzászólására (») Jan 4, 2016 / 1
 
Az A/D és a komparátor ki van kapcsolva?
(#) DJozso válasza Hp41C hozzászólására (») Jan 4, 2016 /
 
A PIC konfigurációja a következő:
  1. void Hardver_Config() {
  2.      TRISA = 0xFF;
  3.      TRISB = 0b11100000;
  4.      PORTB = 0;
  5.      TRISC = 0b10111000;
  6.      PORTC = 0;
  7.      TRISD = 0x00;
  8.      TRISE = 0b00001111;
  9.      PORTD = 0;
  10.      PORTE = 0;
  11.      ADCON1 = 0b00001101; //AN0 és AN1 analog, többi digitális
  12.      T0CON       = 0x83; //Interrupt-nak  használva
  13.      TMR0H       = 0x0B;
  14.      TMR0L       = 0xDC;
  15.      INTCON.GIE  = 1;
  16.      INTCON.TMR0IE = 1;
  17.      Lcd_Init(&PORTD);
  18.      Lcd_Cmd(Lcd_CLEAR);
  19.      Lcd_Cmd(Lcd_CURSOR_OFF);
  20.      Sound_Init(&PORTC,1);
  21.      PWM1_Init(5000);
  22.      PWM1_Start();
  23.      PwmErtek = 255;
  24.      PWM1_Change_Duty(PwmErtek); }

Van két analóg érték olvasása az AN0-n és AN1-n. Az AD ha nem muszály nem kapcsolnám ki. A komparátor ezek szerint nincs kikapcsolva. Ezt javítom.
Kikapcsoltam a Komparátort és az A/D-t próbából. Semmi változás. De azért köszönöm.
A plusz kód:
  1. CMCON = 7; //Turn off comparator
  2.      ADCON1 = 0b00001111; //minden digitalis
(#) Pali79 válasza Marko Ramiusz hozzászólására (») Jan 4, 2016 /
 
Mplabnak és a PK-nak a programjában is van ilyen funkció. A PK progi egyszerűbb, simán READ parancs. Persze ha be van kapcsolva a védelem akkor nem tudod kiolvasni.
(#) DJozso válasza Pali79 hozzászólására (») Jan 4, 2016 /
 
De az csak a hex file tartalma, nem? Abból nem egyszerű (majdhogy lehetetlen) mikroC kódot készíteni. Vagy tévedek?
A hozzászólás módosítva: Jan 4, 2016
(#) Pali79 válasza DJozso hozzászólására (») Jan 4, 2016 / 1
 
Nem tévedsz! Pontosan így van! De a kolléga azt kérdezte, hogy mivel tudja kiolvasni a működő programot. A program az a hex. A mikroC kód az a forráskód. Ég és föld a különbség. Hex-ből forrás(szerűséget) visszafejteni csak assemblybe lehet, de a legtöbb C user azzal nem tud mit kezdeni.
A hozzászólás módosítva: Jan 4, 2016
(#) DJozso válasza Pali79 hozzászólására (») Jan 4, 2016 /
 
Köszi. Leírtad pontosan a fogalmakat. Én nem tudtam ilyen szépen (és pontosan) megfogalmazni. Engem a "szoftver MicroC for PIC version 3.2 ." zavart meg. Ebből arra következtettem, hogy a fórumtársunk, csak a C nyelvet érti, így számára a program ebben a formában nem értelmezhető.
Viszont ezúton is bocsánatot kérek, mivel azt feltételeztem alapból, hogy csak a C nyelvet érti. Teljesen igazad van, kedves Pali79.
(#) Marko Ramiusz hozzászólása Jan 4, 2016 /
 
Köszönöm a választ, közben megtaláltam a programot. Ettől még érdekel a téma, mivel ilyen bármikor előfordulhat. A fogalmakkal tisztában vagyok, annak ellenére, hogy kezdő vagyok. Sajnálom, hogy nem írtam le érthetően, a profik ezt jobban tudják.
(#) Hp41C válasza Marko Ramiusz hozzászólására (») Jan 4, 2016 / 1
 
Nos a módszer hosszú és fáradságos. Felteszem, hogy egyik program sem aktivizálja a kiolvasásvédelmet.
Lefordítod a szóba jöhető összes micro C programodat, azaz mindegyikből készítesz egy hex állományt.
A PICkit2 -be betöltöd rendre mindegyiket és mindegyikre kiadsz egy "Verify" -t. Amelyiknél sikeres a művelet, az volt utoljára beleprogramozva.
Ha az adat EEPROM tartalmát változtathatja a program, akkor a parancs kiadása előtt vedd ki a pipát az "Data EEPROM" elötti négyzetből.
Nem egyszerűbb a szükséges program beírása.
Ilyen gondok megoldására van a UserId nevű terület. Ebbe a 4 memrória rekeszbe egy emlékeztetőt lehet programozni. Kiolvasás után az emlékeztető alapján azonosítani lehet a programot.
Idézet:
„The user ID locations and the Configuration Word can be programmed and read out regardless of the state of the CP and CPD bits.”
A hozzászólás módosítva: Jan 4, 2016
(#) Pali79 válasza Marko Ramiusz hozzászólására (») Jan 4, 2016 /
 
Nem nagyon vágom ezt a C témát, de ha minden igaz az egyes függvények és utasítások sem mások, mint blokkokba foglalt assembly kódok amit hozzáértő emberek megalkottak és ezekből létrehoztak könyvtárakat, ezzel kvázi egyszerűsítve a forráskód megírását. Valóban leegyszerűsíti a programozó életét, mert nem kell annyit gépelni, cserébe nem nagyon tudjuk, hogy pontosan mi is zajlik a háttérben. Örök vita, hogy melyik programnyelv miért jobb mint a másik, de mint ez a példa is mutatja a PIC alapnyelve az assembly, a hex-et csak és kizárólag erre lehet visszafejteni és csak ezen a nyelven megírt programról tudjuk, hogy a PIC éppen mit is csinál. Az egyik kedvenc idézetem egy assembly könyvből:
Idézet:
„Amit nem lehet Pascal-ban megírni, azt C/C++-ban meg lehet.
Amit nem lehet C/C++-ban megírni, azt Assembly-ben meg lehet.
Amit nem lehet Assembly-ben megírni, azt nem lehet megírni!”
A hozzászólás módosítva: Jan 4, 2016
Következő: »»   737 / 1210
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