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   85 / 1210
(#) szitko válasza watt hozzászólására (») Jan 25, 2011 /
 
Köszi a gyors választ. Valóban, nem gondoltam rá, hogy nem fér bele 255-nél több. Igazából egy egyszerű progiról van szó, egy uh érzékelő jelét kellene figyelni (SFR04) és csak egy adott távolságnál kellene (ahol az uh-ból kimenő jel H szintje 450uS) átbillenteni a kimenetet. Sajnos még nem tartok olyan szinten, hogy amit leírtál mind megtudjam valósítani.
(#) watt válasza szitko hozzászólására (») Jan 25, 2011 /
 
Szerintem nem érdemes mondogatnod, hogy egyszerű program, mert attól még nem lesz az. Majd egy hét múlva meglátom mit mondasz mennyire egyszerű. Egyébként ahogy leírtam úgy tényleg egyszerű lenne, csak meg kell érteni az adatlapból, és egyéb helyekről a CCP modul és a timerek működését és felépíteni a folyamatábrát, utána pedig lekódolni.
(#) szitko válasza watt hozzászólására (») Jan 25, 2011 /
 
Tudom,hogy nem egyszerű (pláne nekem,). Már kb másfél éve próbálkozom a PIC-kel kisebb nagyobb sikerrel. A gondom az a timer és CCP modullal, hogy azok kellenek másra és még azt is meg kell tanuljam kezelni. Ha nem engedem, hogy tulcsorduljon az echo konstans akkor elméletileg jó?
(#) Atielektro hozzászólása Jan 25, 2011 /
 
Sziasztok!

Nekiláttam, hogy csináljak egy Simon mondja játékot (aki nem ismerné, annak itt egy Link), de elég csúnyán elakadtam. A pic, amire a programot írom egy 628a-s. A legújabb, 9.81-es Hi-Tech C a fordítóm és még egyelőre pro verziójú. Gondoltam, hogy ne terheljem a fórumot túl hosszú szöveggel, így a rar-ba beletettem egy leírást a programról. A kapcsolásom úgy néz ki, hogy az RA-1-2-3-on vannak a gombok. Alapból egy 10k-s ellenállással földre vannak húzva és amikor megnyomom a gombot vált át VDD-re a láb. A négy LED a PORTB0-1-2-5-ön van. Az MCLR nincs letiltva, szóval az RA5 10k-val VDD-re van húzva.
Érdekes, hogy a szimulátorban jól fut, de a valóságban nagyon nem azt csinálja, amit kéne neki. A Gombvizsgalat_FGV()-ben nem várakozik egy gombnyomásra, hanem túllépi azt és emiatt a switch-case részben nem talál egyezést és mivel hibás gombot "nyomtunk" meg újraindul a program. Próbáltam az assembly kódból
kiokoskodni valamit:

  1. while(PORTA==0x00);
  2.  
  3. 0x7ba cim:
  4. movf 0x05,w             ;PORTA beolvasasa a W-be
  5. BTFSC 0x3, 0x2        ;vajon a DC bit 0 e?
  6. GOTO 0x7ba              ;Ha a felső 4 bit 0, akkor kiugrunk a ciklusból


Eleve nem értem, hogy mért nem a Z bitet figyeli, mert ha az alsó bitek bebillennek, attól még a ciklusban maradunk, de a PORTA már közel sem 0 lesz. Remélem jól okoskodom ezzel a DC bittel, mert még sosem használtam...De ez a szimulátorban hibátlanul fut, szépen várakozik egy gombnyomásra...Másik furcsaság számomra, hogy nem a programmemória elejére kerül a program, hanem van egy goto a legelején és az egész kód a memória végén van. Ez normális szerintetek?
A programból kikommenteztem az időzítéseket, így rögtön lehet használni hozzá a szimulátort. Remélem ti rájöttök, hogy mi a hibám. Megeshet, hogy nem a fenti résszel van a gond, de nekem ez a rész a gyanús.
Előre is köszi a segítségeteket!
(#) icserny válasza szitko hozzászólására (») Jan 25, 2011 /
 
Idézet:
„A gondom az a timer és CCP modullal, hogy azok kellenek másra”
A CPU idő meg nem kell? Arra ráér a program, hogy a várakozó ciklusokban kóvályogjon?

Nem tudom, hogy milyen mikrovezérlőt használsz, de ha a bemenő jel polaritása megfordítható, akkor az esetleg nem használt UART modul is bekonfigurálható, hogy a min. 450 us jelet BREAK karakternek érezze.

Vagy egy RC taggal megintegrálva a jelet az analóg komparátorra viszed, ami csak akkor billen be, amikor az impulzus elég hosszú (ehhez esetleg kell egy kimenet is, amivel az impulzusra várás előtt a kondenzátor kisüthető).
(#) icserny válasza Atielektro hozzászólására (») Jan 25, 2011 /
 
  1. while(PORTA==0x00);

Ez nem a gombnyomásra, hanem a felengedésre vár! (Felteszem, hogy a gomb földre zár lenyomáskor)
(#) szitko válasza icserny hozzászólására (») Jan 25, 2011 /
 
Az elképzelésem a következő (csak tőmondatokban).Egy 16f882-vel próbálkozom. Az ultrahang modult kell figyelni, de ennek kell egy 10uS-os vezérlőjel. Ez megvan és megy is. Az uh modul kimenetén a magas jel szélessége a távolságtól függ. Én csak egy bizonyos távolságot szeretnék figyelni (ami 450uS szélességet jelent). Mikor az uh modul lemérte a távot a kimenet L lesz és ilyenkor 10mS mulva meg kell ismételni a bemenetén a 10uS-os vezérlőjelet(legalábbis azthiszem). Közben kellene vezérelni egy szervót (1ms-20ms-2ms-20ms...) plusz kettő db DC motort két külön PWM-el. Az uh modul vezérlése, ha kiveszem a 450uS-os figyelést, megy rendesen.

uhvez.asm
    
(#) Atielektro válasza icserny hozzászólására (») Jan 25, 2011 /
 
Nem. A gombok 5V-ra zárnak, ha lenyomom őket és így addig várunk, amíg valamelyik gombot meg nem nyomtuk.
(#) watt válasza szitko hozzászólására (») Jan 25, 2011 /
 
Pedig ha ilyen régen foglalkozol ezzel, akkor ideje lenne megismerkedni a PIC-el is!
A timer nem más, mint egy számláló. Van 8 és 16bites. Számlálnak monoton az órajeltől, az előosztótól, az utóosztótól, már ha vannak, és természeteses saján bithosszúságuktól függően felfelé, majd túlcsordulnak és kezdik előről. Amikor túlcsordulnak beállítanak egy jelzőbitet, ami, ha meg van neki engedve, megszakítást is okoz(jelzést nekünk kell törölni). A megszakítás kiszolgálása(ugye ez is csak egy szubrutin, csak fix a kezdőcíme) lezajlik, (pl. számolod a túlcsordulásokat), és visszatér a fő programszálba.

A CCP capture módban annyit tud, hogy a beállított élre(amit menet közben is lehet módosítani) a hozzá rendelt timer értékét betárolja egy regiszterbe. Ekkor beállít egy jelzőbitet, ami ha engedélyezve van
neki, megszakítást is okoz. Itt van idő kiolvasni az eltárolt regiszterek értékét, és egy korábbi eltároltat kivonni belőle, valamint ha volt timer túlcsordulás, akkor annyiszor 65536-ot még hozzáadni, ahányszor volt. Ez arányos lesz a jeled fel ill. lefutó élének időtartamával.

Ennyi tőmondatokban.

Az adatlapokban részletesen le van írva minden, és a neten is sok anyag van, még magyarul is. Az oldalamon találsz linkeket ilyen oldalakra. Itt az idő...
(#) szitko válasza watt hozzászólására (») Jan 25, 2011 /
 
Köszönöm a segítséget. Tanulok tovább.
(#) icserny válasza szitko hozzászólására (») Jan 25, 2011 /
 
Elég életveszélyes, ha csak szigorú egyezést vizsgálsz a 450 us kapcsán.
Idézet:
„Mikor az uh modul lemérte a távot a kimenet L lesz és ilyenkor 10mS mulva meg kell ismételni a bemenetén a 10uS-os vezérlőjelet(legalábbis azt hiszem).”
Nem "kell", hanem lehet. Az adatlap szerint 10ms-ot kell várni, mielőtt újabb triggerjelet adhatsz ki. Ismételni ezentúl bármikor lehet, akár két nap múlva is.

A várakozásnál pedig azt is vedd figyelembe, hogy az impulzusszélesség akár 36 ms is lehet, ha nincs echo jel. Ezért volna jó valami hardveres megoldás a figyelésre.
(#) icserny válasza Atielektro hozzászólására (») Jan 25, 2011 /
 
Idézet:
„A gombok 5V-ra zárnak, ha lenyomom őket”
Elég szokatlan megoldás, de attólmég működhetne. Lefelé mi húzza a bemenetet, amikor a gomb el van engedve?

Szerintem a btfsc STATUS,2 a Z bitet figyeli, tehát a fordító jól fordította a kódot.
(#) szitko válasza icserny hozzászólására (») Jan 25, 2011 /
 
Igen igaz "nem kell hanem lehet", rosszul fordítottam.Azt tudom ,hogy 36ms is lehet ezért nem jó amit írtam progit, mint utólag rájöttem, találtam egy példaprogramot 16f84-re, de az sem megy rendesen.A hardveres megoldát már elvetettem, mert így legalább tanulom a programozást. Tehát a beérkező jel feldolgozásán tovább kell dolgoznom. Köszi a válaszokat.
(#) Atielektro válasza icserny hozzászólására (») Jan 25, 2011 /
 
10k-s ellenállással van a földre kötve.
A Z bittel kapcsolatban pedig igazad van. El sem merem mondani, hogy én hogyan értettem, pedig írtam egy pár asm kódot...
Az az érdekes, ha kikommentezem a Gombvizsgalat_FGV()-t, akkor jól fut le a program, tehát szépen random számokkal feltölti a tömböt és utána ki is rakosgatja a PORTB-re (mármint élesben tesztelve). Szóval Gombvizsgalat_FGV-ben van a hiba valahol,de nem tudom, hogy hol, mert szimulátorban hiba nélkül lefut...
Még valami. Akkor indul a program, ha megnyomom az RA0-ra rakott gombot és ez jól is működik, tehát nem elkötéssel van a gond.
Azt nem tudod esetleg megmagyarázni, hogy miért a programmemória végére rakja a kódot a fordító?
(#) icserny válasza Atielektro hozzászólására (») Jan 26, 2011 /
 
Idézet:
„Szóval Gombvizsgalat_FGV-ben van a hiba valahol,de nem tudom, hogy hol, mert szimulátorban hiba nélkül lefut...”
Elsősorban ott lehet a hiba, hogy az egész A portot beolvasod, pedig csak négy bemenetén van nyomógomb. Én így írnám:
  1. while((PORTA & 0x0F)==0x00);    //Gombnyomasra varunk
  2. chPort_allapota = PORTA & 0x0F; //PORTA allapotanak elmentese egy regiszterbe


A switch utasítással meg az a baj, hogy nincs "default" ága, ahová az összes "szabálytalan" eset besorolható (pl. két gomb egyidejű lenyomása, vagy az a ritka eset, amikor pont a feltételvizsgálat és a chPort_allapota változóba történő eltárolás között engeded el a gombot).

Mellesleg az utóbbi eset elkerülése érdekében célszerű volna módosítani a kódot valahogy így:
  1. do { chPort_allapota = PORTA & 0x0F; } while (chPort_allapota == 0);

Tehát előbb rögzítem a bemenet állapotát, utána vizsgálom.

Megjegyzés: lehet, hogy a C fordító megengedi így is:
  1. while(!(chPort_allapota = PORTA & 0x0F));

de ilyesmibe most nem mennék bele...
(#) Atielektro válasza icserny hozzászólására (») Jan 26, 2011 /
 
A PORTA állapotának bitenkénti és-elése 0x0F-el megoldotta a problémámat. Volt még ezen kívül egy kis bakim, de azt javítva működik a program.
Persze, hogy nem működött úgy, hogy az egész PORT-ot olvastam, mert az MCLR VDD-re volt húzva, amikor meg nem volt bekapcsolva az MCLR funkció, akkor meg mindenféle zajt szedett össze az RA5-ön, mivel az csak bemenet...Így, hogy segítettél, már könnyen vagyok okos
A default ágat meg azért nem raktam bele, mert a Kónya-Kopják könyv szerint, ha nincs egyezőség semelyik case ágban, akkor a programfutás a switch utáni utasítással folytatódik és a soron következő if-ben kiderül mindenféle turpisság.
Köszönöm szépen a segítségedet! Legközelebb figyelek ezekre.
(#) icserny válasza Atielektro hozzászólására (») Jan 26, 2011 /
 
Örülök, hogy megoldódott a probléma. A default ágat én sem mindig használom, erőltetni végképp nem akarom, csak itt kézenfekvőnek látszott a hibalehetőségek kiszűrésére. (Te sem szenvedtél volna ennyit a fölösleges bitek beolvasása miatt, ha a rossz érték fennakadt volna a szűrőn...)
(#) vilmosd válasza Atielektro hozzászólására (») Jan 26, 2011 / 1
 
Hali
En egy ilyen megoldast csinaltam gombok kezelesere:
  1. #define butt_c1 1      
  2. #define butt_c2 2
  3. #define butt_c3 3
  4.  
  5. #define Butt1 0b00010000
  6. #define Butt2 0b00001000
  7. #define Butt3 0b00000100
  8. #define Butt_MASK ((Butt1) | (Butt2) | (Butt3) )
  9.  
  10.  
  11.  
  12. int botton( int in_butt)
  13. {
  14.  
  15.         switch ( in_butt & Butt_MASK )
  16.         {
  17.  
  18.     case Butt1:
  19.         return (butt_c3);
  20.         break;
  21.  
  22.     case Butt2:
  23.         return (butt_c2);
  24.         break;
  25.  
  26.     case Butt3:
  27.         return (butt_c1);
  28.         break;
  29.    
  30.  
  31.     default:return (0);
  32.  
  33.        // no Botton or more Bottons
  34.  
  35.         }
  36. }

Egyszeru, bovitheto, es tudja kezelni a tobb gombos hibakat is. A fveny hivasa a port ertekevel tortenik, es visszaadja a lenyomott gomb erteket, vagy nullat.
(#) Baxi hozzászólása Jan 26, 2011 /
 
Hi Mesterek!
Kellene egy kis segítség.
Nem boldogulok a 18f2550 pic-el
A gondom vele hogy hiába használom a RLNCF parancsot s látom(WATCH) hogy a deklarált változóba forgatja a bitet is, de nem rakja be/ki a PORTB-re, pedig bemozgatom a PORTB-re.

Vagy megtudná nekem magyarázni mit jelent ez:
RLNCF f,d,a (18f2550 adatlapjában így van a parancs)
Én amit kihámoztam belőle hogy cerry nélkül forgatja az f regisztert de mi az a ",d,a"? ezt nem értem.
Segítséget magyaráztatott előre is köszönöm.
(#) kissi válasza Baxi hozzászólására (») Jan 26, 2011 /
 
Hello!

Nézd meg az utasítások összesítésénél az adatlapban ( figyelj az ACCESSED és DESTINATION kifejezésekre! )!
A 'C' a carry bit rövidítése!

Steve
(#) Baxi válasza kissi hozzászólására (») Jan 26, 2011 /
 
Hi
Ott ez a parancs van RLNCF f,d,a
Tehát akkor ha:
RLNCF TEMP ;így a temp-ben lévő biteket forgatja

RLNCF TEMP,d ;így pedig a temp-ben forgatott biteket átrakja a "d"be
Vagyis Én ezt így gondolom.

de nem megy:
RLNCF TEMP,W
MOVWF PORTB

Én így csináltam de nem megy a prg , nem rakja ki portb -re.
(#) kissi válasza Baxi hozzászólására (») Jan 26, 2011 /
 
Kérdés még az 'a' szerepe ( bár úgy emlékszem, hogy elhagyása esetén azzal alapból nincs gond, de nézd meg! ).
18-as sorozatnál egyébként ne a PORT-ot írd, hanem a LAT-ot !

A PORTB biztos, hogy megfelelően van konfigurálva ( kimenet, tuti, hogy látszik rajta a kirakott adat? ), mert szerintem ennek egyébként működnie kellene ?!

Steve
(#) potyo válasza Baxi hozzászólására (») Jan 26, 2011 /
 
Letiltottad az analóg bemeneteket a PORTB-n?
(#) Baxi válasza potyo hozzászólására (») Jan 26, 2011 /
 
Hi, öö nem, hol kell letiltani? Config biteknél vagy program sorból?
(#) kissi válasza Baxi hozzászólására (») Jan 26, 2011 /
 
Program --> PORTB konfigurálása PDF !!

Steve
(#) watt válasza Baxi hozzászólására (») Jan 26, 2011 /
 
Aranyszabály, ha portra írunk LATB, ha olvasunk PORTB!
(#) icserny válasza Baxi hozzászólására (») Jan 26, 2011 /
 
Ennek így működnie kell:
  1. #include "p18cxxx.inc"
  2. TEMP EQU 0
  3.  
  4.         ORG 0x0
  5.         movlw 0x0f
  6.         movwf ADCON1
  7.         clrf  TRISB
  8.         MOVLW 0x04
  9.         movwf TEMP
  10.         rlncf TEMP
  11.         rlncf TEMP,W
  12.         movwf PORTB
  13. loop:
  14.         goto loop
  15.         end


Két forgatás van. Az első eredménye 8 lesz, ez a TEMP-be is beíródik. Amásodik forgatás eredménye 0x10, ez csak a WREG munkaregiszterbe íródik be, majd onnan a PORTB regiszterbe.

RLNCF f,d,a
f - a regiszter (memória-rekesz) címe
d - destination (cél) 0: WREG, 1: file register (ez az alapértelmezett)
a - ACCESS (elérés) 0: Access blokk (BSR nincs figyelembevéve), 1: Banked (BSR mondja meg, melyik lapot kell címezni)

Mindez persze benne van az adatlapban!

Szerk: beiktattam az ADC bemenetek letiltását is.
(#) potyo válasza Baxi hozzászólására (») Jan 26, 2011 /
 
18F2550-nél a PORTB-n konkrétan mindkét helyről lehet, de a legtöbbször program sorból, úgyhogy inkább azt válaszd, az máshol is jól jön.
(#) Baxi válasza icserny hozzászólására (») Jan 26, 2011 /
 
Köszönöm szépen a segítséget.
(#) HalAnd hozzászólása Jan 27, 2011 /
 
Sziasztok! Új vagyok még itt és új vagyok a PIC-ek világában is. Az utóbbi egy két hétben próbáltam belerázódni az elméletbe, de úgy látszik nem nagyon sikerült.
Tegnapelőtt kezdtem el MPLAB szimulátorban kísérletezgetni, de mára már el is akadtam. Próbáltam keresgélni a könyvekben, a PIC adatlapján és itt a fórumokon is. De nem lettem okosabb. Pedig biztos nem "nagy ügy", de rajtam mégis kifogott.
Így hát megkérdezném tőletek.

A P12F629-est válaszottam kezdetnek (tudom, sokan írták, hogy nem ez a legjobb kezdéshez, de most már ez van)

Szóval a problémám.
Megpróbáltam lapozni a file register memóriát, a STATUS 5. bitjével, ahogyan azt a PIC adatlapja is írta. Utána próbáltam beleírni az aktuális lap egy általános célú regiszterébe. Ez sikerült is, de nem úgy, ahogyan én szerettem volna. Ugyanis megjelent a másik bankban is az az érték amit az eredetileg kiválasztott bankba szántam.(mintha tükrözték volna oda)

Csatoltam képet is a MPLAB-ról... A File Registers ablakban a 30h és a B0h bájtokkal van a problémám.

Mit rontottam el? Vagy esetleg ezt csak így lehet?

utana.TIF
    
Következő: »»   85 / 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