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   632 / 1210
(#) killbill válasza don_peter hozzászólására (») Feb 7, 2015 /
 
Igazad lehet, de majd a kerdezo megmondja, hogy mire volt pontosan kivancsi. PIC tipust nem adott meg.
Idézet:
„Szerintem itt tök mindegy, hogy az LCD vezérlője mennyire nagyon gyors, hogy ha a PIC nem tudja olyan tempóval kitolni az adatot, vagy nem ilyen irányú volt a kérdése?”
Igen, ha a PIC nem tudja olyan gyorsan, akkor mindegy. De ha tudja a PIC, akkor nem mindegy. En speciel PIC32-n hasznaltam ezt a kijelzot, es az birta. Viszont a 4x16-os HD44780-nal meg a pic16c84 is gyorsabb...
(#) SKY válasza killbill hozzászólására (») Feb 7, 2015 /
 
Sziasztok!
Köszönöm a választ. Értem a felvetődött problémát, de csak általánosságban kérdeztem, egy mérőeszköz topológiájának eldöntéséhez. Konkrétan, hogy ha van két külső ADC, akkor elég csak 1 PIC-el kezelni őket és utána (közben) kiértékelni az eredményeket, vagy a megszakítás nélküli méréshez érdemesebb volna egy gyengébb PIC-et beiktatni a nagyobb teljesítményű PIC és az ADC-k közé, hogy miközben számításokat és kommunikációt végez a kisebb ezalatt is kezelje az ADC-ket és gyűjtse a mintákat? A példa kedvéért a két ADC 1MSPS soros kommunikációval az erős PIC meg egy 24FJ128, persze tudom hogy ez attól is függ, hogy egyáltalán mik azok a számítások, amiket közben el kell végezni...
(#) killbill válasza SKY hozzászólására (») Feb 7, 2015 /
 
Nezd! A kijelzo frissitese gyakorlatilag nem vesz el idot, mert a hatterben tortenik. Legalabbis, ha ilyen a feladat, akkor erdemes ott csinalni. Tartasz a memoriaban 4 x 16 byte-ot, es abba irod a kiirando szoveget. Es egy ettol fuggetlen megoldassal x idonkent (100us..1ms) kiviszel mindig egy ujabb byte-ot a kijelzonek. Maga a byte atvitel a kijelzo fele az minimalis ido 2..3us. Ez a grafikus kijelzonel kicsit problemasabb, mert ott 1kbyte RAM kellene erre a celra, es azt nem eleg byte-onknet 100us frissiteni, mert az mar lassu lesz. Ott inkabb burst-osen erdemes ezt megoldani. Az 24FJ128-ban 8 byte FIFO van az SPI-ben, az mar egesz hasznalhato lenne.
De egyebkent meg ha a meres maga preciz kell legyen, akkor az nyilvan valami timer interrupt alapon megy, es az adatot folyamatosan puffereled, igy nem lesz adatvesztes, felteve, hogy az emlitett szamitasokat egyaltalan el tudja vegezni a processzor. Bar, ket 1MSPS A/D az 8 bit mellett is 2 megabyte/s adat, amit egy 32 MHz orajelu processzorral feldolgozni... Hát, nem tudom. Tenyleg kerdes, hogy mit kell szamolni az adaton.
(#) edison14 válasza edison14 hozzászólására (») Feb 7, 2015 /
 
Sziasztok!

Ma kísérletezgettem a másik PIC-el és ott is tökéletesen működik a megszakítás kívülről. Az INT0 külső megszakítás nem csak felébreszti a vezérlőt hanem a megszakítást is végrehajtja. Viszont van egy olyan probléma, hogy a feszültség ráadásakor a PIC mintha nem indulna el. Nem kapcsol be az INT0-ás lábon a felhúzóellenállás sem. Ez mitől lehet?
(#) cross51 válasza edison14 hozzászólására (») Feb 8, 2015 /
 
Esetleg egy SLEEP utasítás miatt? Gondolom a program és az include változott, ismeretük nélkül nehéz megmondani.
A hozzászólás módosítva: Feb 8, 2015
(#) edison14 válasza cross51 hozzászólására (») Feb 8, 2015 /
 
Szia!

Nem volt benne sleep, de már rájöttem, hogy az oszcillátor beállításánál volt valami gubanc. Már megy rendesen.
(#) r.laci hozzászólása Feb 9, 2015 /
 
Sziasztok!

Én is szeretnék elkezdeni PIC-et programozni, régebbről van egy PIC16F877-es icém, de a soros portos égető nem működött nekem se.
Egy megbízható USB-ről működő égetőt szeretnék készíteni.
A neten nagyon sok rajzot láttam,de nem sikerült döntenem melyik az ami biztosan működik, és hogy megfelelő-e egyáltalán ehhez az ic-hez.
Valaki tud linkelni valami jó építési leírást, ami mindenképp működőképes és nem kell magához az égetőhöz is programozni?
Válaszotokat előre is köszönöm!
(#) Pali79 válasza r.laci hozzászólására (») Feb 9, 2015 /
 
Az a gond, hogy az usb-s programozókhoz kell egy felprogramozott pic. Viszont anyagilag nem éri meg az utánépítéssel foglalkozni, csak ha építés kedvéért. Pár oldallal viszább valaki próbálkozott a párhuzamos égetővel. Ha jól emlékszem itt a cikkek között meg van a leírása. Viszont ha komolyan akarsz pic-ekkel foglalkozni, tök olcsón lehet venni pickit2-öt, mert már régóta van belőle 3-as.
(#) ic20 hozzászólása Feb 9, 2015 /
 
Sziasztok!

Szeretnék egy kis segítséget kérni lehet hülyeséget fogok kérdezni, meg építettem Topi mester óráját de nem indult el az óra teljesen át ellenőriztem a nyákot kétszer hogy szakadás vagy elkötés lenne az oka, hogy nem működik. Lehetséges-e az úgy elindítani az órát, hogy egy invertert kötök be teljesre és egy szegmenst kötőkbe a shift regisztere azért hogy ellenőrizem a chip működését mert sejtésem szerint a kínai testvérektől vett mikróvezérló a hibás a program felégetése sikeres bele de még is a chip attól függetlenül hibás.
Válaszokat előre is köszönöm.
(#) Pali79 válasza ic20 hozzászólására (») Feb 9, 2015 / 1
 
Az inverter bemenetét magas szintre húzva, a shift regisztert megfelelően vezérelve elméletileg működésbe hozható a kijelző.
(#) kzozo hozzászólása Feb 9, 2015 /
 
Sziasztok. Belefutottam egy hibába, amit nem tudok megoldani. 16F877A-t programozok A programban van megszakításkezelés (csak TMR0), és ki-bemenetek kezelése. Azt vettem észre, hogy egy bizonyos programméret fölött a PIC vagy nem indul el, vagy nem azt csinálja amit kell. A mellékelt képen is látszik, hogy a programmemória tartalma a 013E címig tart, ami ennél a PIC-nél semmi. Ha akár a főprogram elejét feltöltöm NOP-okkal, akkor is ugyanez lesz. Fordítónak az MPASMwin v5.30.01-et használom.
Tudja valaki, mitől lehet ez? Előre is köszönöm. Üdv: Zoli

PICKIT2.jpg
    
(#) Pali79 válasza kzozo hozzászólására (») Feb 9, 2015 /
 
Szerintem a pclath regiszter feltöltésének hiánya okozza. A program átnyúlik egy másik memória lapra valószínűleg.
(#) kzozo válasza Pali79 hozzászólására (») Feb 9, 2015 /
 
A lapok nem 2K távolságra vannak? Én még bőven az első lap elején tartok csak.
(#) Pali79 válasza kzozo hozzászólására (») Feb 9, 2015 /
 
Elméletileg igen, de nekem is már többször fordult elő hasonló hiba, és én sem értettem a dolgot, de ez mindig meghozta a sikert. Esetleg nézd meg szimulátorba, hogy ha lépésenként mész, akkor valamikor nem ugrik-e vissza az elejére.
(#) kzozo válasza Pali79 hozzászólására (») Feb 9, 2015 /
 
Még lapváltást soha nem kellett használnom, pedig volt nagyobb programom is, igaz az 16F628-on.
Szimulátort sem használtam még. A szoftvert szövegszerkesztővel írom, MPASM-mel fordítom, és PICKIT2 programmerrel töltöm fel.
(#) Pali79 válasza kzozo hozzászólására (») Feb 9, 2015 /
 
Én is hasonlóan csinálom. A logikát én sem mindig értem, de tény, hogy ha regisztert lekezelem, akkor általában jó szokott lenni.
(#) kissi válasza kzozo hozzászólására (») Feb 9, 2015 / 1
 
Szia !

Szerintem használsz benne RETLW-t... na, az csak 256 byte-on belül lehet "alapból" !
A legegyszerűbb, hogy a táblázatodat tedd a program elejére !
A hozzászólás módosítva: Feb 9, 2015
(#) Pali79 válasza kissi hozzászólására (») Feb 9, 2015 /
 
Na akkor itt a válasz, hogy mi benne a logika. Nekem szövegtábla van a legvégén és vagy pagesel-lel volt jó vagy így:
  1. movlw   HIGH Text2
  2. movwf   PCLATH
(#) kzozo válasza kissi hozzászólására (») Feb 10, 2015 /
 
Igen, egymàs után van két db 10 elemű. Ez jó ötlet. Bár a megszakítás rutin sem rövid, de megpróbálom.
(#) kzozo válasza Pali79 hozzászólására (») Feb 10, 2015 /
 
Az is megoldás hogy a táblázatot a PAGE1-re tenném, a főprogram meg maradna a PAGE0-án?

Főproram:
...
...
...
BCF PCLATH,4
BSF PCLATH,3 ;Select page 1
CALL TABLA


ORG 0x800 ;PAGE 1 kezdete
TABLA
RETLW D'1'
RETLW D'2'
RETLW D'3'
...
...

Ez így jó?
(#) Hp41C válasza kzozo hozzászólására (») Feb 10, 2015 / 1
 
  1. Főproram:
  2. ...
  3. ...
  4. ...
  5. BCF PCLATH,4
  6. BSF PCLATH,3 ;Select page 1
  7. CALL TABLA
  8. clrf PCLATH;  Select page 0
  9.  
  10. ORG 0x800 ;PAGE 1 kezdete
  11. TABLA
  12. RETLW D'1'
  13. RETLW D'2'
  14. RETLW D'3'
  15. ...
A hozzászólás módosítva: Feb 10, 2015
(#) kzozo válasza Hp41C hozzászólására (») Feb 10, 2015 /
 
Köszönöm, este megpróbálom. (a fenti példámban tábla elejéről kimaradt az ADDWF PCL,F)
(#) Hp41C válasza kzozo hozzászólására (») Feb 10, 2015 /
 
A call TABLE által meghívott rutin visszatérése után a PCLATH változatlan marad, így a következőkben végrehajtandó ugrások, hívások mind az 1. lapra hivatkoznának. Ennek elkerülésére a visszatérés után a PCLATH -t a 0. lapnak megfelelően kell beállítani.
A hozzászólás módosítva: Feb 10, 2015
(#) kzozo válasza Hp41C hozzászólására (») Feb 10, 2015 /
 
Igen, nekem is így logikus, az adatlapban lévő EXAMPLE ezt nem teszi meg, ezért nem írtam ide én sem, de egyértelmű hogy kell.
A hozzászólás módosítva: Feb 10, 2015
(#) spgabor hozzászólása Feb 10, 2015 /
 
Sziasztok!

Még mindig az SDA 2131-el szenvedek. Kaptam több megoldási tippet, amik alapján sikerült elindulnom, viszont nem akartam egyiket sem csak beilleszteni, hogy tanulás jellege is legyen a dolognak. Most ott tartok, kiírja a karaktereket a kijelző, viszont nagyon villog. Ha a kijelzésben az időzítést növelem, úgy nagyon lassú lesz, ha csökkentem, akkor meg annyira gyorsan villog, hogy csak 8-asokat jelenít meg halványan a kijelző.
A kódom a következő:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <htc.h>
  4.  
  5. __CONFIG(WDTE_OFF & FOSC_XT & CP_OFF & LVP_OFF & BOREN_OFF & MCLRE_ON & PWRTE_ON); // eredeti
  6.  
  7. #define _XTAL_FREQ 4000000
  8. #define DATA RB0
  9. #define CLK RB1
  10. #define ENABLE RB2
  11. #define LED RB3
  12.  
  13. volatile int szamlalo = 0;
  14. volatile int perc = 17;
  15. volatile int masodperc = 32;
  16. volatile int karakter_1 = 0;
  17. volatile int karakter_2 = 0;
  18. volatile int karakter_3 = 0;
  19. volatile int karakter_4 = 0;
  20.  
  21. unsigned char DigitBal[10] = {0xF7, 0xC1, 0xEE, 0xEB, 0xD9, 0xBB, 0xBF, 0xE1, 0xFF, 0xFB};
  22. unsigned char DigitJobb[10] = {0xEF, 0x89, 0x7D, 0xBD, 0x9B, 0xB7, 0xF7, 0x8D, 0xFF, 0xBF};
  23.  
  24. void interrupt isr(void){
  25.     szamlalo++;
  26.     if(szamlalo == 1000){
  27.         if(LED == 0){
  28.             LED = 1;
  29.         }else{
  30.             LED = 0;
  31.         }
  32.         if(masodperc == 0 && perc != 0){
  33.             perc--;
  34.             masodperc=60;
  35.         }else if(masodperc == 0 && perc == 0){
  36.             TMR2IE = 0;
  37.             LED = 0;
  38.         }else{
  39.             masodperc--;
  40.         }
  41.         szamlalo = 0;
  42.     }
  43. }
  44.  
  45. int main() {
  46.     TRISA = 0xFF;  //A lábai bemenet lettek állítva
  47.     PORTA = 0; // PortA alacsony szinten
  48.     PORTB = 0x00; //PortB alacsony szinten
  49.     TRISB = 0x00; // B lábai kimenetek
  50.     CMCON = 7; // Comparator kikapcsolva
  51.     CCP1CON = 0; // Capt/Comp/PWM kikapcsolva
  52.     INTCON = 0;   // Összes interrupt láb kikapcsolva
  53.     PR2 = 249; // Timer2 PR2 8bites periódus regiszter
  54.     T2CON = 5; // T2CON regiszter
  55.     TMR2IE = 0; // TMR2IE megszakítást engedélyez? bit (leállítva a Timer2)
  56.     PEIE = 1; // Peripheral interrupt engedélyezése
  57.     GIE = 1; // Globális interrupt engedélyezése
  58.     DATA = 1;
  59.     ENABLE = 0;
  60.     LED = 1;
  61.  
  62.     while(1){
  63.         ENABLE = 1;
  64.         for(int i = 0; i < 8; i++){ //BAL OLDAL
  65.             karakter_2 = perc % 10;
  66.             DATA = ((DigitBal[karakter_2])>>i)&0x01;
  67.             //DATA = (((DigitBal[karakter_2] << 10) || (DigitJobb[karakter_4] & 0xFE))>>i) & 0x01;
  68.             CLK = 1;
  69.             __delay_us(1);
  70.             CLK = 0;
  71.             __delay_us(1);
  72.         }
  73.         for(int i = 0; i < 8; i++){ //JOBB OLDAL
  74.             karakter_4 = masodperc % 10;
  75.             DATA = ((DigitJobb[karakter_4]&0xFE)>>i)&0x01;
  76.             CLK = 1;
  77.             __delay_us(1);
  78.             CLK = 0;
  79.             __delay_us(1);
  80.         }
  81.         __delay_us(1);
  82.         ENABLE = 0;
  83.         __delay_ms(10);
  84.         ENABLE = 1;
  85.       //  CLK=1;
  86.         for(int i = 0; i < 8; i++){ //BAL OLDAL
  87.             karakter_1 = perc / 10;
  88.             DATA = ((DigitBal[karakter_1]&0x7F)>>i)&0x01;
  89. //            DATA = ((((DigitBal[karakter_1]&0x7F) << 10) || (DigitJobb[karakter_3])) >> i) & 0x01;
  90.             CLK = 1;
  91.             __delay_us(1);
  92.             CLK = 0;
  93.             __delay_us(1);
  94.         }
  95.         for(int i = 0; i < 8; i++){ //JOBB OLDAL
  96.             karakter_3 = masodperc / 10;
  97.             DATA = ((DigitJobb[karakter_3])>>i)&0x01;
  98.             CLK = 1;
  99.             __delay_us(1);
  100.             CLK = 0;
  101.             __delay_us(1);
  102.         }
  103.         __delay_us(1);
  104.         ENABLE = 0;
  105.         __delay_ms(10);
  106.     }
  107. }


Hogy tudom gyorsítani a futását, hogy ne villogjanak a karakterek? Valamint a nem aktív szegmensek ne világítsanak nagyon halványan? Még az elején kaptam olyan javaslatot, hogy az SDA2131 C lábát fel-le kellene kapcsolgatni a regiszter feltöltése előtt és után. Ez nem tudom, hogy megoldás lenne-e, de a panelomon, amit használok ez a láb folyamatosan tápfeszt kap, vagyis a kijelzőt nem kapcsolja le soha. Ez vagy inkább kódbeli hiba okozza a villogást?
Csatoltam a villogásról egy videót. Ezen a villogás sebességét elég jól kiszűrte a telefonom, mikor felvettem, mert szabad szemmel inkább olyan, mint a régi CRT monitort nézni 50Hz-es felbontáson. Viszont a nem aktív szegmensek halvány világítása jól látható.

Üdv:
spgabor

VIDEO0004.zip
    
(#) Pali79 válasza kzozo hozzászólására (») Feb 10, 2015 /
 
Én legutóbb így használtam:
  1. Message        
  2.                 movlw   HIGH Text1
  3.                 movwf   PCLATH
  4.                 movf    count, w                ;put counter value in W
  5.                 call    Text1           ;get a character from the text table
  6.                 xorlw   0x00            ;is it a zero?
  7.                 btfsc   STATUS, Z
  8.                 goto    Line2
  9.                 call    LCD_Char
  10.                 call    Delay20
  11.                 incf    count, f
  12.                 goto    Message

Tábla:
  1. Text1  
  2.                 addwf   PCL, f
  3.                 retlw   '1'
  4.                 retlw   '2'
  5.                 retlw   '3'
  6.                 retlw   0x00


A tábla következő memória lapra van rakva. Biztos van ennél jobb módszer is, de működik.
A hozzászólás módosítva: Feb 10, 2015
(#) kzozo válasza Hp41C hozzászólására (») Feb 10, 2015 /
 
Sikerült lapváltással megoldani. A táblázatok a 2. lap elejére kerültek, minden jól működik. Köszönöm a segítségeteket.
(#) Balagemann2031 hozzászólása Feb 12, 2015 /
 
Sziasztok! MPLAB v.8.90 alatt ASM30 fordítóval PIC24H-s piccel szórakozok Microstick 2-vel. A problémám az, hogy próbálom életre kelteni a SPI1 modult, de egy egyszerű adat elhelyezés a bufferben MPLAB SIM alatt szabályosan megtörténik, hardveres debug módban viszont látom, hogy nem kerül bele. Kicsivel elötte SPI1CON1-be nem akart bekerülni az adat, aztán mikor nem SPI1STAT-ot állítom először hanem SPICON-et akkor működik.
  1. MOV             #0B0000001100111111,W1
  2.         MOV             W1,SPI1CON1
  3.         MOV.B   #0B01100110,W0
  4.         MOV             W0,SPI1BUF
  5.         NOP
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 12, 2015 /
 
Megfelelően inicializáltad az SPI modult?
A helyes sorrend:
0.) SPI tiltása, ha szükséges (SPIxSTAT)
1.) SPIxCON1 és SPIxCON2 beállítása (SPI konfigurálás)
2.) SPIxSTAT beállítása (SPI modul engedélyezése)
Adatküldés/fogadás:
3.) Adat betöltáse SPIxBUF regiszterbe
4.) Tranzakció megtörtént? (SPIxSTAT,#SPIRBF=1?)
5.) Adat olvasása (SPIxBUF)
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 12, 2015 /
 
Szia! Nem magával a kommunikációval van a probléma, addig el sem jutok, hanem magával az adat bemásolásával az SPI1BUF-regbe. Tehát ha W0 értéke x, akkor MOV W0,SPI1BUF utasításra, nem kerül X SPI1BUF-ba, ha éles nyomkövetéssel nézem, ha MPLAB szimulátorral, akkor bekerül, mint ahogy el is várnám. Vagy, ilyen létezik, hogy amíg egyik reg nincs feltöltve, addig a másikat nem lehet írni? Egyébként az általad írt sorrendet követem.
  1. SPI1_INIT:
  2.         MOV             #0B0000001100111111,W0
  3.         MOV             W0,SPI1CON1
  4.         BSET    SPI1STAT,#15
  5.         MOV             #0B0101010101010101,W0
  6.         MOV             W0,SPI1BUF



SPI1STAT-ba és SPI1CON1-be bekerül az érték, SPI1BUF-ba semmi. (csak szimulátorban kerül be)
Következő: »»   632 / 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