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   356 / 1210
(#) potyo válasza Hp41C hozzászólására (») Jan 23, 2013 /
 
Idézet:
„A full optimalizálás pofátlanul drága.”


Abból van ilyen 45 napos verzió, nem? Csinálni kell virtuális gépet, amire felrakod az MPLAB-ot, kompletten lemented a virtuális gépet, 45 naponta visszaállítod a mentésből, felrakod rá az XC8-at és ismét van 45 napig teljes verziós fordítód Persze tudom, nem épp ideális megoldás, de ha más nincs...
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Szóval. Mivel ilyen szinten rabolja az értékes helyet, de fontos a c-ben akár a bonyolultság , vagy más miatt dolgoznunk, akkor kiegészítőként muszáj memóriakártyát használni?! Persze a sebességet ezzel sem szerezzük vissza. Én személy szerint a pic öszetettebb usb-s kommunikációja miatt kezdtem el. De persze nagyon az alapoknál vagyok. Még az assembly sincsen teljes szélességében kihasználva. De való igaz ha nem azzal kezdem akkor most tényleg semmit sem értenék az egészből.
(#) potyo válasza n_yálastrubadúr hozzászólására (») Jan 23, 2013 /
 
A programkód esetén nem sok mindent érsz el a memóriakártyával...
(#) Hp41C válasza potyo hozzászólására (») Jan 23, 2013 /
 
Szia!
Nem ilyen egyszerű, az XCakármi minden indításánál elmegy, körülnéz a Microchip-nél, megnézi van-e állandó licenszed vagy nem járt még le a beregisztrált ingyenes időtartamod. Ha lejárt, a Free mode érhető csak el. 60 naponként új gép vagy új internet szolgáltató?? Egyébként az XC8 fordítása rendkívül lassú... Fizess, fizess, fizess alapon... (XC8 + XC16 + XC32 licensz már egy vagyon.) Ez a példa az ingyenes full optimalizálásnál is jelentezett:
  1. movf  z,w
  2.     movwf x
  3.     movlw 0x0F
  4.     andwf z,f

a
  1. movf z,w
  2. andlw 0x0f
  3. movwf x

helyett, ami rövidebb (még akkor is, ha lapváltás is kellene), egy egyszerű Midrange is meg tudja csinálni és mellesleg jól működik...
A hozzászólás módosítva: Jan 23, 2013
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Az előbb hülyeséget írtam. Igazából a meóriakártya csak adatokra jó. De lehet olyat, hogy saját, ami ugyan elég furcsa, de bizonyos részeit a pic maga újraírja a memóriakártyán tárolt programmal?
Szerk: Persze mindent meg lehet csinálni, de bonyolultság/haszon viszonylatban?
A hozzászólás módosítva: Jan 23, 2013
(#) kissi válasza Hp41C hozzászólására (») Jan 23, 2013 /
 
Ezt nem értem, a kettő nem ugyanazt csinálja szerintem ( nem csak a méret a különbség!)!
Ha jól látom az elsőnél x=z(eredeti), z=z&0x0F, míg a másodiknál x=z&0x0F , z=z(eredeti)!? Így nincs értelme összehasonlítani, mert nem ugyanaz az eredmény ( már késő van, remélem nem néztem el ! ) !?
Steve
A hozzászólás módosítva: Jan 23, 2013
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Szerintem az első a fordító hülyesége és a 2. ahogy kellene lennie.
(#) kissi válasza n_yálastrubadúr hozzászólására (») Jan 23, 2013 /
 
HP41C kolléga a Bővebben: Link hozzászólásban azt írta, hogy
Idézet:
„A feladat az lett volna, hogy a z alsó 4 bitjét írjuk be az x be. A felső 4 biten lehetnek nem 0 bitek.”
: az a baj, hogy ezzel nem csak a megszakítás jöhet rosszkor, hanem nem is azt csinálja!
Így, ha nem néztem el, akkor abszolút mindegy a hosszuk, mert nem egyforma a végrehajtott feladat !
Steve
(#) n_yálastrubadúr hozzászólása Jan 23, 2013 /
 
Értem. Tényleg mindegy a megszakítás ha jön is, akkor is rossz a művelet.visszatérve, tényleg pofátlan a fordítóktól, hogy ennyire teli nyomják sallanggal a kódot.
(#) Hp41C válasza kissi hozzászólására (») Jan 24, 2013 /
 
Szia!
Köszönöm az észrevételt. Ennyire nem akartam rossz hírét kelteni a fordítónak, hanem valamit elírtam...
Ez lett volna a kiindulás:
  1. movf  z,w
  2.         movwf x
  3. // Ha itt jön a megszakítás, aakor a megszakítási rutinban x == z !!
  4.         movlw 0x0F
  5. // Ha itt jön a megszakítás, akkor a megszakítási rutinban x == z !!
  6.         andwf x,f
  7. // Ha itt jön a megszakítás, akkor a minden rendben x == z & 0x0F.
(#) kissi válasza Hp41C hozzászólására (») Jan 24, 2013 /
 
Szia!
Nem gondoltam, hogy rossz hírét akarod kelteni a fordítónak, nem úgy ismertelek meg itt a fórumon... Én nem vagyok annyira benne a C-ben, bár csináltam már néhány dolgot, de úgy gondolom, hogy erre már nem figyel egyik fordító sem, hogy ha a normál ( W, STATUS, BSR PIC18 ) regisztereken kívül akarok valamivel foglalkozni a megszakításon kívül, azt ő eldöntse, hogy engedje vagy ne engedje a megszakítás kiváltását! Ha ezt akarom, akkor le kell tiltanom a megszakítás fogadást ( GIE )! Mindenesetre tanulságos eset ez is, mint egy másik topicban Potyo-é, mert az ember nem biztos, hogy alapból gondol erre ( de ha assemblerben írod, akkor Te is beszúrod a sorokat, ezért is jó szerintem assembly-vel kezdeni !) !
Steve
A hozzászólás módosítva: Jan 24, 2013
(#) Hp41C válasza kissi hozzászólására (») Jan 24, 2013 /
 
Szia!
Idézet:
„... hogy ha a normál ( W, STATUS, BSR PIC18 ) regisztereken kívül akarok valamivel foglalkozni a megszakításon kívül, azt ő eldöntse, hogy engedje vagy ne engedje a megszakítás kiváltását! ...”

Nem az okozta a problémámat, hogy a fordító eldöntheti-e, hogy belefordítsa a megszakítást tiltó és engedélyző utasításokat - tovább nyújtva feleslegesen a programot.
Hanem az, hogy nem az elvárható formát fordítja be a programba. Tegyük fel, hogy egy normál Midrange kontrollerről van sz, amiben az x és a z ráadásul kölön lapon van. A C sor így nézett ki:
  1. x = z & 0x0F;

Az elvárt programrészlet így nézne ki:
  1. banksel z
  2.      movf  z,w
  3.     // Ha itt jön a megszakítás, akkor a megszakítási rutinban x még a régi értéket tartalmazza !!
  4.             andlw 0x0F
  5.     // Ha itt jön a megszakítás, akkor a megszakítási rutinban x még a régi értéket tartalmazza !!
  6.             banksel x // Ez egy makro, akárhány utasításból is állhat.
  7.     // Ha közben jön a megszakítás, akkor a megszakítási rutinban x még a régi értéket tartalmazza !!
  8.             [b]movwf x  // Ez egy primitív művelet, amit a megszakítás nem tud félbeszakítani ![/b]
  9.     // Ha itt jön a megszakítás, akkor a minden rendben x == z & 0x0F.

Hasonlítsuk össze a befordítottal:
  1. movf  z,w
  2.             banksel x // Ez egy makro, akárhány utasításból is állhat.
  3.     // Ha közben jön a megszakítás, akkor a megszakítási rutinban x még a régi értéket
  4.             movwf x
  5.     // Ha itt jön a megszakítás, akkor a megszakítási rutinban x == z !!
  6.             movlw 0x0F
  7.     // Ha itt jön a megszakítás, akkor a megszakítási rutinban x == z !!
  8.             andwf x,f
  9.     // Ha itt jön a megszakítás, akkor a minden rendben x == z & 0x0F.

Ezzel a kóddal két helyen is "megteremtődik" a hibás működés lehetősége... A "normál" felhasználóban a gyanú sem merül fel, hogy a fordított kód idétlensége miatt hibázik a programja.
Ez már jó kódra fordul, de újabb RAM helyeket foglal...
  1. y = z & 0x0F;  x = y;


Szerintem egy igencsak gyakran használt számítási műveletről van szó, amit kötelesség lett volna rendesen, optimálisan megoldani.
A hozzászólás módosítva: Jan 24, 2013
(#) kissi válasza Hp41C hozzászólására (») Jan 24, 2013 /
 
A hibázási lehetőségeket láttam és szerintem utaltam rá én is. Az x és z külön bankban? Ezt a fordítónak tudni kell, erre eddig nem volt utalás! Mégegyszer megkérdezem, hogy tudsz-e olyan C fordítóról, ami automatikusan tiltja egy változó módosítása alatt a főprogramban a megszakítás elfogadását, ha az a változó használt a megszakítás rutinban ( úgy gondolom, hogy ilyen nincs, mert a program fordítója nem tudhatja, hogy ezek egyidőben bekövetkezhetnek-e !) ?
Steve
szerk.: nem érzem magam profinak C-ben, csak pont ezért kérdezősködöm, hogy előre felkészüljek az ilyen meglepetésekre !
A hozzászólás módosítva: Jan 24, 2013
(#) icserny válasza kissi hozzászólására (») Jan 24, 2013 /
 
Idézet:
„tudsz-e olyan C fordítóról, ami automatikusan tiltja egy változó módosítása alatt a főprogramban a megszakítás elfogadását”
Remélem, hogy nincs ilyen és szerintem nem a megszakítás letiltása a megoldás.

pl. ring bufferes UART kezelés mutatójának léptetésénél, ahol inkrementálás után meg kell vizsgálni, hogy nem kell-e visszaléptetni a tár elejére, én egy segédváltozóban végzem a számítást és csak a a végeredményt írom be. (A megszakítás csak olvassa ezt a mutatót, de kínos lenne, ha ideiglenesen rossz helyre mutatna...)

pl. hardver regiszterek matatásánál, ahol a főprogram csak bizonyos biteket matathat, miközben a megszakítás ugyanazon regiszter más bitjeit matathatja, bevált megoldás az XOR művelet alkalmazása.
#define ChangeBits(reg,val,mask) reg ^= ((reg^val) & mask)

Ha felmerül a gyanú, hogy a fordító ezt "félrefordítja" (C18-at használva eddig nem volt gondom vele), akkor assembly betétként kell megírni. PIC24-re egyszer valamelyik topikba bemásoltam egy ilyen assembly betétes makrót, amit az AVIX RTOS szerzője tett közzé a Microchip fórumán valamelyik RTOS topikban. Ott pont az volt a téma, hogy egy RTOS-t is meg lehet írni a megszakítás letiltása nélkül.
A hozzászólás módosítva: Jan 24, 2013
(#) kissi válasza icserny hozzászólására (») Jan 24, 2013 /
 
Idézet:
„A megszakítás csak olvassa ezt a mutatót, de kínos lenne, ha ideiglenesen rossz helyre mutatna...)”
HP41C felvetésénél is problémát okoz, ha csak olvassa is, eből alakult ez a beszélgetés... A Te megoldásodnál, ha nem tiltod le közben a megszakítást, akkor mi biztosítja, hogy amikor vissza kellene tenni a mutatót az elejére, akkor nem a művelet közben jön a megszakítás ( gondolom, hogy a felépítés alapján ez nem következhet be, mert addig nem érkezhet megszakítás valamilyen okból ! )?!
Idézet:
„Remélem, hogy nincs ilyen és szerintem nem a megszakítás letiltása a megoldás.”
Ezt én is remélem, de adott esetben nem tudok mást elképzelni, mint a megszakítás letiltása, amit viszont a programozóra kell bízni!
Steve
(#) Hp41C válasza kissi hozzászólására (») Jan 24, 2013 /
 
Idézet:
„Az x és z külön bankban? Ezt a fordítónak tudni kell, erre eddig nem volt utalás!”

Tudja és helyesen kezeli a bankokat.
Idézet:
„Mégegyszer megkérdezem, hogy tudsz-e olyan C fordítóról, ami automatikusan tiltja egy változó módosítása alatt a főprogramban a megszakítás elfogadását, ha az a változó használt a megszakítás rutinban ( úgy gondolom, hogy ilyen nincs, mert a program fordítója nem tudhatja, hogy ezek egyidőben bekövetkezhetnek-e !)”

Úgy érzem nem értjük egymást:
Legyen u egy olyan változó, amit a megszakítás rutin is kezel.
Primitív művelet: Egy gépi utasítás, amit a megszakítás nem tud félbeszakítani, így a művelet egyben végrehajtódik. Pl: incf u,f esetén az olvasás növelés és visszaírás fázisokat a megszakítás nem tudja elválasztani egymástól.
Nem primitív művelettel is meg lehet oldani a feladatot, de a feladat elvégzésének idejáre tiltani kell a megszakítást (ahogy írod): pl. az u növelése movf u,w incf u,w movwf u csak abban az esetben működik jól, ha kiegészítjük a következőkkel (tekintsünk el attól, hogy egyes típusokban meg kell győződni, hogy a GIE bit valóban 0 -ra állt) movf INTCON,w movwf intconsave bcf INTCON,GIE movf u,w incf u,w movwf u btfsc intconsave,GIE bsf INTCON, GIE. Nem lehet bambán engedélyezni a megszakítást, hiszen akkor is hívhatták a rutint, ha épen tilva volt... Nem egyszerűbb azt a bizonyos egy utasítást használni mindig, ami minden esetben működik?

Az x = z & 0x0F; C beli sor fordítása esetén az elvárt kód (fent már idéztem movf z,w banksel x andlw 0x0F movwf x) primitív műveletet használ az x állítására. Így a C sort leíró szerző (nem a fordító) nem is gondol arra, hogy a le kellene tiltani a megszakítást. E helyett egy nem primitív művelettel megvalósított kód fordul, amit csak a fordító által írt asm állomány vizsgálatával lehet kideríteni. Hányan nézik meg, hogy egy fordító milyen assembly utasítássorozatra fordítja a C programjának sorait. Meg sem fordul a fejében... Sok-sok programot írtam már, rögtön gyanús lett, amikor nem jól működött. Az a vicc az egészben, hogy a cég más fordítója (C18) pedig jó kódot fordít a fenti sorra. Ez megkérdőjelezi a C egyetlen megmaradt előnyét: Hordozható ezek után egy C program? Vagy minden fordítóra való áttérés esetén egyesével végig kell nézni minden utasításhoz lefordított assembly sorok helyességét. Pont azért választják a C -t, mert nem szeretnének assembly -vel vesződni. Ráadásul az XC8 uniója szeretett volna lenni a HiTech Midrange és a hajdani 18F -hez írt C18 -nak. Tehát még nem is térek át más fordítóra sem, ha a 18F2550 -ről egy egyszerű programot szeretnék a 16F1459 -re portálni. Az esetemben ez törént és megdöbbenten vettem észre a következőket:
18F2550 (32kb azaz 16kw program memória) C18: a programtár felénél egy kicsit többet elfoglaló program, ami az USB mellett egy kétirányú UART kapcsolatot is képes tartani egyidőben.
16F1459 (8kw): Ugyan az a program (a kisebb kontroller miatt UART kapcsolat nélkül) full optimalizálással sem fért bele a programtárba. Az utasításokat kb. assembly szintre átírva, full optimalizálás mellett kb 2 kw -val lehetett csökkenteni a program méretét - végül belefért a kontrollerbe. Ekkor jöttek a fentihez hasonló proiblémák...

icserny:
Idézet:
„én egy segédváltozóban végzem a számítást és csak a a végeredményt írom be.”

Leírtam, hogy átmeneti változóval jól működik. De minek átmeneit változó a C szintjén, ha ott a WREG, amit úgyis használ. Az andlw 0x0F utasítás használatával megoldódna minden... Az a baj, hogy nem is gondol rá az ember, hogy nem az forítódik bele. A te esetedben a programozó "felkészül" a problémára.
Idézet:
„Ha felmerül a gyanú, hogy a fordító ezt "félrefordítja" (C18-at használva eddig nem volt gondom vele), akkor assembly betétként kell megírni.”

XC8 Midrange fordítóról beszélünk....
Igen lehet assembly betét... Más állományban van - átláthatatlanabb a program. Külön függvényben - optimaliztálás letiltása csak rövid kódot érint. Minden esetre külön függvényt írni? Egy andlw 0x0F -nek is? Abban a függvényben, amiben kell - Az egész függvény optimalizálását letiltja egyetlen asm sor.

Nem kellene annyi pénzért "használható" fordítót adni?? A fórumukat olvastátok? Milyen gyorsan letörölték a hozzászólást, ami ecsetele ezeket a hibákat.
A hozzászólás módosítva: Jan 24, 2013
(#) n_yálastrubadúr hozzászólása Jan 24, 2013 /
 
Készen lettem az assembyben is megírt, 32 bites távirányító értelmezésével amit lcd ír ki c.-ben. Én is már az elején hiányoltam a sublw egyszerű nagyszerűsűgét. Úgy látszik bőven nem ez a cél ehelyett ,megszámoltam 4x hosszabb ez a program. Nem vagyok nagyon paranoiás de gyanítom szándékosan bosszantják az embert, hogy a kezdő is elborzadjon hogy a 900 soros programból 30 felesleges goto. És majd akkor megy vásárolni. Persze a fentebb tárgyalt alantasabb hibát nagy öröm megtalálni de sokkalta jobb idegméreg. Ennek ellenére továbbra is gyakorlom ezt a nyelvet!
(#) n_yálastrubadúr hozzászólása Jan 24, 2013 /
 
Feltettem az Mplabx-et ugyanaz a program lefordul, de nem megy. Biztosan köze van a kövezkező képnek hozzá. Kicsit idegen ez a program még.

x.JPG
    
(#) icserny válasza kissi hozzászólására (») Jan 24, 2013 /
 
Idézet:
„A Te megoldásodnál, ha nem tiltod le közben a megszakítást, akkor mi biztosítja, hogy amikor vissza kellene tenni a mutatót az elejére, akkor nem a művelet közben jön a megszakítás?”
Jöhet közben megszakítás, mert nem a kritikus változón, hanem annak egy másolatán végzem az inkrementálás, ellenőrzés és szükség esetén korrekció - nyilvánvalóan nem atomi - műveleteit. A végeredmény beírása a kritikus változóba már egyetlen lépés, azzal nincs gond.
(#) icserny válasza Hp41C hozzászólására (») Jan 24, 2013 /
 
Idézet:
„Nem kellene annyi pénzért "használható" fordítót adni?”
Dehogynem!
De ezen én nem tudok változtatni (igaz, pénzt sem adtam érte...).
Idézet:
„Igen lehet assembly betét... Más állományban van - átláthatatlanabb a program.”
Én _asm _endasm közé zárt assembly betétre gondoltam, nem külön fordítási egységre.
(#) Hp41C válasza icserny hozzászólására (») Jan 24, 2013 /
 
Idézet:
„Én _asm _endasm közé zárt assembly betétre gondoltam”

Egy ilyen sor a függvényben az egész függvényt kizárja az optimalizálásból...
(#) kissi válasza icserny hozzászólására (») Jan 24, 2013 /
 
Aha, értem már, hogy mire gondoltál ( nem esett le, hogy így egy sor lesz, pedig HP41C-nél ezt kapásból értettem ) !
Steve
(#) kissi válasza Hp41C hozzászólására (») Jan 24, 2013 /
 
Szia!
Köszönöm, így már értem !
Ezt viszont nem :
Idézet:
„Nem lehet bambán engedélyezni a megszakítást, hiszen akkor is hívhatták a rutint, ha épen tilva volt.”
Itt mire gondoltál?!
Steve
(#) potyo válasza kissi hozzászólására (») Jan 24, 2013 /
 
Pl. ha ez a kritikus kódrészlet egy másik függvényben van, akár másik fájlban, és te a hívása előtt más okból tiltod a megszakítást, akkor miután ezt lefuttatod, engedélyezve lesznek a megszakítások, miközben te nem szeretted volna. Tehát minimum ki kell azzal egészíteni, hogy tiltás előtt megnézni, hogy mi volt a helyzet, és az engedélyezés helyén meg megnézni, hogy mi volt, és attól függően engedélyezni vagy sem.


Egyébként a volatile kulcsszó használata a váltózó létrehozásánál nem javítana itt a problémán?
(#) kissi válasza potyo hozzászólására (») Jan 24, 2013 /
 
OK, értem!

Steve
(#) Johnny0004 hozzászólása Jan 24, 2013 /
 
Üdv, megkérdezem, hátha: valakinek nincs esetleg mikrobasic-ben egy kész rotary encoder progi, amiből tudnék bogarászni, mert én nem tudom sajna megcsinálni? Köszönöm!
(#) tomat5 válasza Johnny0004 hozzászólására (») Jan 24, 2013 /
 
Szia
CCS-hez van egy működő kódom, ha az segít. Esetleg át tudnád írni.
(#) Johnny0004 válasza tomat5 hozzászólására (») Jan 24, 2013 /
 
Ok, köszönöm!
(#) Gránátalma hozzászólása Jan 24, 2013 /
 
Sziasztok!
Valaki tudna nekem segíteni esetleg?

ASSEMBLY-ben tanulok pic-et programozni, de én jobban szeretnék áttérni C-re.

Most analóg bemeneteknél tartok kb, meg nyomógombnál, bit figyelésnél.

Szeretnék megkérni valakit, hogy egy programot (kompletten, csak fel kelljen égetni) írjon le nekem C-ben.
Egy szimpla ledes villogás megteszi kb. Csak látni akarom, hogyan épül fel, mit tartalmaz. Innentől meg majd megoldom a továbbiakat magamtól.
Mondjuk ezt:
  1. #include <p16f887.inc>
  2. #include <digital_io.inc>
  3.  
  4. Main:
  5.                 clrf            PORTD
  6.                 btfsc           PORTB,0
  7.                 goto            $-1
  8.                 btfss           PORTB,0
  9.                 goto            $-1
  10.                 call            Delay
  11.                 call            program
  12.  
  13. program:
  14.  
  15.                 bsf                     PORTD,0
  16.                 rrf                     PORTD
  17.                 call            Delay
  18.                 rrf                     PORTD
  19.                 call            Delay
  20.                 goto            $-4
  21. gomb:
  22.                 btfsc           PORTB,0
  23.                 Return 
  24.                 btfss           PORTB,0
  25.                 goto            $-1
  26.                 goto            Main
  27. Delay:
  28.                 call            gomb
  29.                 decfsz          Delay1,f
  30.                 goto            $-1
  31.                 decfsz          Delay2,f
  32.                 goto            Delay
  33.                 Return         
  34.  
  35. end


digital_io:
  1. #include        <P16F887.inc>
  2. cblock  0x20
  3. Delay1
  4. Delay2
  5. Counter ;tárolja a számot, amit majd kiírunk.
  6. Counter2
  7. endc
  8.  
  9. Org 0
  10.  
  11. Pinset:
  12.                 banksel         TRISD
  13.                 clrf            TRISD
  14.                 bsf                     TRISB,0
  15.                 banksel         ANSEL
  16.                 clrf            ANSEL
  17.                 banksel         ANSELH
  18.                 clrf            ANSELH
  19.                 banksel         PORTD
  20.                 clrf            PORTD



És ezt:

  1. #include <p16f887.inc>
  2. #include <digital_io.inc>
  3.  
  4. Main:
  5.                 clrf            PORTD
  6.                 btfsc           PORTB,0
  7.                 goto            $-1
  8.                 btfss           PORTB,0
  9.                 goto            $-1
  10.                 call            Delay
  11.                 call            program
  12.  
  13. program:
  14.                 movlw           0x00
  15.                 movwf           PORTD
  16.                 call            Delay
  17.                 call            Delay
  18.                 movlw           0xaa
  19.                 movwf           PORTD
  20.                 call            Delay
  21.                 call            Delay
  22.                 movlw           0x55
  23.                 movwf           PORTD
  24.                 call            Delay
  25.                 call            Delay
  26.                 movlw           0xaa
  27.                 movwf           PORTD
  28.                 call            Delay
  29.                 call            Delay
  30.                 goto            program
  31.        
  32. gomb:
  33.                 btfsc           PORTB,0
  34.                 Return 
  35.                 btfss           PORTB,0
  36.                 goto            $-1
  37.                 goto            Main
  38. Delay:
  39.                 call            gomb
  40.                 decfsz          Delay1,f
  41.                 goto            $-1
  42.                 decfsz          Delay2,f
  43.                 goto            Delay
  44.                 Return         
  45.  
  46. end


Előre is köszönöm, akinek lesz egy kis ideje és türelme hozzá!

(#) icserny válasza Gránátalma hozzászólására (») Jan 24, 2013 /
 
Milan Verle könyvét ebben a topikban többször is ajánlottuk.
PIC Microcontrollers - Programming in C
Következő: »»   356 / 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