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   616 / 1210
(#) eSDi válasza SzT3 hozzászólására (») Jan 6, 2015 /
 
Amit linkeltem weboldalt, ott a Using Dynamic Data Exchange menüpontban vannak C# nyelven példák. Többet ebben sajnos nem tudok segíteni, a C#-t nem nagyon komálom, a DDE-t pedig most láttam először közelről.
(#) Bakman válasza csiberaptor hozzászólására (») Jan 6, 2015 / 1
 
Ez is, az is jó. Igazábol gerjedés ellen vannak ott azok a kondik. Talán azért használnak sokan 100 nF-os kondikat, mert ez az érték egy nagyon általános zavarszűrő elem, nagyobb valószínűséggel megtalálható minden hobbistánál.
(#) Hp41C válasza eSDi hozzászólására (») Jan 6, 2015 /
 
Nagyon régen, több, mint 10 évvel ezelőtt írtam Delphi -ben egy dupla DDE szervet vagy klienst. (Nem emlékszem már rá. Feltúrtam a gépeimet, de már nyomát sem találtam.) Az volt a feladata, hogy összekössön két rendszert. Egy Mettler Toledo mérleget és a B* programot. Végülis a mért érték bekerült a programba. Az egész program nem volt 100 sor, mivel a Delphi tartalmazott beépített komponenseket a DDE szerver és kliens funkcióra.
A hozzászólás módosítva: Jan 6, 2015
(#) vicsys hozzászólása Jan 6, 2015 /
 
Egy újabb tutorial került fel a videóim közé. Most egy lépcsőházi világítás automatát programozunk le. Fogadjátok sok szeretettel!
Bővebben: Link

CCS Logo.jpg
    
(#) SzT3 válasza Hp41C hozzászólására (») Jan 6, 2015 /
 
Igen java részt mindenki Delphi-be írja ezeket..
(#) Kapagerenda hozzászólása Jan 6, 2015 /
 
Sziasztok,

Teljesen kezdő vagyok a C programozás terén. Készítettem egy programot aminek egyszerű feladata van gombnyomás hatására a PORTD kimenet egyes bitjeit (01010101) aktív állapotba hozza ellenkező esetben más értéket (01000000) kapunk a PORTD kimeneten.
A problémám az, hogy az ELSE feltétel nem teljesül hiába nyomom meg a gombot.
Annyit kell még erről tudni, hogy akkor kerül feszültség a PORTB0-ra ha a gombot nem nyomjuk meg tehát fordított működésű. Elúre is kösz!
  1. void main() {
  2.  
  3.     ANSEL = 0;                
  4.     ANSELH = 0;
  5.     PORTD = 0;
  6.     TRISD = 0;
  7.     PORTB = 0;
  8.     TRISB = 0xff;
  9.  
  10.     if (PORTB = 1)
  11.         PORTD = 0b00000010;
  12.     else
  13.         PORTD = 0b01010101;
  14.  
  15.     while(1);
  16. }
(#) cross51 válasza Kapagerenda hozzászólására (») Jan 6, 2015 /
 
Ez a program akkor teljesülne ha bekapcsolás előtt már nyomva tartanád a gombot az if else szerkezet tedd a while(1){} be és működni fog.
valahogy így:
  1. while(1)
  2. {
  3.     if (PORTB = 1)
  4.         PORTD = 0b00000010;
  5.     else
  6.         PORTD = 0b01010101;
  7. }
(#) Kapagerenda hozzászólása Jan 6, 2015 /
 
Tényleg így már okkés lett a dolog Kösz a segítséget! Viszont érdekes ha teszek pontosvesszőt a while(1) után akkor semmi sem történik magyarán a LED-ek nulla állapotban vannak, ha megnyomom a gombot ha nem.
(#) csiberaptor válasza Kapagerenda hozzászólására (») Jan 6, 2015 /
 
Ezért nem teszünk pontosvesszőt ilyen esetben a while után.
(#) benjami válasza Kapagerenda hozzászólására (») Jan 6, 2015 /
 
A while egy elöltesztelő ciklus, aminek jelen esetben 1 a feltétele. Mivel az egy az mindig logikai igazat jelent, a while(1) végtelen ciklust csinál. A ciklusmagban, a zárójel utáni utasítás vagy utasításblokk fog végrehajtódni. Ha csak egy pontosvessző van utána, akkor ez csak egy üres utasítás lesz, és az if-es részig sosem jut el a program.
(#) vicsys válasza Kapagerenda hozzászólására (») Jan 7, 2015 /
 
A feltétel vizsgálat 2db. egyenlőség jellel történik. Az 1db. egyenlőség jel az értékadás...
(#) Hp41C válasza Kapagerenda hozzászólására (») Jan 7, 2015 /
 
Így is jó lenne:
  1. void main() {
  2.      
  3.         ANSEL = 0;              
  4.         ANSELH = 0;
  5.         PORTD = 0;
  6.         TRISD = 0;
  7.         PORTB = 0;
  8.         TRISB = 0xff;
  9.         do{
  10.         if (PORTB == 1)
  11.             PORTD = 0b00000010;
  12.         else
  13.             PORTD = 0b01010101;
  14.      
  15.         }while(1);
  16.     }
A hozzászólás módosítva: Jan 7, 2015
(#) killbill válasza Hp41C hozzászólására (») Jan 7, 2015 /
 
De a C nyelv definicioja szerint a vegtelen ciklusokra a
  1. for(;;)
ajanlott es nem a while(1);
Egy rosszul vagy egyaltalan nem optimalizalo fordito a while(1)-bol elofordul, hogy rosszabb kodot fordit. A CP/M-es Manx C fordito a while(1)-bol azt forditotta, hogy betoltott a HL regiszterbe 1-et, majd megvizsgalta, hogy a HL regiszter erteke nullatol kulonbozo-e. Ahogy elneztem a multkor a C18 forditasat, lehet, hogy az is valami hasonlot csinalna. A Manx fordito vedelmere azt tudni kell, hogy az a program 40 kilobyte hosszu volt es 8080 processzoron futott, nem pedig egy mai PC-n.
(#) Hp41C válasza killbill hozzászólására (») Jan 7, 2015 /
 
Idézet:
„CP/M-es Manx C fordito...”

E téma címe: "PIC kezdőknek"
Amit írok csak és kizárólag a Microchip PIC fordítóira igaz.
Tapasztalataim a PIC C fordítóival:
- végtelen ciklusokat a fordítók egyszerű ugrásra optimalizálják. Nem beszélnék azokról a szörnyűségekről, amit az ingyenes XC8 művel...
- "for(){}" elől tesztelő ciklus. Ha nem üres, végtelen ciklusról van szó az alábbi történik: inicializálás, teszt, ciklusmag, ugrás a ciklusváltozó módosítására, ugrás a tesztelésre.
- "while(){}" elől tesztelő ciklus. Ha nem üres, végtelen ciklusról van szó az alábbi történik:
teszt, ciklusmag, ugrás a tesztelésre. A ciklusváltozó "kezelése" a mag feladata.
- "do{}while()" végen tesztelő ciklus. Ha nem üres, végtelen ciklusról van szó az alábbi történik:
ciklusmag, tesztelés, ugrás a ciklus elejére. Az inicializálást a do előtt kell megtenni, a ciklusváltozó "kezelése" a mag feladata.
Hány, de hány végtelen ciklus valósult már meg, hogy a ciklusváltozó "kezelése" kimaradt a do - while illetve a while ciklusból...
A harmadik a for -hoz képest két, a while() -hez képest egy ugrással kevesebb.
Nem szeretnék vitatkozni, de egy nyelv nem ad definíciókat szemantikai problémákra, csak egy szintaktikai szabályrendszert a probléma leírására.
Murhphy: A C redkívül sok lehetőséget nyújt a végtelen ciklus megvalósítására.
A hozzászólás módosítva: Jan 7, 2015
(#) killbill válasza Hp41C hozzászólására (») Jan 7, 2015 /
 
A CP/M-es forditot csak peldanak hoztam fel arra az esetre, hogy egy while(1)-bol egy gyengebb fordito felesleges vizsgalatokat fordithat, mig a for utasitas feltetelenek kihagyasabol minden fordito egyertelmuen vizsgalat nelkuli vegtelen ciklust fordit. Csak azert emlitettem, mert a C18-as forditas, amit belinkeltel a "var = (var << 8) | new;" sorra, abbol az derult ki, hogy a C18 irtozatosan hosszu kodot fordit, es nem mellesleg van benne egy hiba is. Tehat az is lehet, de ezt nem tudom, hogy a while(1)-bol is rosszabb kodot fordit, mint a for( ; ; )-bol. Innentol kezdve meg mar "pic kezdoknek" tema is.

Vitazni en sem akarok, ez termeszetes. De a C nyelv igenis definialja a vegtelen ciklus fogalmat, megpedig, ugy hogy ha a for utasitasbol a kozepso kifejezest, a feltetelvizsgalatot elhagyod: tehat for ( kif ; ; kif ), akkor az vegtelen ciklus lesz. (K&R konyv, elso kiadas, 68. oldal). Nem azert lesz vegtelen ciklus, mert a ciklus feltetelet konstans, nullatol kulonbozo ertekre allitod pl: while( 1 ), hanem azert, mert elhagyod. De ezt csak a for eseten teheted meg, es ez a lehetoseg kifejezetten a vegtelen ciklusokhoz lett igy kitalalva. Es mivel a masik ket kifejezest is el lehet hagyni a for() eseten, ezert a for( ; ; ) a vegtelen ciklus legegyszerubb megoldasa. Meg gepelni is kevesebbet kell.

Mellesleg a C ben nincs olyan, hogy ciklusvaltozo. Az, hogy a legtobb esetben van egy valtozo is a for ciklusban, amit inicializasz, aztan vizsgalod, es meg novelgeted is, az nem jelent semmit. A basic-ben igen, ott van, mert a for maskepp nem tud mukodni, annak kotelezoen van egy ciklusvaltozoja. A C ben a for az csak egy kibovitett while(), semmi tobb.
A hozzászólás módosítva: Jan 7, 2015
(#) Hp41C válasza killbill hozzászólására (») Jan 7, 2015 /
 
Idézet (c) B. W. Kernighan - D. M. Ritchie:
Idézet:
„3.5. A while és a for utasítás
Már találkoztunk a while és for ciklusokkal. A
while (kifejezés)
utasítás
szerkezetben a gép kiértékeli a kifejezést. Ha értéke nem nulla, akkor végrehajtja az utasítást és ismét kiértékeli a kifejezést. Ez a ciklus mindaddig folytatódik, amíg a kifejezés 0 nem lesz, amikor is az utasítás után a végrehajtás végetér.
A for (kif1; kif2; kif3)
utasítás alakú for utasítás egyenértékű a
kif1;
while (kif2) {
utasítás
kif3;
}alakkal. Nyelvtanilag a for mindhárom összetevője kifejezés. Többnyire kif1 és kif3 értékadás vagy függvényhívás, kif2 pedig relációs kifejezés. A három kifejezés bármelyike elhagyható, de a pontosvesszőknek meg kell maradniuk. Ha kif1 vagy kif3 marad el , akkor
a ; egyszerűen elmarad a kifejtésből. Ha a kif2 vizsgálat nem szerepel, akkor állandóan igaznak tekintjük, így for( ; ; ) {
. . .
}
végtelen ciklus, amelyből valószínűleg más módon kell kiugrani (pl. return vagy break révén). A while és a for között lényegében ízlésünk szerint választhatunk. Például a
while ((c = getchar()) == ' ' || c == '\n' || c == '\t'); /*Átugorja a láthatatlan karaktereket*/
programrészben nincs inicializálás, sem újrainicializálás, így a while használata a lehető legtermészetesebbnek tűnik. A for nyilvánvalóan előnyösebb olyankor, amikor egyszerű inicializálás és újrainicializálás fordul elő, mivel a ciklust vezérlő utasítások egymás közelében, a ciklus tetején jelennek meg....”


Egyenértékű. Annyi a könnyebség, hogy ha kif2 elhagyása mindig igaz feltételt jelent. De ez nem jelenti azt, hogy a for -t ajálaná minden végtelen ciklushoz.
A hozzászólás módosítva: Jan 7, 2015
(#) killbill válasza Hp41C hozzászólására (») Jan 7, 2015 /
 
Idézet:
„Annyi a könnyebség, hogy ha kif2 elhagyása mindig igaz feltételt jelent.”
Hat pedig pont ez benne a lenyeg. Hogy magyarazzam? Persze, vegtelen ciklus az is, ha while-ba konstanst teszel, vagy, ha valtozot, de elfelejted inkrementalni (az altalad emlitett Murphy torveny ilyesmire utal), de az egy programozoi alapelv, hogyha valamit meg lehet egyszerubben, rovidebben is oldani, akkor azt ugy oldjuk meg. En pusztan errol beszelek. Itt sokan tanulnak, hat tanuljanak tisztesseges programozast. A K&R konyvben egyetlen while(1) nincs, szerintem. Igaz, a K&R konyv nem irja, hogy igy kell vegtelen ciklust csinalni, csak azt mondja, hogyha a for-bol kihagyod a kif2-t, akkor vegtelen ciklust kapsz.

Ket modszerrel tudsz ugy vegtelen ciklust csinalni, hogy ne legyen benne feltetelvizsgalat. Ha a for()-bol kihagyod a kif2-t, vagy ha goto-t hasznalsz. Az osszes tobbi megoldasban lesz egy feltetelvizsgalat, amit a C fordito vagy kioptimalizal vagy nem. Ezert hasznalatos a for(;; ) vegtelen ciklusnak, mert ott garantalt a leheto legoptimalisabb kod.
(#) csiberaptor hozzászólása Jan 7, 2015 /
 
Pár mikrovezérlővel dolgoztam már, de ilyennel még nem találkoztam.
PicKit2 és pic18f4520. Az mclr vddre húzva, vdd-gnd között 100nF kondi. ICSP, pickit2 szoftverét megnyitom, felismeri a picet.
Akármit próbálnék csinálni VDD voltage error hibaüzenetet dob.
Néztem az adatlapját de szerintem nem igényel másabb bánásmódot mint egy átlagos pic.
vdd -0.3tól 7.5-ig
vpp 0tól 13.25V-ig
(A korábban használt pic-ekkel továbbra is gond nélkül működik.)
Valami ötlet?
(#) vicsys válasza csiberaptor hozzászólására (») Jan 7, 2015 /
 
Mind a 2 pár tápod bekötötted? Figyelj, mert nem pont szembe vannak.
(#) csiberaptor válasza vicsys hozzászólására (») Jan 7, 2015 /
 
Igen, mindkettőt és jó helyre.
(#) vicsys válasza csiberaptor hozzászólására (») Jan 7, 2015 /
 
Használtan vagy újként vetted? Jártam már úgy használttal, hogy nem volt jó...
(#) csiberaptor hozzászólása Jan 7, 2015 /
 
Itt a hiba... Nekem ez miért nem jutott eszembe?
Elvileg új, csak mint kiderült ez az a bizonyos "Olcsó húsnak híg a leve" kategória.
A másik kettő működőképesnek tűnik eddig. Írom-olvasom.
Köszönöm szépen!
(#) usane válasza csiberaptor hozzászólására (») Jan 7, 2015 /
 
Valószínűleg rossz mint vicsys írta, ellenőrzésképp rámérhetsz a tápra egy multival.

Szerk: Látom közben ki is derült.
Idézet:
„Elvileg”
: ezt nem egészen értem
A hozzászólás módosítva: Jan 7, 2015
(#) csiberaptor válasza usane hozzászólására (») Jan 7, 2015 /
 
Újként árulták, meg annak is tűnik, de attól még nem veszem készpénznek.
(#) vicsys válasza csiberaptor hozzászólására (») Jan 7, 2015 /
 
Megjegyzem: Mikor jeleztem az eladónak, azonnal küldött egy másikat.
(#) usane válasza csiberaptor hozzászólására (») Jan 7, 2015 /
 
Ok, közben megnéztem, hogy a megbízható forrásnál ez nem épp a legolcsóbb PIC, így gondolom valahol olcsóbban adtak valamit ami vagy ez vagy nem, vagy új vagy nem
(#) csiberaptor válasza usane hozzászólására (») Jan 7, 2015 /
 
Ami azt illeti még így is nagyon jól jártam.
De azért írok az eladónak, hogy van kis probléma.
(#) Beles hozzászólása Jan 7, 2015 /
 
Sziasztok!
DMA vezérlővel szívok már egy napja dscpic33EP családon. SPI-hez kellene, de sehogy sem akar menni. Már odáig jutottam, hogy kipróbáltam UART-al is, és azon tökéletesen működik is. Viszont SPI-vel sehogy nem akar menni a komunikáció. Valami elkerülné a figyelmem? Valakinek van tapasztalata ezzel kapcsolatban?
(#) Beles válasza Beles hozzászólására (») Jan 7, 2015 /
 
Rájöttem mi a baj. Jó nagyot koppant. Nem kezeltem le az SPI-nél a vételt, ezért megállt az SPI Receive Buffer Overflow-al....
(#) fsub hozzászólása Jan 8, 2015 /
 
Sziasztok!
A segítségeteket szeretném kérni. Egy nyomógomb pergésmentesítését szeretném megvalósítani assembly nyelven, 16F628A-ra. Az elgondolásom az volna, hogy egy a PortB-re kötött nyomógomb lenyomásakor fellépő változás (interrupt-on-change) megszakítást idézne elő, és ezt kezelném le úgy, hogy megvizsgálnám lenyomás, vagy felengedés történt-e. Ezt követően, ha lenyomás történt, átbillentek egy kimenetet, majd letiltom a PORTB változás érzékelés megszakítást, és elindítok egy 20ms-ra beállított Timer0 időzítést (ez lenne a pergésmentesítés). Ha felengedés történt, csak az RB megszakítást tiltom, és a TImer0-t indítom a megszakításban. A Timer0 túlcsordulása ismét megszakítást eredményezne, ami után tiltom T0-át és újra engedélyezem az RB megszakítást.
De akárhogy próbálkozok nem akar működni a dolog, abban sem vagyok biztos, hogy helyes ez a fent ismertetett elképzelésem. A nyomógomb aktív alacsonyra van kötve az RB5-re, 10k-val Vdd-re felhúzva.
Szóval az lenne a kérdésem, mit nem csinálok jól?

debounce.asm
    
Következő: »»   616 / 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