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   1223 / 1223
(#) zenetom válasza treshold hozzászólására (») Jan 19, 2026 / 1
 
Úgy van ahogy majkimester írja.
Pl. a 18F1320-nál open-drain az RA4 kimenet, vagyis kell felhúzó ellenállás, lásd adatlap 8. oldal.
A 18F14K22-nél az RA4 "rendes" kimenet mint a többi, lásd adatlap 10. oldal.
Érdemes ezeket mindig megnézni az adatlapban.
Én anno amikor elkezdtem ezzel foglalkozni, a 18F1320-nál szaladtam be ebbe, és nem értettem hirtelen mit rontottam el.
(#) treshold válasza majkimester hozzászólására (») Jan 19, 2026 /
 
Ezt úgy érted, hogy ha le akarom húzni akkor kimenetre állítom, ha nem akkor bemenet?

Gondolom az nem működik hogy kimeneten magas szintet ad és a vonalon lévő külső tranzisztor meg lehúzza.
(#) majkimester válasza treshold hozzászólására (») Jan 19, 2026 / 1
 
Igen,

PORTA,RA4 = 0 és TRISA.RA4-et váltod.

TRISA.RA4 = 0 -> kimenet, tehát GND-re húz
TRISA.RA4 = I -> bemenet, azaz nagy impedanciás

Az nem megy, hogy normál kimenetnél te magasba a külső tranzisztor meg alacsonyba akarja húzni. A gyengébb (ami Murphy szerint a kontrolleren belüli) tönkre is megy.
(#) treshold válasza majkimester hozzászólására (») Jan 19, 2026 /
 
Szuper, Köszi az infót. Így már jó lesz.
(#) fotomen32 hozzászólása Csü, 12:19 /
 

Progi fordítása HEX re

Üdv mindenkinek
Sajnos nagyon kezdő vagyok a programok világában de szeretnék építeni egy áramkört pic16f887 ic vel.
Az AI vel írattam egy programot amit szeretnék kipróbálni de sajnos nem HEX fájlt küldött így nem tudom beégetni az ic be.Esetleg valaki letudná nekem fordítani.
Erről lenne szó:
  1. /*
  2.  
  3.  * Fájl: kabel_teszter_16f887.c
  4.  
  5.  * Eszköz: PIC16F887
  6.  
  7.  * Funkció: 16 eres kábel folytonosság és zárlat tesztelő
  8.  
  9.  */
  10.  
  11.  
  12.  
  13. #include <xc.h>
  14.  
  15.  
  16.  
  17. // --- KONFIGURÁCIÓS BITEK ---
  18.  
  19. #pragma config FOSC = INTRC_NOCLKOUT // Belső oszcillátor használata (RA6, RA7 szabad)
  20.  
  21. #pragma config WDTE = OFF // Watchdog Timer kikapcsolva
  22.  
  23. #pragma config PWRTE = ON // Bekapcsolási időzítő bekapcsolva
  24.  
  25. #pragma config MCLRE = ON // MCLR láb aktív (1. láb)
  26.  
  27. #pragma config CP = OFF // Kódvédelem ki
  28.  
  29. #pragma config BOREN = ON // Barna-kiütés figyelő be
  30.  
  31. #pragma config LVP = OFF // Alacsony feszültségű programozás ki
  32.  
  33.  
  34.  
  35. #define _XTAL_FREQ 4000000 // 4 MHz belső órajel
  36.  
  37.  
  38.  
  39. // --- I/O DEFINÍCIÓK ---
  40.  
  41. #define LED_ZOLD RC7 // 26. láb
  42.  
  43. #define LED_PIROS RA6 // 31. láb
  44.  
  45. #define INDITO_GOMB RA7 // 32. láb
  46.  
  47.  
  48.  
  49. // Segédfüggvény a kimenetek kezeléséhez (i = 0-15)
  50.  
  51. void set_kimenet(int i, int state) {
  52.  
  53.     if (i < 8) {
  54.  
  55.         if (state) PORTB |= (1 << i); else PORTB &= ~(1 << i);
  56.  
  57.     } else {
  58.  
  59.         int bit = i - 8;
  60.  
  61.         if (state) PORTD |= (1 << bit); else PORTD &= ~(1 << bit);
  62.  
  63.     }
  64.  
  65. }
  66.  
  67.  
  68.  
  69. // Segédfüggvény a bemenetek beolvasásához (i = 0-15)
  70.  
  71. int get_bemenet(int i) {
  72.  
  73.     if (i < 6) return (PORTA >> i) & 1; // RA0-RA5 (B1-B6)
  74.  
  75.     if (i < 9) return (PORTE >> (i - 6)) & 1; // RE0-RE2 (B7-B9)
  76.  
  77.     return (PORTC >> (i - 9)) & 1; // RC0-RC6 (B10-B16)
  78.  
  79. }
  80.  
  81.  
  82.  
  83. void main(void) {
  84.  
  85.     // --- PORTBEÁLLÍTÁSOK ---
  86.  
  87.     OSCCON = 0x61; // 4 MHz belső órajel beállítása
  88.  
  89.     ANSEL = 0; // Összes analóg bemenet kikapcsolása (Fontos!)
  90.  
  91.     ANSELH = 0;
  92.  
  93.  
  94.  
  95.     // Irányok (0=Kimenet, 1=Bemenet)
  96.  
  97.     TRISB = 0x00; // K1-K8 kimenet
  98.  
  99.     TRISD = 0x00; // K9-K16 kimenet
  100.  
  101.    
  102.  
  103.     TRISA = 0xBF; // RA6 kimenet (LED), többi bemenet
  104.  
  105.     TRISC = 0x7F; // RC7 kimenet (LED), többi bemenet
  106.  
  107.     TRISE = 0x07; // PORTE bemenet
  108.  
  109.  
  110.  
  111.     // Kezdőállapot
  112.  
  113.     PORTB = 0;
  114.  
  115.     PORTD = 0;
  116.  
  117.     LED_ZOLD = 0;
  118.  
  119.     LED_PIROS = 0;
  120.  
  121.  
  122.  
  123.     while(1) {
  124.  
  125.         // Várunk a gomb megnyomására
  126.  
  127.         if (INDITO_GOMB == 1) {
  128.  
  129.             __delay_ms(50); // Pergésmentesítés
  130.  
  131.            
  132.  
  133.             LED_ZOLD = 0;
  134.  
  135.             LED_PIROS = 0;
  136.  
  137.             int hiba_flag = 0;
  138.  
  139.  
  140.  
  141.             // --- TESZTELÉSI CIKLUS ---
  142.  
  143.             for (int i = 0; i < 16; i++) {
  144.  
  145.                 // 1. Minden kimenet lekapcsol
  146.  
  147.                 PORTB = 0; PORTD = 0;
  148.  
  149.                
  150.  
  151.                 // 2. Csak az aktuális kimenet bekapcsol
  152.  
  153.                 set_kimenet(i, 1);
  154.  
  155.                 __delay_ms(5); // Rövid várakozás a jel terjedésére
  156.  
  157.  
  158.  
  159.                 // 3. ELLENŐRZÉS: Csak a hozzá tartozó bemenet magas?
  160.  
  161.                 for (int j = 0; j < 16; j++) {
  162.  
  163.                     int be_szint = get_bemenet(j);
  164.  
  165.                    
  166.  
  167.                     if (i == j) {
  168.  
  169.                         // Itt "1"-et várunk (Folytonosság)
  170.  
  171.                         if (be_szint == 0) hiba_flag = 1;
  172.  
  173.                     } else {
  174.  
  175.                         // Itt "0"-át várunk (Nincs zárlat)
  176.  
  177.                         if (be_szint == 1) hiba_flag = 1;
  178.  
  179.                     }
  180.  
  181.                 }
  182.  
  183.                
  184.  
  185.                 if (hiba_flag) break; // Ha hiba van, nem kell tovább nézni
  186.  
  187.             }
  188.  
  189.  
  190.  
  191.             // --- EREDMÉNY KIJELZÉSE ---
  192.  
  193.             if (hiba_flag) {
  194.  
  195.                 LED_PIROS = 1;
  196.  
  197.                 LED_ZOLD = 0;
  198.  
  199.             } else {
  200.  
  201.                 LED_ZOLD = 1;
  202.  
  203.                 LED_PIROS = 0;
  204.  
  205.             }
  206.  
  207.            
  208.  
  209.             // Várunk, amíg elengedik a gombot
  210.  
  211.             while(INDITO_GOMB == 1);
  212.  
  213.         }
  214.  
  215.     }
  216.  
  217. }

Előre is köszönöm a segítségeteket
A hozzászólás módosítva: Csü, 16:33
Moderátor által szerkesztve
(#) Bakman válasza fotomen32 hozzászólására (») Csü, 23:29 / 2
 
Pancsolj, lásd melléklet. A konfigurációt kiegészítettem, mert hiányos volt, erre:

  1. #pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  2. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
  3. #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
  4. #pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
  5. #pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
  6. #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
  7. #pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
  8. #pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
  9. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
  10. #pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
  11.  
  12. // CONFIG2
  13. #pragma config BOR4V = BOR21V   // Brown-out Reset Selection bit (Brown-out Reset set to 2.1V)
  14. #pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


A programot nem ellenőriztem semmilyen formában, csak fordítottam (ingyenes verzójú XC8).
(#) Bakman válasza Bakman hozzászólására (») Pé, 0:22 / 1
 
Mármint parancsolj és ne csak pancsolj.
(#) fotomen32 válasza Bakman hozzászólására (») Pé, 9:06 /
 
Hálás köszönet a pic et megrendeltem ha megérkezik már próbálom is ki.
Következő: »»   1223 / 1223
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