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   61 / 1210
(#) vilmosd válasza djpman hozzászólására (») Ápr 1, 2010 /
 
Hali
Folytatja azzal az utasitassal ami van (16F-> 0x3FFF, 18F-> 0xFFFF). Ha vegiger kezdi 0 cimtol ujra. Nem nagyon jo gyakorlat. Jobb egy goto $ utasitas a vegere.
Udv Vili
(#) djpman válasza vilmosd hozzászólására (») Ápr 1, 2010 /
 
Köszönöm! Most egy fura problémával küzdök. Mégpedig, hogy egy megszakítást követően a programom a 0x05 címen folytatódik, nem pedig ott ahol a meszakítás létrejött. Mi lehet ennek az oka?
(#) vilmosd válasza djpman hozzászólására (») Ápr 1, 2010 /
 
Milyen utasitassal lepsz ki az INT-bol? RETFIE kellene.
(#) potyo válasza vilmosd hozzászólására (») Ápr 1, 2010 /
 
Én inkább arra tippelek, hogy nem törli a megszakításjelző flag-et. Vagy azt konkrétan próbálja törölni, de hogy törlődjön, valami más kell hozzá. Szimulátorból meg lehetne nézni, illetve a kódot is felrakhatná...
(#) djpman válasza vilmosd hozzászólására (») Ápr 1, 2010 /
 
A RETFIE-t használom, ezért furcsálom a dolgot.
Megnéztem szimulátorral és törli a jelző bitet. Mellékeltem a kódot...

lcd.asm
    
(#) potyo válasza djpman hozzászólására (») Ápr 1, 2010 /
 
Gondold végig, hardverből van egy call a 0x04 címre, majd innen egy call az INT_SR pontra. Az INT_SR végén ott van egy RETFIE, amivel visszatér az utánra, ahol a CALL INT_SR volt. De a hardveres call-nak nincs párja, vagyis az még vár arra, hogy kapjon még egy return vagy retfie utasítást (ezek csak abban különböznek, hogy a retfie 1-be billenti a GIE bitet). Vagyis pontosan az történik, amit te is látsz. Vagy cseréld le a CALL INT_SR-t GOTO INT_SR-re, vagy pedig az INT_SR végére tegyél egy return-t, és a CALL INT_SR után tedd a RETFIE-t. Harmadik lehetőség, hogy az egész INT_SR blokkot beteszed a 0x04 címre, és akkor nem kell a CALL meg a GOTO sem.

Az ISR rutin elhelyezését ne NOP utasítások beszúrásával csináld, hanem ORG 0x0004-el pozícionáld.
(#) Sendi válasza Hp41C hozzászólására (») Ápr 1, 2010 /
 
Helló Hp41C

Köszönöm, ezt át fogom tanulmányozni.
De már most látom, hogy pl. az 'if' 'else' 'goto' utasításokat én csak a Basic-ben tanultam, az assembly-ben nem láttam.
És mi van a másik oldalon, a számítógépnél?
LCD kijelzőre már írtam pic-kel.
Hogy tudok egy "Helló"-t küldeni a számítógépről az LCD-re?
Vagy ez már túl bonyolult?
Vagy csak egy adott memória címtől kezdve feltölteni adatokkal a számítógépről.
Valami ilyesmivel szeretnék kezdeni.
Addig is köszönettel tanulmányozom ezt.

Köszönettel
(#) djpman válasza potyo hozzászólására (») Ápr 1, 2010 /
 
Teljesen igazad van, így már minden ok. Nagyon köszönöm a segítséget! Minden nap tanulok valami újat.
(#) icserny válasza Sendi hozzászólására (») Ápr 1, 2010 /
 
Idézet:
„az 'if' 'else' 'goto' utasításokat én csak a Basic-ben tanultam, az assembly-ben nem láttam”
Ezek nem utasítások, hanem feltételes fordítási direktívák. Vagyis nem futási időben történik a feltételvizsgálat, hanem fordításkor, attól függően, hogy BaudRate szimbólum a program elején milyen értékkel lett definiálva.
Idézet:
„Hogy tudok egy "Helló"-t küldeni a számítógépről az LCD-re?”
Én az ehhez hasonló feladatot úgy oldottam meg, hogy PIC-ben egy egyszerű parancsértelmezőt írtam, amelyben minden parancs egy "#" jellel kezdődik, s a következő karakter a parancs (A, B, D, stb.). A parancsbetűt szükség esetén adatok követhetik.

A főprogram végtelen ciklusában:
1. Várok egy #karakterre (minden mást eldobunk)
2. Várok egy parancs karakterre
3. Elágazás ("switch") a parancs karakter szerint:
- Ha "A" akkor pl.analóg port beolvasás, eredmény kiírás soros porton.
- Ha "T", akkor további karaktereket várunk, és sorra kiküldjük LCD-re, amíg sorvége jel nem jön.
- Ha "C" akkor pl. töröljük az LCD-t.

És így tovább...

Mindezt egyszerűbb megcsinálni PIC18F4550-nel, és C18 nyelven (ráadásulUSB-n) de assemblyben sem lehetetlen, csak szaporátlan...

Ami akapcsolásokat illeti, én a www.microchip.com oldalon levő demókártyák kapcsolását szoktam tanulmányozni, lásd pl. Picdem2 plus, vagy az OLIMEX fejlesztői kártyáiét. (az utóbbi linken soros kommunikációhoz C nyelvű mintaprogram is van, az a Hi-Tech fordítóhoz készült,melynek Lite változata az MPLAB-bal települ, ha kéred (de utólag is telepíthető).
(#) Hp41C válasza Sendi hozzászólására (») Ápr 2, 2010 /
 
Szia!

Nézd meg itt a propeller óra bázisának programját. Benne meg van írva a bufferelt soros vétel és adás. A parancsokat táblázatos módszerrel dekódolja (eldönti, hogy milyen parancs érkezik, megvárja amíg a kellő számú paraméter beérkezik, aztán végrehajtja - a kimenetet az adási bufferbe írja). Kiválóan működik.

PC oldal:
Szert kell tenni valamilyen programnyelvre.... Onnan meg kell nyitni a soros illesztőt (COM1,...), be kell állítani a 8 bit, no parity, 1 stopbit formátumot, és a sebességet (pl. 9600). Az adni kívánt táviratot a megnyitott COM-ra vonatkozó file írás művelettel lehet elküldeni. A vétel itt is összetettebb, be kell gyűjteni egy bufferbe a vett karaktereket (a megnyitott COM-ra vonatkozó file olvasás művelettel), meg kell találni a távirat elejét, értelmezni kell a táviratot...

if - else - endif --- fordítónak szóló direktívák, ahogy írták...

Szia
(#) Sendi válasza Hp41C hozzászólására (») Ápr 2, 2010 /
 
Helló Hp41C.

Lassan kezdenek az alapok tisztulni.
Átolvasom, amiket javasoltál, aztán meglátjuk hogy mire megyek.

Addig is köszönöm az irányadó infókat.

Kellemes Húsvétot Mindenkinek.
(#) Atielektro hozzászólása Ápr 4, 2010 /
 
Sziasztok!

Elvileg csináltam egy Knight Rider futófényt, csak hát nem nagyon akar működni. A programsort csatoltam. Tudom a késleltetés enyhén szólva rövid, de nem akartam nektek azt a kódot adni, amiben olyan 30 CALL van egymás után Multisimben amúgy működik a kód. A valóságban annyit csinál, hogy a B port alsó négy lábán végigfut a fény és annyi. Légyszi segítsetek és mondjátok meg, hogy hol rontottam el.
Előre is köszi a segítséget!

knight.TXT
    
(#) brato válasza Atielektro hozzászólására (») Ápr 4, 2010 /
 
Nem vagyok teljesen biztos benne, de lehet, hogy kellene felhúzóellenállás a felső 4 lábra.
(#) zenetom válasza Atielektro hozzászólására (») Ápr 4, 2010 /
 
  1. BTFSS PORTB,4 ;vajon magas a 7.bit?ha igen akkor a kov. utaitas kimarad, egyebkent megy tovabb

Oda nem BTFSS PORTB,7 kéne?
(#) Atielektro válasza zenetom hozzászólására (») Ápr 4, 2010 /
 
De igen, csak megpróbáltam úgy is, hogy csak az alsó 4 bitet használom és elfelejtettem visszaírni. Ha azt 7-esre átírom a helyzet nem változik. Így is úgy is annyit csinál, hogy végigfut az alsó 4 LED-en a fény...
(#) Atielektro válasza brato hozzászólására (») Ápr 4, 2010 /
 
Nem hiszem, hogy az lenne a baja, mivel ha a portra 0xFFh-t küldök ki, akkor világít az összes LED.
(#) brato válasza Atielektro hozzászólására (») Ápr 4, 2010 /
 
Összeraktam próbapanelon az áramkört, jól működik.
(#) Hp41C válasza Atielektro hozzászólására (») Ápr 4, 2010 /
 
Szia!

Az rlf PORTB,f illetve az rrf PORTB,f utasítások után várj egy kicsit. A
  1. clrf PORTB
  2.  bsf PORTB,0
helyett használd a
  1. movlw 1
  2.  movwf PORTB

utasításokat. Ugyanis a PORTB írása után a kivezetéseken nem ugrásszerű a feszültség változása... A másik kérdés, hogy a kivezetésekre hogyan vannak kötve a LED-ek. Ellenőrizd le, hogy a kivezetésenek megjelenő feszültség felmegy-e 4V fölé, lemegy-e 0.8V alá...

A másik megoldás, hogy a PORTB helyett a műveletemet egy RAM rekeszen végzed el, és az esedményt movwf PORTB-vel írd a portra...

Szia
(#) Atielektro válasza Hp41C hozzászólására (») Ápr 4, 2010 /
 
Oké, köszi a tippeket, majd holnap kipróbálom őket.
(#) szitko hozzászólása Ápr 5, 2010 /
 
Kérdésem lenne egy hozzáértőhöz. Meg csak kezdö vagyok pic téren. A kérdés: Adott két villogó led melyek fél másodpercenként felváltva villognak, mit egy szubrutinnal állítottam be. A villogást egy gomb indítja. Idáig minden jó. Nekem azt kéne megcsináljam, hogy mikor megnyomom a gombot és elindult a villogás,egy másik porton 5mp után folyamatossan világítson egy led ugy, hogy a villogó megy tovább.
(#) icserny válasza szitko hozzászólására (») Ápr 5, 2010 /
 
A félmásodperces időzítésekből számolj le tízet, s akkor telt le az 5 másodperc, akkor kapcsold be a LED-et.
(#) szitko válasza icserny hozzászólására (») Ápr 5, 2010 /
 
Az időzítéssel nincs baj, csak a bekapcsolással. Nem tudom hova kell írni a port bekapcs parancsot, úgy, hogy a villogó menjen tovább.16f84-ről van szó.
(#) icserny válasza szitko hozzászólására (») Ápr 5, 2010 /
 
Feltételezem, hogy a mostani programodban van egy ilyen rész:
  1. Végtelen ciklus:
  2.    LED állapotváltás
  3.    0,5 s várakozás


Most ezt a végtelen ciklust kell kibővíteni egy feltételes résszel, ilyenre:

  1. Végtelen ciklus:
  2.    LED állapotváltás
  3.    0,5 s várakozás
  4.    Ha a számláló > 0 akkor
  5.       szamalaló = szamlaló-1
  6.       Ha a a számláló nulla lett, akkor a másik port bekapcsolása
(#) szitko válasza icserny hozzászólására (») Ápr 5, 2010 /
 
Köszi valami ilyesmire gondoltam én is. Próbálkoztam már evvel a verzióval, de nem jött össze.Lehet a parancsokat kevertem össze. Mint már írtam még csak most tanulom a progizást.
(#) icserny válasza szitko hozzászólására (») Ápr 5, 2010 /
 
A lényeg az, hogy a végtelen ciklus nem szakad meg, csak egy feltételes résszel bővül. A számlálót, amely egy adatregiszter (változó) a RAM területen, természetesen induláskor fel kell tölteni az 5 másodpernek megfelelő ciklusszámmal (jelen esetben 10-zel).
Idézet:
„Lehet a parancsokat kevertem össze.”
Lehet, de ezt a kód ismerete nélkül soha nem fogjuk tudni kideríteni...
(#) Atielektro hozzászólása Ápr 6, 2010 /
 
Sziasztok!

Egy olyan kérdésem lenne hozzátok, hogy MPLAB-ban való programozáskor a "_INTRC_OSC_NOCLKOUT" beállítás alapesetben milyen frekvenciájú belső oszcillátorra vonatkozik egy 16F628A-s esetében? A 4MHz-es vagy a 48kHz-es órajelre? Lényegében ezzel a definícióval a PCON regiszter 3-as bitje milyen állapotba kerül?
Amúgy a belső órajelek között egy sima BSF/BCF PCON,OSCF utasítással (persze a megfelelő bank-on) tudok váltani a programfutás közben? Gondolom ez után azért eltelik pár utasításciklus, mire beáll a stabil, új órajel...
Segítségeteket előre is köszönöm!
(#) potyo válasza Atielektro hozzászólására (») Ápr 6, 2010 /
 
A Register 4-6-nál az OSCF bit felett látsz egy R/W-1 jelölést, ami azt jelenti, hogy resetkor ez a bit 1-re áll be. Innen meg már gondolom sejted a választ a 4MHz/48kHz kérdésre.

Tudsz váltani, azt írja, hogy két régi és nyolc új oszcillátorciklus ideig tart a váltás, ez idő alatt a kontroller áll.
(#) Atielektro válasza potyo hozzászólására (») Ápr 6, 2010 /
 
Köszönöm.
Most már legalább tudom, hogy mit jelentenek azok a jelölések az adatlapban...eddig totál lényegtelennek tartottam és csak elsiklottam fölötte. Hát erősen tévedtem...
Még egyszer köszi a segítséget!
(#) szitko válasza icserny hozzászólására (») Ápr 9, 2010 /
 
Nem tudom kérdezhetek-e még tőled ebben a témában, de kezdőként nem jutok 1-ről a 2-re. Azthiszem így működnie kéne a felvetett témának.
Egy kicsit több mint amit leírtam.
(#) icserny válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Kérdezhetsz bátran, legfeljebb nem tudok válaszolni. A jószándék bennem volt, de nem tudom követni a programod logikáját (ami a kisebbik baj), de félek, hogy te sem. Készítettél folyamatábrát, ami papíron lekövetve logikailag helyes algoritmust ír le?

Mindenesetre az ebben a hozzászólásomban ajánlott algoritmusnál arra kellene ügyelni, hogy a fő ciklusban levő késleltetések közé ne iktass be újabb késleltetéseket, mert akkor felborul az időlánc!

Ha az SF lenne a korábban tárgyalt fő ciklus, akkor abban egy számlálórekeszt kellene csak kezelni (az alap időegység többszörösének meghatározásához), és annak tartalmától függően csökkenteni, vagy nem csökkenteni, illetve kapcsolni vagy nem kapcsolni. Kiugrani és ott újabb késleltetőeljárást beiktatni semmiképp sem ildomos. A JEP eljárásban művelt dolgok ezért biztosan nem odavalók! Mellesleg a JEP eljárás végén a GOTO JELP is érthetetlen számomra. Hogy kerülsz vissza a RETURN-hoz?

Az egymás utáni BCF, BSF utasításoknál gond lehet (read-modify-write probléma, nézz utána!), amit pl. úgy kerülhetsz el, hogy B regiszternek egy másolatát tárolsz egy LATB nevű változóban, ezen végzet a bitbillegtetéseket, majd kiírod a PORTB-re. A PIC18 mikrovezérlők ez hardveresen csinálják, itt viszont marad a "magad uram, ha szolgád..." akarom mondani: hardveres LATB regisztered nincsen!

A szubrutinokhoz jó lenne odaírni, hogy melyikmitcsinál! Az SPV "piros villogó"megjegyzése viszont félrevezető, mert ez csak egy késleltető eljárás. Ilyenkor a 100ms késleltetés (vagy annyi, amennyi) megjegyzés célravezetőbb volna.
Következő: »»   61 / 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