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   508 / 1222
(#) Hp41C válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
Csak egy szenzor van az I2C buszon? Megvannak a felhúzóellenállások az SDA és SCL vonalakon?
Kell-e inicializálni a szenzort? A beírásnál vizsgálod az ACK bit étréket? Valaki válaszol a 0x30 címre (0xC1 0xFF adatsorral), mivel a válaszban van 0 értékű bit.
(#) Hp41C válasza vilmosd hozzászólására (») Ápr 1, 2014 /
 
MCP9808 a hőmérő típusa.
(#) KaiserA válasza Hp41C hozzászólására (») Ápr 1, 2014 /
 
Igy van bekötve eredetileg is.

kep.jpg
    
(#) Prendick válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
Elfelejtettél ACK bitet küldeni az első bájt vétele után. (75. sor)
(#) KaiserA válasza Prendick hozzászólására (») Ápr 1, 2014 /
 
Szia!
Meg tudod légyszi mondani , hogy hogyan kell.

Köszönöm szépen!
A hozzászólás módosítva: Ápr 1, 2014
(#) Prendick válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
Doksi 21. oldal:
UpperByte = i2c_read(ACK)
LowerByte = i2c_read(NAK)
Ha a master fogad, minden bájt-nál neki kell nyugtázni, hogy megjött az adat. Csak az utolsónál nem.

Nálad egyszerű a dolog: fogadottadat=i2c_read(1);
(#) KaiserA válasza Prendick hozzászólására (») Ápr 1, 2014 /
 
fogadottadat=i2c_read(1);
Átirtam 0-t egyre, de még mindig ertek: 193 at ír. ha kikommentelem az if-es részt (84-99 sor), mert ha nincs kikommentelve az If-es rész akkor meg kijelző nem mutat semmit, és amikor mutat próbálom melegíteni szenzort és végig 193 az érték.
Mi lehet a baj?
(#) KaiserA válasza Prendick hozzászólására (») Ápr 1, 2014 /
 
Igy néz ki kikomenttelve.

MOST TÖRTÉNT VALAMII.
Ertek:193 felsősor
Alsosor pedig ERTEK: valtozik a decimális szám.
Most az a kérdésem, hogy hogy lehet hogy celsius fokot irjon ki?

köszönöm a segítséget!!
A hozzászólás módosítva: Ápr 1, 2014
(#) KaiserA válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
  1. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
  2. //++++++++++++++++++++++++++++++++++++++++BEALLITASOK++++++++++++++++++++++++++++++++++++++++++//
  3.  
  4.  
  5. #zero_ram                                                                                      
  6. #include <h fileok/18F4550.h>                                          
  7. #DEVICE ADC=10                                                                         
  8. #include <h fileok/stdio.h>                                                    
  9. #include <string.h>                                                                    
  10. #include <h fileok/float.h>    
  11. #use i2c(master,sda=PIN_B0, scl=PIN_B1)
  12. #define SLAVE_ADDRESS 0x3E
  13.  
  14.  
  15.                                                
  16. #fuses HS,BROWNOUT,NOPUT,NODEBUG,NOWDT                         
  17. #use delay(clock=24000000)                                             
  18. #include <lcd.c>                                                               
  19. #include <h fileok/prototypes.h>
  20.  
  21.  
  22.  
  23. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
  24. //+++++++++++++++++++++++++++++++++++++++++VALTOZOK++++++++++++++++++++++++++++++++++++++++++++//
  25.  
  26. //LCD
  27.  
  28. unsigned char felsosor[16];            
  29. unsigned char alsosor[16];             
  30. int8 a=0;      
  31. unsigned long beolvasas=0;
  32. float hom=0;                                           
  33. float tullepes=0;
  34. unsigned long fogadottadat=0;
  35. unsigned long fogadottadat2=0;
  36.  
  37. float Temperature=0;
  38.                        
  39. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
  40. //+++++++++++++++++++++++++++++++++++++++INICIALIZALAS+++++++++++++++++++++++++++++++++++++++++//
  41.  
  42. void init()                                                                    
  43.         {
  44.         set_tris_a(0xc3);                                                      
  45.         set_tris_b(0xff);                                                        
  46.         set_tris_c(0xff);                                                      
  47.         set_tris_d(0x1f);                                              
  48.         set_tris_e(0xff);                                              
  49.  
  50.         output_low(PIN_A3);                                                
  51.         output_low(PIN_A4);                                                
  52.         output_low(PIN_A5);                                                    
  53.         output_low(PIN_A2);                                            
  54.  
  55.         lcd_init();                                                                    
  56.         SETUP_ADC(ADC_CLOCK_INTERNAL);                 
  57.         SETUP_ADC_PORTS(AN0_TO_AN1|VSS_VDD);           
  58.         SET_ADC_CHANNEL(0);                                                    
  59.         }
  60.  
  61.  
  62.  
  63.  
  64.  
  65. void main()
  66.                 {
  67.                 init();                
  68.                 while(1)
  69.                         {      
  70.                                        
  71.                         i2c_start();
  72.                                             i2c_write(SLAVE_ADDRESS);
  73.                         i2c_write(0x05);
  74.                         i2c_start();
  75.                         i2c_write(SLAVE_ADDRESS | 0x01);
  76.                         fogadottadat=i2c_read(1);
  77.                         fogadottadat2=i2c_read(0);             
  78.                         i2c_stop();
  79.  
  80.  
  81.                
  82. /*
  83.                
  84.                                                                                                
  85.         //Convert the temperature data
  86. //First Check flag bits
  87. if ((fogadottadat & 0x80) == 0x80){ //TA >= TCRIT}
  88. if ((fogadottadat & 0x40) == 0x40){ //TA > TUPPER}
  89. if ((fogadottadat & 0x20) == 0x20){ //TA < TLOWER}
  90. fogadottadat = fogadottadat & 0x1F; //Clear flag bits
  91. if ((fogadottadat & 0x10) == 0x10){ //TA < 0°C
  92.     fogadottadat = fogadottadat & 0x0F; //Clear SIGN
  93.        
  94.  
  95.                                                                 Temperature = 256.0 - ((float)(fogadottadat *16 + fogadottadat2) / 16.0);
  96. }else //TA >= 0°C
  97.  
  98.                                
  99.                                 Temperature = ( (fogadottadat * 16 + fogadottadat2)/ 16.0);
  100. */
  101.  
  102.                                                                         lcd_putc("\f");
  103.                                                                         sprintf(felsosor,"ertek: %lu" ,fogadottadat);
  104.                                                                         sprintf(alsosor,"ertek: %lu" ,fogadottadat2);
  105.                
  106.                                                                         a=0;                                                                           
  107.                                                                         while(a<=16)                                                   
  108.                                                                                 {
  109.                                                                                 lcd_putc(felsosor[a]);                         
  110.                                                                                 a++;                                                           
  111.                                                                                 }
  112.                        
  113.                                                                         lcd_putc("\n");
  114.                                                                         a=0;                                                                           
  115.                                                                         while(a<=16)                                                   
  116.                                                                                 {
  117.                                                                                 lcd_putc(alsosor[a]);                                  
  118.                                                                                 a++;                                                                   
  119.                                                                                 }
  120.                        
  121.                 delay_ms(50);
  122.  
  123.         }
  124.  
  125. }
(#) Prendick válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
Az szép feladat lesz.
Ahogy nézem a doksit, valami egészen trükkös az adatstruktúra. Még jelzőflag-ek is vannak a felső bájtban. Ezt most így hirtelen ki nem bogarászom neked. A doksi 25. oldalán van példaprogram, azt próbáld ki.
(#) n_yálastrubadúr hozzászólása Ápr 1, 2014 /
 
Sziasztok!
16f887 komparátor modulját próbálom használni infra megszakításra. Az AN0-án. Belső referenciával. Nem tudom mit csinálok rosszul. Be van állítva a megszakítás a C1IE. Ki is lép megszakításra, De nem követi rendesen az infrát mintha lassaban észlelné. Ugyanakkor a C1OUT hiába van kikapcslva, akkor is bekapcsolja a komparátor kivezetését a kimeneten, sőt az nem is csinál semmit csak mindig 1. Hol ronthatom el? Leheséges egyáltalán amit akarok?
(#) KaiserA válasza Hp41C hozzászólására (») Ápr 1, 2014 /
 
Szia!

Azt, az If-es szintaktikát azt altudnád nekem magyarázni? mert nem nagyon értem.
Mert valamiért ha nem kommentelem ki a részt, akkor kijelzőn semmisem jelenik meg, nem értem, de most alsosor végig változik, az érték alapból kb 135, és elmegy 200 ig is ha megfogom.
Köszönöm szépen!!!!
A hozzászólás módosítva: Ápr 1, 2014
(#) KaiserA válasza Prendick hozzászólására (») Ápr 1, 2014 /
 
Köszönöm szépen!
(#) Hp41C válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
  1. if ((fogadottadat & 0x10) == 0x10){ //TA < 0°C
  2.     fogadottadat = fogadottadat & 0x0F; //Clear SIGN)
  3.    Temperature = 256.0 - (fogadottadat *16 + (float)(fogadottadat2) / 16.0);
  4. }
  5. else //TA >= 0°C
  6.      Temperature = (fogadottadat * 16 +(float)(fogadottadat2)/ 16.0);

Ha a fogadottadat 4. bitje 1, azaz ha TA < 0°C,
akkor lemaszkolja a határátlépéseket és a előjelet jelző biteket
és kiszámolja a hőmérsékletet: Temperature = 256.0 - (fogadottadat *16 + (float)(fogadottadat2) / 16.0);
Egyébként (nálad erre megy, hiszen a 0xC1 -ben a 4. bit 0)
kiszámolja a hőmérsékletet: Temperature = ( (fogadottadat * 16 + fogadottadat2)/ 16.0);
(#) KaiserA válasza Hp41C hozzászólására (») Ápr 1, 2014 /
 
Szia!
Köszönöm, hogy segítesz.
A fogadottadatot ha kiiratom az LCD-re nálam egyenlő 193
A fogadottadat2 pedig most alapból 123, ha elkezdem melegíteni a szenzort, akkor a fogadottadat2, 220 ig is felmászik, de a fogadottadat mindig marad 193
Ha a Temperatur képletbe behelyettesitek, akkor mondjuk 193 és 123 as értékekkel:
Temperature = ((193*16+123/)/16) = 200 és ez igy még mindig nem vmi jo.

Mi lehet még a gond?

Köszönöm:
Adrián
(#) KaiserA válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
Temperature = (193 x 16 + 123 / 16)=3095
(#) vilmosd válasza KaiserA hozzászólására (») Ápr 1, 2014 /
 
  1. i2c_start(); // send START command
  2. i2c_write (AddressByte & 0xFE);     //WRITE Command (see Section 4.1.4 “Address Byte”)
  3. //also, make sure bit 0 is cleared ‘0’
  4. i2c_write(0x05); // Write TA Register Address
  5. i2c_start(); //Repeat START
  6. i2c_write(AddressByte | 0x01);      // READ Command (see  Section 4.1.4 “Address Byte”)
  7. //also, make sure bit 0 is Set ‘1’
  8. UpperByte = i2c_read(ACK);          // READ 8 bits
  9. //and Send ACK bit
  10. LowerByte = i2c_read(NAK);          // READ 8 bits
  11. //and Send NAK bit
  12. i2c_stop(); // send STOP command
  13. //Convert the temperature data
  14. //First Check flag bits
  15. if ((UpperByte & 0x80) == 0x80){    //TA³ TCRIT
  16. }
  17. if ((UpperByte & 0x40) == 0x40){    //TA> TUPPER
  18. }
  19. if ((UpperByte & 0x20) == 0x20){    //TA < TLOWER
  20. }
  21. UpperByte = UpperByte & 0x1F;       //Clear flag bits
  22. if ((UpperByte & 0x10) == 0x10){    //TA < 0°C
  23. UpperByte = UpperByte & 0x0F;   //Clear SIGN
  24. Temperature = 256 - (UpperByte x 16 + LowerByte / 16);
  25. }else //TA ³ 0°C
  26. Temperature = (UpperByte x 16 + LowerByte / 16);
  27. //Temperature = Ambient Temperature (°C)

Ez a kod a MCP9808 adatlapjaban talalhato.
A CCS C-ben a i2c_read(1) az i2c_read(ACK), mig a i2c_read(0) az i2c_read(NAK).
A hozzászólás módosítva: Ápr 1, 2014
(#) icserny válasza KaiserA hozzászólására (») Ápr 2, 2014 /
 
A 193-at 0x1F-fel maszkolni kell, hogy a jelzőbiteket ne számold már bele a hőmérsékletbe, tehát valójában csak 1 marad belőle.

Temperature = 1*16 + 123/16 = 23,6875 C

Ez jobban tetszik?
(#) Hp41C válasza KaiserA hozzászólására (») Ápr 2, 2014 /
 
Mennyival több információt ad egy kép.... Ha az MCP9808 A2, A1, A0 kivezetése mind magas szintre van húzva, akkor a címe az I2C buszon 0x3E és nem 0x30. Cím = 0x30 + A2 * 8 + A1 * 4 +A0 * 2. De akkor ki válaszot a 0x30 címre?
Látom már javítva...
(#) n_yálastrubadúr hozzászólása Ápr 2, 2014 /
 
Sziasztok!
Még midig a compare módot próbálgatom, most megszakítás nélkül nézem az infrát. Tulajdonképpen negálom és az így vett jelet nézem a pickit2 logikai analizátorával. De az így vett jel semmire sem jó. Nemtudom mivel lehet a baj, de nem hinném hogy ennyire lassú. Megnéztem az adatlapot az a le és felfutó élre 1000 és 600 ns ot ír. A változás érvényeségére 10us-ot. Szerintem jónak kéne lennie, máshol lehet a baj.
  1. TRISA = 0XF;
  2.         ANSEL = 0XF;
  3.  
  4.         CCP2CON = 0b00001000;
  5.  
  6.         VRCON   = 0b10101111;
  7.  
  8.         C2ON  =1;
  9. //      C2OUT =0;
  10.         C2OE  =0;
  11.         C2POL =0;
  12.         C2R   =1;
  13.         C2CH1 =0;
  14.         C2CH0 =1;      
  15. //----------------------
  16.  
  17.  
  18.  
  19.         for(;;) {
  20.  
  21.         if(C2OUT)PORTB=2;
  22.         else PORTB =0;
  23.  
  24. }
(#) n_yálastrubadúr válasza n_yálastrubadúr hozzászólására (») Ápr 2, 2014 /
 
Megvan a megoldás a C2RSEL nem volt egyre állítva. De viszont a C2OE hiába van 0-án a CCP2 kimenet mindig világít azaz mindig 1. Tehát nem is követi a C2OUT-ot, de kikapcsolni se tudom közvetlen már a portra írással hogy az 0 legyen.
(#) n_yálastrubadúr hozzászólása Ápr 2, 2014 /
 
Megvan ez is a CCP2CON-ban a comparator mód, csak belső beállítás. Mondjuk akkor nem értem minek a C2OE. De mostmár ott veszi az infrát, működik is. Újra szabad a kör megszakításra az RB0.
(#) Szamy hozzászólása Ápr 2, 2014 /
 
Üdv!
Kis segítséget kérnék, elakadtam: 18f8720, F6, F4, F3 -as portot hiába teszem 1-be, nincs változás a kimeneten. Van valami kizáró tényező esetleg ennél a típusnál? A "program" amivel a hibát keresem, most csak ezt a 3 portot teszi 1-be, semmi mást nem csinál.
Sajnos az adatlapot nem tudom csatolni mert 6 Mega.
A hozzászólás módosítva: Ápr 2, 2014
(#) Hp41C válasza Szamy hozzászólására (») Ápr 2, 2014 /
 
Analóg funkciók. Letiltásuk ld. Adatlap Example 10-6 Bár a kimenetnek működnie kellene. TRISF beállítása?
A hozzászólás módosítva: Ápr 2, 2014
(#) BESENYII hozzászólása Ápr 2, 2014 /
 
Sziasztok!
Úgy a fórum mint PIC- dolgaiban kezdő vagyok. C nyelvben c18-as fordítót használva, jelenleg pic18f4550 - es PIC szenvedi próbálkozásaimat.
Kérdésem az lenne, hol van elrontva - vagy hogy hol adjam meg a mellékelt programnak: LCD-n írja a PIC az a/d konverter értékét - egyszer, aztán megáll. Lehet maga a program szerkezete
is javítandó. Valahogy nem boldogulok a ciklus szervezéssel.
Ha tudnátok ötleteket adni, én kipróbálom hogy tanuljak azzal is.
Köszönöm!

printf.c
    
(#) icserny válasza BESENYII hozzászólására (») Ápr 2, 2014 /
 
A while(1) ciklus törzsébe (a kapcsos zárójelek közé) kell megadni azokat az utasításokat, amelyeket ismételgetni szeretnél. Most üres a ciklustörzs, tehát nem csinál semmit.

Ha kiíratás van, akkor célszerű egy késleltetést is berakni a ciklusba (a túl gyors villogást sem a szemed, sem az LCD nem tudná követni).
(#) Szamy válasza Hp41C hozzászólására (») Ápr 2, 2014 /
 
C -ben nézve úgy tűnik nagyjából megvan a hiba, legalábbis úgy néz ki, nem én vagyok stupid. A progi Flowcoddal készül, úgyhogy ott folytatom a hibakeresést. A lényeg, hogy rosszul címzi az F portot a progi.
Köszönöm!
(#) Pali79 hozzászólása Ápr 3, 2014 /
 
Sziasztok! Az LCD modulok kontraszt és háttér világításának szabályzását, hogy kell megoldani? Talán pwm?
(#) NyariG válasza Pali79 hozzászólására (») Ápr 3, 2014 /
 
Háttérvilágítás sima 5 volt ellenállással. Vagy pwm + ellenállás ha erősséget is akarsz állítani.
A kontrasztot a gnd és 5V közötti potival tudod állítani, de erre is hallatom pwm es megoldást...
(#) vicsys válasza Pali79 hozzászólására (») Ápr 3, 2014 /
 
PWM is jó megoldás, de használhatsz valami analóg módszert is. Én csak a háttérvilágítást csökkentem PWM-el, a kontraszthoz poti, vagy maximum (ha indokolt) egy tranyó ami ki/be kapcsolja.
Következő: »»   508 / 1222
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