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   510 / 1222
(#) don_peter válasza ktamas66 hozzászólására (») Ápr 7, 2014 /
 
Hogy ha a GIEH-t 1-re állítom akkor már nem az alacsony prioritást fogja figyelni hanem a magasat és azonnal már a program indulásnál megvalósul a megszakítás mivel fel vannak húzva a lábak magas szintre.
Valami más ötlet?
(#) ktamas66 válasza don_peter hozzászólására (») Ápr 7, 2014 / 2
 
Olvasd el az adatlapon a 9 fejezetet . A 9-1 árán látható. hogy semmilyen interrupt nem megy ki ha a GIE nem 1. Az INTCON leírásában is benne van, ha GIE 0, az IPEN állásától függetlenül minden megszakítás tiltva van. Ha a GIE-t a megszakítások beállítása után engedélyezed, már csak olyan megszakítás jöhet, amit beállítottál.
A PORTB beállításait 10.2 fejezetben nézheted. A lábakon levő változásokat a latch-hez képest figyeli, a port írása/olvasása átállítja a latch-et ami az aktuális állapot, tehát innen már csak a változást figyeli (ezt menet közben is meg kell csinálni, hogy beálljon az aktuális állapot mielőtt törlöd a RBIF-et). Ezt tedd meg mielőtt a GIE-t engedélyezed, és akkor már csak az innentől jövő változások okoznak megszakítást. Ha nem engedélyezel semmilyen magasszintű megszakítást, oda nem fog ugorni a program, hiába van a GIEH is 1-en.
(#) don_peter válasza ktamas66 hozzászólására (») Ápr 7, 2014 /
 
Igen igazad van. Engedélyeztem a GIE/GIEH-t szóval indúl a dolog, de bárhová teszem (beállítás elejére vagy végére vagy közepére) program indulásnál egyből a megszakítással indul a program, aztán utána már jó.
(#) vicsys hozzászólása Ápr 7, 2014 /
 
Lenne egy hülye kérdésem: Ha 0,4...0,85us hoszzú impulzusokat akarok előállítani, mekkora minimális oszcillátor frekit kell választanom? Már teljesen belekavarodtam mint házimacska a hímzőcérnába... (Tényleg kellene a 48MHZ?)
(#) ktamas66 válasza don_peter hozzászólására (») Ápr 7, 2014 /
 
A PORTB inicializálása megfelelő (CLRF LATB)? Mielőtt kiadod a GIE-t, ráolvasol egyet a PORTB-re?
(#) don_peter válasza ktamas66 hozzászólására (») Ápr 7, 2014 /
 
Igen próbáltam úgy is, de az eredmény ugyan az.
Megszakítással indul a program, majd utána már megfelelően működik.
Vagy is kissé összekuszálódik pár megszakítás után szóval ott még majd bütykölnöm kell valamit.

Közben jó lett.
A flag-et a végén törlöm és a GIEH-t is a végén állítom be így oké lett a dolog.
Köszi a segítséget.
A hozzászólás módosítva: Ápr 7, 2014
(#) foxi63 válasza vicsys hozzászólására (») Ápr 7, 2014 /
 
Szia!
Hát....
20MHz kristály = 200nsec/utasítás. 0.4uS = bsf port nop bcf port

0.8uS = bsf, nop,nop nop bcf
Sajnos 50nsec nem megy.
Valóban 48Mega kell, Azonban, ha a PIC-nek van pwm modulja akkor ott 50nS -os felbontás is van, tehát elvileg egy beállított pwm érték képes ekkora impulzus kiadására.
Viszont a periódus idő kötött. Érdmes lenne megnézned.
üdv.: Foxi
(#) vicsys válasza foxi63 hozzászólására (») Ápr 7, 2014 /
 
Sajnos a "bit-banging" üzemmódot kellene választanom és eltérőek az értékek- csak egy min-max tartományt adtam meg. Ráadásul elég pontosnak kellene lennie mert +-170ns eltérést engednek meg.
(#) ktamas66 válasza don_peter hozzászólására (») Ápr 7, 2014 / 1
 
Most már Te látod, hogy működik , még egy feltétel van az adatlapban: egy utasításnak kell lenni a port olvasás és a megszakítás engedélyezés között (akár egy NOP).
(#) foxi63 válasza vicsys hozzászólására (») Ápr 7, 2014 /
 
Akkor egyszerűen átlagoni kell. például 5x 400nsec 1x 600nsec vagy valami más osztásban. esetleg. nem tudom esetleg leírhatnád a kritériumot pontosabban.
(#) don_peter válasza ktamas66 hozzászólására (») Ápr 7, 2014 /
 
Ott nullázom a Flag-at.
Valamiért megfagy a program 4-5 megszakítás után, de hogy miért a fene sem tudja...
Most ezen agyalok mi lehet a hiba amiért meg gabalyodik egy idő után...
(#) tirisztortetróda hozzászólása Ápr 8, 2014 /
 
Sziasztok!

A segítségeteket szeretném kérni. A problémám a következő lenne:
Egy PIC16F877A-val szeretnék egy feszültségmérőt összehozni, ami 0-15V-ig mér. A PIC AN0 csatornáját használom, 10 bites a benne lévő a/d konverter. Addig jutottam a dologgal, hogy ki tudom olvasni az ADRESH és ADRESL eredményt tároló regisztereket, de ezeknek az értékei mindig megegyeznek.
  1. -------------------------------------------------------------------
  2.                 ORG     0               ; RESET VEKTOR
  3.  
  4. ;-------------------------------------------------------------------
  5.                 NOP
  6.                 BCF             STATUS,RP0      ; BANK0 KIVÁLASZTÁS
  7.                 BCF             STATUS,RP1
  8.                 MOVLW   B'11000001'     ; RC OSZCILLÁTOR, A/D ENGEDÉLYEZÉS
  9.                 MOVWF   ADCON0          ; 0. CSATORNA (RA0) KIVÁLASZTÁS
  10.                 BSF             STATUS,RP0      ; BANK1 KIVÁLASZTÁS
  11.                 MOVLW   B'10000111'     ; TMR0 ELŐOSZTÓ= 1:256
  12.                 MOVWF   OPTION_REG
  13.                 MOVLW   14
  14.                 MOVWF   ADCON1          ; RA0 ANALÓG BEMENET !!!
  15.                 MOVLW   B'11111111'     ; PORTA BEMENET
  16.                 MOVWF   TRISA
  17.                 MOVLW   B'10111111'     ; RC6 KIMENET (TXD)
  18.                 MOVWF   TRISC
  19.                 CLRF    TRISD           ; PORTD KIMENET
  20.  
  21.  
  22. ; USART PORT PROGRAMOZÁSA ASZINKRON MÓDBAN
  23. ;
  24.                 MOVLW   77 ;12MHz krist. 9600,8,n,1
  25.                 MOVWF   SPBRG
  26.                 MOVLW   B'00100100'     ; TXEN=1, SYNC=0, BRGH=1
  27.                 MOVWF   TXSTA           ;
  28.                 BCF             STATUS,RP0      ; BANK0 KIVÁLASZTÁS
  29.                 MOVLW   B'10010000'     ; SPEN=1, CREN=1
  30.                 MOVWF   RCSTA           ;
  31.  
  32.                 BCF             STATUS,RP0      ; BANK0 KIVÁLASZTÁS
  33.                 CLRF    PORTD
  34.                 MOVLW   15                      ; TMR0 TÚLCSORDULÁS SZÁMLÁLÓ KEZDETI
  35.                 MOVWF   OVFCNTR         ; ÉRTÉKE 10
  36. ;------------------------------------------------------------------------------
  37. START2
  38.                 BCF             STATUS,RP0      ;
  39.                 BCF             STATUS,RP1      ;
  40.  
  41.                 BTFSS   INTCON,T0IF     ; TMR0 TÚLCSORDULÁS VOLT?
  42.                 GOTO    START2          ; MÉG NEM
  43. ;------------------------------------------------------------------------------
  44.                 BCF             INTCON,T0IF     ; IGEN, FLAG TÖRLÉS
  45.                 DECFSZ  OVFCNTR,1       ; TÚLCSORDULÁS SZÁMLÁLÓ DEKREMENTÁLÁSA
  46.                 GOTO    START2          ; MÉG NEM 0
  47. ;------------------------------------------------------------------------------
  48.                 MOVLW   15                      ; MINTAVÉTEL 15 TÚLCSORDULÁSONKÉNT
  49.                 MOVWF   OVFCNTR         ; SZÁMLÁLÓ VISSZAÁLLÍTÁS
  50.                 BCF             INTCON,T0IF     ; IGEN, FLAG TÖRLÉS
  51.                 BSF             ADCON0,GO       ; A/D KONVERZIÓ START
  52.                 BTFSS   PIR1,ADIF       ; VÁRAKOZÁS A TELJES KONVERZIÓRA
  53.             GOTO        $-1
  54.                 BTFSC   ADCON0,GO
  55.                 GOTO    $-1
  56.  
  57.        
  58. ;------------------------------------------------------------------------------
  59.  
  60.  
  61.                 MOVF    ADRESH,0        ; ADRESH TARTALMÁNAK KIJELZÉSE
  62.                 CALL    RS232SEND
  63.  
  64.                 MOVF    ADRESL,0        ; ADRESH TARTALMÁNAK KIJELZÉSE
  65.                 CALL    RS232SEND
  66.  
  67.                 GOTO    START2
  68.  
  69. ;------------------------------------------------------------------------------

Ha van valamijen ötletetek, szívesen fogadom.
(#) tirisztortetróda hozzászólása Ápr 8, 2014 /
 
A fenti kód egy része Szegő Jánostól, az FD1-es teszt panelhez tartozó csomagból származik.
(#) ktamas66 válasza tirisztortetróda hozzászólására (») Ápr 8, 2014 /
 
A két regiszter más bankban van, olvasáskor bankot kell váltani.
(#) tirisztortetróda válasza ktamas66 hozzászólására (») Ápr 8, 2014 /
 
Szia. Nagyon köszönöm, a franc essen bele, tegnap még volt erre egy gondolatom, hogy megnézem, nem tettem. Tipikus hiba lehetőség! Hálás köszönet!
(#) tirisztortetróda válasza ktamas66 hozzászólására (») Ápr 8, 2014 /
 
Még egy kérdésem lenne. Nem csináltam még ilyen 10 bites számolást, tudtok esetleg valami iránymutatást adni, hogy kezdjek bele a dologba? A PIC álltal mért feszültséget szeretném soros porton kiküldeni. Felbontásnak bőven elég lenne a 100 mV. A sorosport használat már megoldott. A feszültség tartomány amit mérni szeretnék 0.0-15.0V-ig terjedne. Elsőre úgy gondoltam, hogy a 10 biten ábrázolható 1023-at osztom 15-el, így 68,2 kapok. Ezt vonnám ki az 1023-ból, amíg nullát nem kapok.
(#) cross51 hozzászólása Ápr 8, 2014 /
 
Sziasztok!

Jól értelmezem, hogy a SLEEP módból egy CLRWDT utasítással ébreszthető fel a PIC vagy kell még más is hozzá?
(#) nedudgi válasza cross51 hozzászólására (») Ápr 8, 2014 /
 
Nem jól értelmezed. SLEEP módban a PIC alszik, nem csinál semmit, utasítást nem tud végrehajtani. A CLRWDT utasítás a WatchDog Timer számlálót törli.
A hozzászólás módosítva: Ápr 8, 2014
(#) ktamas66 válasza tirisztortetróda hozzászólására (») Ápr 8, 2014 /
 
Ha ASM-ben akarok számolgatni én valószínűleg olyan osztót raknék elé, ami a 20,48V-ot osztaná 5V-ra (ha a tápot használod referenciának), így a kapott eredményt csak kettővel kellene szorozni (rotálni balra), és a kijelzésnél helyére rakni a tizedespontot .
Figyelembe kell venni:
- az 5V nem stabil referencia,
- az A/D átalakítónak ofszethibája van, ami kis feszültségeken jelentkezik,
- a mérések picit szórhatnak (ha a 4 digites eredményt, csak 3 digiten jelzed ki nem okoz problémát, vagy szorzás helyett két mintát összeadsz, vagy négyet osztasz kettővel, vagy .... )
(#) cross51 válasza nedudgi hozzászólására (») Ápr 8, 2014 /
 
Köszönöm!

Még olvasgattam meg próbálkoztam vele és úgy látom akkor tudom felébreszteni a PIC-et, ha valamilyen megszakítás történik.
(#) Hp41C válasza cross51 hozzászólására (») Ápr 8, 2014 /
 
A külső reset, a watchdog lejárata mindenképen felébreszti a kontrollert. A többi lehetőség valóban az egységek megszakítás kéréséhez vannak kötve. Ha a GIE tiltott, akkor felébredéskor nem keletkezik megszakítás, hanem a soron következő utasítással folytatódik a végrehajtás. Ha a GIE engedélyezett, akkor a megszakítási rutinra kerül a vezérlés.
(#) Hp41C válasza ktamas66 hozzászólására (») Ápr 8, 2014 /
 
Keresnék itt egy jó kis osztó rutint, a kapott esedményt elosztanám 150 -nel. a hányados lenne a feszültség 100mV -ban, a maradék felhasználható kerekítséhez.
(#) helltp hozzászólása Ápr 8, 2014 /
 
Sziasztok. Most kezdtem barátkozni PIC proramozással C nyelven, de sehogy se sikerül működésre bírnom egy PIC18F45k22-es interruptkezelését. A célom az hogy kb egy másodpercenként interruptot generáljon a TMR0. Valamit biztosan rosszul állítok be. MPLAB X -et használok XC8 -cal. Előre is köszi a segítséget.
A kód kb így alakul:
  1. void InitApp(void)
  2. {
  3.     TRISB = 0b00000000;     //RB kimentere állítva
  4.     TRISC = 0b00000000;    //RC kimentere állítva
  5.     T0CON = 0b10000001;    //TMR0: ON, 16BIT, 1:4 prescaler
  6.     IPEN = 1;              //interrupt priority enable
  7.     INTCON = 0b11100000;  //Global interrupt high/low: ON, TMR0 overflow IE:ON
  8. }
  9.  
  10. void interrupt high_ISR()
  11. {
  12.     if(TMR0IE && TMR0IF){
  13.         if(PORTC == 0b11111111)
  14.             PORTC=0b00000000;
  15.         else{
  16.             PORTC = 0b1111111;
  17.         }
  18.     }
  19. }
  20.  
  21. void main(void)
  22. {
  23.     InitApp();
  24.     while(1)
  25.     {
  26.     }
  27.  
  28. }
A hozzászólás módosítva: Ápr 8, 2014
(#) Hp41C válasza helltp hozzászólására (») Ápr 8, 2014 /
 
A megszakítási rutinban a TMR0IF -t törölni kell.
(#) helltp válasza Hp41C hozzászólására (») Ápr 8, 2014 /
 
Köszi, ennyire vak nem lehetek.
Kitöröltem. így sem megy.
(#) Bakman hozzászólása Ápr 8, 2014 /
 
Pusztán elméleti kérdés.
Mi a pontosabb hosszútávon? RTC, 32 768 Hz-es kvarccal, vagy PIC, 20 MHz-es kvarccal, Timer2-vel és egy segédváltozóval visszaosztva a frekvencia 1 Hz-re? Az áramkimaradást egyelőre hagyjuk ki a játékból, a kvarc-ok a HEStore-ban is kapható "közönséges" típusok.
A hozzászólás módosítva: Ápr 8, 2014
(#) Hp41C válasza helltp hozzászólására (») Ápr 8, 2014 /
 
Most a T0CKI bemenetre érkező jelről számolna.
A hozzászólás módosítva: Ápr 8, 2014
(#) matheattila válasza helltp hozzászólására (») Ápr 8, 2014 /
 
Szia, gondolom ezelőtt AVR-et programoztál (a megszakításkezelés alapján) mert nem látom, hogy az interrupt flag-et nulláznád a megszakítás után (AVR-nél nem kell itt viszont igen)...
Esetleg ha a B port működhet analog portként is akkor azt nem árt digitálisra állítani, illetve komparátorokat letiltani (ez minden PIC-re érvényes). Az sem derül ki a programodból, hogy mekkora frekin járatod a PIC-et, timer interrupt-nál ezt figyelembe kell venni másképp nem tudod kiszámítani a timer értékét.
Az overflow azt jelenti, hogy egy bizonyos értéktől (nem feltétlenül 0-tól) addig számol ameddig eléri a maximum értéket (16 biten ez 0xFFFF, azaz 65535).
Tegyük fel, hogy 8MHz-es kristályod van, ekkor a proci és a perifériák 2MHz-en ketyegnek, a TMR0 (4-es előosztó miatt) 0.5MHz-en fut, ez azt jelenti, hogy 2us-onként lépteti a számlálót, ha te 1 másodpercet akarsz mérni akkor 1s/2us = 500 000 léptetést jelent, de mivel a számláló csak 65535-ig tud számolni, ezért már az elvárt érték kb egy tízedénél megszakítást generál. Tehát addig kell növeld az előosztó értékét ameddig a kívánt periódus és a timer periódusának hányadosa belefér a 16 bites értékbe. Ha ez megvan akkor azt a kapott hányadost kivonod a 65535-ből és azt az értéket kell beírd a TMR0 regiszterbe, hogy onnan kezdjen el számolni és mire a végére ér pont 1sec lesz. Ekkor a megszakítás rutinban újra be kell állítani a timer regiszter értékét különben 0-tól indul és akkor már nem 1 másodperc lesz a következő megszakításig.
Megértésedet kérem de most nem volt időm letölteni a pic adatlapját és minden pontosan megnézni, de szerintem ezek alapján már meg kell tudd oldani
Remélem, hogy sikerült megérteni amit itt leírtam, részleteket az adatlapban megtalálod, hisz az azért van
(#) helltp válasza Hp41C hozzászólására (») Ápr 8, 2014 /
 
T0CON 5. bitje a T0CS ami 1-nél T0CKI az órajel, 0-nál pedig a bepépített. Ahogy nézem nekem 0-ra van állítva.

"T0CS: Timer0 Clock Source Select bit
1 = Transition on T0CKI pin
0 = Internal instruction cycle clock (CLKOUT)"

(#) matheattila:

Köszi, igen egy ideig tanultam AVR-t assembly nyelven. A flag már törölve, azt javítottam, az INTOSC megy alap 1mhz-en, így kb 1Hz (250 000/4 ~ 2^16 ennél pontosabb nekem nem kell) szóval azzal nem kellene hogy gond legyen. Csak a C portot használom, de a rákötött ledeken semmi változás. Még a komparátorokat kikapcsolom, és megnézem úgyis. Köszönöm a gyors és részletes választ.
A hozzászólás módosítva: Ápr 8, 2014
(#) Hp41C válasza helltp hozzászólására (») Ápr 8, 2014 /
 
Szia!
Igazad van, belső órajelről számol.
  1. if(PORTC == 0b11111111)
  2.             PORTC=0b00000000;
  3.         else{
  4.             PORTC = 0b1111111;
  5.         }

Tesztelésnél 8 db 1 van, a beállításnál 7 db.
Egyégként:
  1. LATC ^= 0xFF;
A hozzászólás módosítva: Ápr 8, 2014
Következő: »»   510 / 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