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   172 / 1211
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Bementre állítást a TRISB regiszterrel kell megoldani.
ADATLAP kukkolás !!!!!!!
(#) doup válasza doup hozzászólására (») Nov 12, 2011 /
 
Ebben az esetben meg kell várjam hogy lefusson a ciklus tehát ebben nincs megszakítás még nem használtam és nem is tudom hogyan kell ebben szeretném a segítségedet.
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Igazad van azt ki is javítottam TRISA0 = 0XFF; mert erre kötöttem a gombot
(#) doup hozzászólása Nov 12, 2011 /
 
Valami ilyesminek kellene lenni de én nem az INT-re kötném a gombot hanem az A0-ra a 16f877a esetén
  1. void interrupt (){
  2.          if (INTCON.INTF){
  3.            button_pressed = 1;
  4.            INTCON.INTF = 0;
  5.          }
  6. }

ez így jó?
(#) doup hozzászólása Nov 12, 2011 /
 
Sajna ez így nem működik
  1. void interrupt (){
  2.          if (PORTA.RB0 == 0){
  3.            button_pressed = 1;
  4.            PORTA.RB0 = 1;
  5.          }
  6. }
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Nem kell azt a megszakító rutinba tenni, jó helyen van a főprogramban. Egyébként törekedj arra, hogy az IT rutin amennyire csak lehet rövid futamidejű legyen, ez így egészséges. Itt egy részlet a BUTTON függvény helpjéből.

if (Button(&PORTA, 0, 1, 1)) { // Detect logical one
oldstate = 1; // Update flag
}
if (oldstate && Button(&PORTA, 0, 1, 0)) { // Detect one-to-zero transition
PORTC = ~PORTC; // Invert PORTC
oldstate = 0; // Update flag

Ami pergésmentesen kezeli, ebben az esetben 1msec idővel.
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
A gombbal viszont földre szeretném húzni a lábat így is jó ez a kódrészlet?
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Ha értelmeznéd a progit, akkor látnád, hogy igen jó.
PORTA után első érték a port pin lába, a második a prellidő msec-ben, a harmadik az aktív szint.

if (Button(&PORTA, 0, 1, 1)) { // ha nincs nyomva

if (oldstate && Button(&PORTA, 0, 1, 0)) //ha nyomva van
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Csak nekem mindig az else ágban van a progi akár nyomok akár nem.
  1. // LCD beállítás
  2. sbit LCD_RS at RB4_bit;
  3. sbit LCD_EN at RB5_bit;
  4. sbit LCD_D4 at RB0_bit;
  5. sbit LCD_D5 at RB1_bit;
  6. sbit LCD_D6 at RB2_bit;
  7. sbit LCD_D7 at RB3_bit;
  8.  
  9. sbit LCD_RS_Direction at TRISB4_bit;
  10. sbit LCD_EN_Direction at TRISB5_bit;
  11. sbit LCD_D4_Direction at TRISB0_bit;
  12. sbit LCD_D5_Direction at TRISB1_bit;
  13. sbit LCD_D6_Direction at TRISB2_bit;
  14. sbit LCD_D7_Direction at TRISB3_bit;
  15. //~
  16.  
  17. //Változók deklarálásának listája
  18. unsigned short read_ds1307(unsigned short address );
  19. void write_ds1307(unsigned short address,unsigned short w_data);
  20. unsigned short sec;
  21. unsigned short minute;
  22. unsigned short hour;
  23. unsigned short day;
  24. unsigned short date;
  25. unsigned short month;
  26. unsigned short year;
  27. unsigned short dat;
  28. char time[9];
  29. char tim[9] = {'1','8',':','3','0',':','0','0','\0'};
  30. char ddate[11];
  31. const unsigned short TEMP_RESOLUTION = 9;
  32. char *text = " 00.0", text_sign;
  33. unsigned temp;
  34. int homerseklet = 0, k = 0, i = 0, j = 0, gomb = 0;
  35. char text2[12] = {'T','h','e','m','p','e','r','a','t','u','r','e'};
  36. char textsign[2] = {'°', 'C'};
  37. char oldstate = 0;
  38. unsigned char BCD2UpperCh(unsigned char bcd);
  39. unsigned char BCD2LowerCh(unsigned char bcd);
  40. //~
  41.  
  42. void interrupt (){
  43.  
  44. }
  45.  
  46. void Display_Temperature(unsigned int temp2write) {
  47.     const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  48.     char temp_whole;
  49.     unsigned int temp_fraction;
  50.  
  51.     //--- Hőmérséklet negatív részének vizsgálata
  52.     if (temp2write & 0x8000) {
  53.         text[0] = '-';
  54.         temp2write = ~temp2write + 1;
  55.     }
  56.     //--- Egész rész
  57.     temp_whole = temp2write >> RES_SHIFT ;
  58.  
  59.     //--- Egész rész karakterré konvertálás
  60.     if (temp_whole/100)
  61.         text[0] = temp_whole/100 + 48;
  62.  
  63.     text[1] = (temp_whole/10)%10 + 48; //--- Tizes digit
  64.     text[2] = temp_whole%10 + 48;      //--- Egyes digit
  65.  
  66.     //--- Előjel nélküli egészre konvertálás
  67.     temp_fraction = temp2write << (4-RES_SHIFT);
  68.     temp_fraction &= 0x000F;
  69.     temp_fraction *= 625;
  70.  
  71.     //--- Konvertálás karakterré
  72.     text[4] = temp_fraction/1000 + 48;     //--- Ezres digit
  73.  
  74.     //--- Hőmérséklet kiírása az LCD-re
  75.     for(k = 0; k < strlen(text); k++)
  76.     {
  77.           Lcd_Chr(2, 5+k, text[k]);
  78.           Delay_ms(150);
  79.     }
  80.     for(k = 0; k < 2; k++)
  81.     {
  82.           Lcd_Chr(2, 10+k, textsign[k]);
  83.           Delay_ms(150);
  84.     }
  85. }
  86.  
  87. void Homerseklet_lekerdezes()
  88. {
  89.      //--- Hőmérséklet értékének kiolvasása
  90.     Ow_Reset(&PORTD, 0);
  91.     Ow_Write(&PORTD, 0, 0xCC);
  92.     Ow_Write(&PORTD, 0, 0x44);
  93.     Delay_ms(1000);
  94.  
  95.     Ow_Reset(&PORTD, 0);
  96.     Ow_Write(&PORTD, 0, 0xCC);
  97.     Ow_Write(&PORTD, 0, 0xBE);
  98.  
  99.     temp =  Ow_Read(&PORTD, 0);
  100.     temp = (Ow_Read(&PORTD, 0) << 8) + temp;
  101.  
  102.     Display_Temperature(temp);
  103. }
  104.  
  105. unsigned short cnt;
  106.  
  107. void main(){
  108.      I2C1_Init(100000);
  109.      PORTB = 0;
  110.      TRISB = 0;
  111.      TRISA = 0XFF;
  112.      PORTA = 0x00;
  113.      TRISD = 0;
  114.      PORTD = 0;
  115.      TRISC = 0xFF;
  116.      Lcd_Init();
  117.      Lcd_Cmd(_Lcd_CLEAR);
  118.      Lcd_Cmd(_Lcd_CURSOR_OFF);
  119.      write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
  120.      write_ds1307(1,0x34); //write min 27
  121.      write_ds1307(2,0x10); //write hour 14
  122.      write_ds1307(3,0x02); //write day of week 2:Monday
  123.      write_ds1307(4,0x12); // write date 17
  124.      write_ds1307(5,0x11); // write month 6 June
  125.      write_ds1307(6,0x11); // write year 8 --> 2008
  126.      write_ds1307(7,0x10); //SQWE output at 1 Hz
  127.      write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
  128.  
  129.      while(1)
  130.      {
  131.              if (Button(&PORTA, 0, 1, 1)) { // Detect logical one
  132.              oldstate = 1; // Update flag
  133.              }
  134.              if (oldstate && Button(&PORTA, 0, 1, 0)) { // Detect one-to-zero transition{
  135.              //IDŐ MEGJELENÍTÉSE
  136.              for(i = 0; i <=29; i++)
  137.              {
  138.                    sec=read_ds1307(0); // másodperc kiolvasása
  139.                    minute=read_ds1307(1); // perc kiolvasása
  140.                    hour=read_ds1307(2); // óra kiolvasása
  141.                    day=read_ds1307(3); // nap kiolvasása
  142.                    date=read_ds1307(4); // dátum kiolvasása
  143.                    month=read_ds1307(5); // hónap kiolvasása
  144.                    year=read_ds1307(6); // év kiolvasása
  145.  
  146.                    time[0] = BCD2UpperCh(hour);
  147.                    time[1] = BCD2LowerCh(hour);
  148.                    time[2] = ':';
  149.                    time[3] = BCD2UpperCh(minute);
  150.                    time[4] = BCD2LowerCh(minute);
  151.                    time[5] = ':';
  152.                    time[6] = BCD2UpperCh(sec);
  153.                    time[7] = BCD2LowerCh(sec);
  154.                    time[8] = '\0';
  155.  
  156.                    ddate[0] = '2';
  157.                    ddate[1] = '0';
  158.                    ddate[2] = BCD2UpperCh(year);
  159.                    ddate[3] = BCD2LowerCh(year);
  160.                    ddate[4] ='.';
  161.                    ddate[5] = BCD2UpperCh(month);
  162.                    ddate[6] = BCD2LowerCh(month);
  163.                    ddate[7] ='.';
  164.                    ddate[8] = BCD2UpperCh(date);
  165.                    ddate[9] = BCD2LowerCh(date);
  166.                    ddate[10] = '\0';
  167.                    
  168.                    Lcd_Out(1,5,time);
  169.                    Lcd_Out(2,4,ddate);
  170.                    Delay_ms(1000);
  171.                    if(i == 29)
  172.                    {
  173.                         for(k = 0; k < 13; k++)
  174.                         {
  175.                               Lcd_Cmd(_LCD_SHIFT_RIGHT);
  176.                               Delay_ms(100);
  177.                         }
  178.                         Lcd_Cmd(_LCD_CLEAR);
  179.                    }
  180.               }
  181.               //~
  182.              
  183.               //HŐMÉRSÉKLET MEGJELENÍTÉSE
  184.               for(j = 0; j <= 10; j++)
  185.               {
  186.                     for(k = 0; k < 12; ++k)
  187.                     {
  188.                           Lcd_Chr(1, 3+k, text2[k]);
  189.                           Delay_ms(150);
  190.                     }
  191.                     Homerseklet_lekerdezes();
  192.                     if(j == 10)
  193.                     {
  194.                          for(k = 0; k < 13; k++)
  195.                          {
  196.                                Lcd_Cmd(_LCD_SHIFT_RIGHT);
  197.                                Delay_ms(100);
  198.                          }
  199.                          Lcd_Cmd(_LCD_CLEAR);
  200.                     }
  201.               }
  202.               //~
  203.               oldstate = 0;
  204.               }
  205.               else
  206.                   Lcd_Out(1,1,"Setup");
  207.        }
  208. }
  209.  
  210. unsigned short read_ds1307(unsigned short address)
  211. {
  212.          I2C1_Start();
  213.          I2C1_Wr(0xd0);
  214.          I2C1_Wr(address);
  215.          I2C1_Repeated_Start();
  216.          I2C1_Wr(0xd1);
  217.          dat=I2C1_Rd(0);
  218.          I2C1_Stop();
  219.          return(dat);
  220. }
  221.  
  222. unsigned char BCD2UpperCh(unsigned char bcd)
  223. {
  224.          return ((bcd >> 4) + '0');
  225. }
  226.  
  227. unsigned char BCD2LowerCh(unsigned char bcd)
  228. {
  229.          return ((bcd & 0x0F) + '0');
  230. }
  231. void write_ds1307(unsigned short address,unsigned short w_data)
  232. {
  233.          I2C1_Start();
  234.          I2C1_Wr(0xD0);
  235.          I2C1_Wr(address);
  236.          I2C1_Wr(w_data);
  237.          I2C1_Stop();
  238. }
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Felhúzó ellenállás van a PortA.0-on? Pl. 10kohm a VCC-re.
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
van rajta
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Egyszer sem történik meg a gomb utáni program futása?
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Sajnos nem!
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Próbáld kizárni a programod hibáját. Mondjuk a...

if (oldstate && Button(&PORTA, 0, 1, 0)) {

sor utáni rész helyett, egy egyszerű

PORTD ~= PORTD;

sorra cseréld le. Így a portd mutatja a gomb jó kezelését.
Utánna szép sorba vissza kerülhet a kódod.
(#) dawe69hun hozzászólása Nov 12, 2011 /
 
Helló! Tudna nekem valaki segíteni, hogy hogyan kell bekötni egy 16F627A PIC-et áramkörbe? Az lenne a legjobb ha egy kapcsolást mutatnátok róla. 5 voltra akarom kötni, adapterre. A lehető legegyszerűbb kapcsolásra lenne szükségem. Az RB2 re fogok kötni ledet de a többit nem tudom pontosan, hova kell kötni. Nagyon kezdő vagyok.
(#) röntgen válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Ez így tényleg nehéz lesz. A doksit azért nem árt odakészítened.
Egy biztos, kell neki táp, oszci.
VSS 5.láb -> GND
VDD 14.láb -> +5V
osci 15 és 16.láb
Reset 4.láb -> egy 4.7Kohm a +5V-ra.
(#) dawe69hun válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Az Osci kötelező? Nincs beépített? Mire használja a PIC azt?
(#) doup válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Én így kötném be. A kvarc kötelező különben mihez képest időzítenél pl led villogtatás? Ja és a kvarcnál azok kerámia kondenzátorok. A configurációs biteket mikor állítod be figyelj oda hogy milyen kvarcot használsz mert 4Mhz-ig XT, 4-20MHZ-ig pedig már HS a configurációs bit.

16f627A.jpg
    
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Szerintem én még utánanézek ennek a megszakításoknak mert nem igazán értem. Majd később ha nem megy visszatérek a fórumhoz.
(#) dawe69hun válasza doup hozzászólására (») Nov 12, 2011 /
 
Köszi Meg is építem... Megpróbálom
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Nem feltétlen, hiszen van belső RC oszcija is, ha jól nézem a doksit. Azzal a megkötéssel, hogy megelégszünk a 4MHz órajellel. Neked ez tökéletesen megfelel. Így oda nem kell kötni, lehet másra használni a lábakat.
(#) doup válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
És miben írod a programot? Illetve mivel égeted?
(#) dawe69hun válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Tehát az Osci nem kell. Oda nem is kötök semmit. a többi pedig jó doup ábrája szerint gondolom. Azt úgy bekötöm.
(#) dawe69hun válasza doup hozzászólására (») Nov 12, 2011 /
 
A programot microPascal PRo ban írom, mivel a pascalt jól ismerem. és az égetőmhöz adtak software-t valami MicroPro DiY K149_BC a neve.
(#) röntgen válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Én inkább a C-t vágom, de ha nem tudlak lebeszéni róla, akkor amit szeretsz azt használod. A progizó látom nem incircuit , így viszont ajánlom valami szimulátorban a program tesztelését amennyire lehetséges, mert így nincs a sok IC ki-be rakosgatás, kinlódás.
(#) dawe69hun válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Jah használok többet is...ISIS ben is tesztelem és PIC Simulator ban is. De a programokkal jobban bánok, mint az áramkör összerakással, de nagyon érdekel.
(#) röntgen válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Az ISISt én is kedvelem. Az jó lesz, azzal nagyon könnyen megy a szimuláció.
(#) El_Pinyo válasza dawe69hun hozzászólására (») Nov 12, 2011 /
 
Javaslom olvasd el a topik tetején levő összefoglalást, nem véletlenül került az oda. A felhúzó ellenállás meg 10k legyen. A táplábak közé 100nF kerámia is kell.
Az adapter nem biztos, hogy nyerő ötlet, nem mindegyik stabilizált, a kontrollernek meg nem árt a stabil tápfeszültség.
(#) dawe69hun válasza El_Pinyo hozzászólására (») Nov 12, 2011 /
 
Mit jelent, hogy a táplábak közé 100nF kerámia kell? Mármint értem, de azt hogy kell bekötni?
(#) dawe69hun válasza doup hozzászólására (») Nov 12, 2011 /
 
Összeraktam a kapcsolásodat, de nem akar működni. :S A program jó amit írtam. a kapcsolásban mindent leellenőriztem úgy raktam össze, ahogy írtad, de nem megy :S

Módosítva!:
Mégis megy, csak nagyon halványan világít a led. Alig látni.
Következő: »»   172 / 1211
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