Fórum témák
» Több friss téma |
Szia!
Timer0 megszakításra a PORTB 7..4 bitjein számol...
Neharagudj, hogy ilyen lassú vagyok, de kórházban fekszem és nem mindig jutok internethez. Szóval azt a "CALL GOMB"-ot nem nagyon értem. Miért kell egy subrutin a gombok figyeléséhez? Próbáltam egy másik progit irni az előzö feladathoz, megnéznéd, hogy jobban sikerült -e
Idézet: Nem kell, csak azért gondoltam így, hogy a fő ciklus átláthatóbb legyen, s azért is, mert a fő ciklust már korábban ismertettem, ezt a részt meg utólag részleteztem. „Miért kell egy subrutin a gombok figyeléséhez?” De egy szubrutin bármikor beemelhető a főprogramba,ha elhagyod a call/return utasításokat. Idézet: Nem tudom, hogy ennek mit kellett volna csinálni, de:„Próbáltam egy másik progit irni” 1. Az biztosan nem jó, hogy a GOMB címkére ugratsz vissza, s így kimarad a késleltetés. 2. Az sem jó, hogy beiktattál egy blokkoló várakozást, ami megakasztja a fő ciklus folyamatát. Ha ez a feladat, akkor valahogy így képzelem a programot (a kedvedért most GOMB szubrutin nélkül...). A programot nem próbáltam ki, elírás, hiba lehet benne! Hogy egyszerűbb legyen az élet a G_STATE változónak csak a 0. bitjét használom ellenőrzéskor. Az 1-be állítást pedig a COMF utasítással (komplementálás) oldottam meg.
Sziasztok!
Teljesen kezdőként a PIC programozást szeretném kipróbálni. A "DV164131 - PICkit 3 Debug Express"-t néztem ki, de egyvalamit nem értek: a leírás és képek alapján úgy tűnik, hogy a készlethez adott demó panelen a PIC18F45K20 fixen be van építve, azaz nem IC foglalatban van. Tudom, hogy kezdőként teljesen jó ezzel szórakozni, mégis megkérdezném: 1. Mire lenne szükségem, ha más típusú PIC-cel is szeretnék kísérletezni? (pl. PIC12F508) 2. Van olyan "programozó" panel is, amin IC foglalat van, azaz a felprogramozás után a PIC kivehető, és más áramkörbe áttehető? Ilyenekről van lista valahol? Elnézést, ha esetleg félreértettem valamit, még csak most ismerkedek a témával Köszönöm!
Ha van pákád, veszel pár alkatrészt, akár magad is összerakhatsz egyet pár perc alatt.
A 12F508 -hoz kell egy 8 lábú foglalat, csatlakozó (tüskesor) a PICkit-hez, pár szál drót, esetleg egy-két LED, ellenállás, nyomógomb, stb. Aztán ha rákapsz az ízére, már kevés lesz így összemadzagolva, kell valami masszívabb megoldás, panel. Teszel rá LCD-t, vagy bármi egyebet. Nézd meg például ezt: Bővebben: Link Az IC gyakori cseréjéhez jó ha van karos foglalatodBővebben: Link:
Például a DM164127 LowPinCount USB Kit 20 lábú foglalattal van szerelve. Gyárilag PIC18F14K50 van benne (ami USB illesztőt is tartalmaz). Ez, akárcsak a DM164120-1 Low Pin Count Demo Board lábkompatibilis a 8/14/20 lábú mikrovezérlőkkel (pl. 8 lábúIC12F675, 20 lábúIC16F690).
Idézet: Ha a céláramkörben ki vannak vezetve a programozáshoz szükséges lábak egy 6 lábú tüskesorra, akkor fölösleges az átrakás! (ICSP a kulcsszó)„felprogramozás után a PIC kivehető, és más áramkörbe áttehető?” Ha mégis kell a külön programozás, akkor ahhoz ilyet érdemes beszerezni.
Köszönöm a válaszokat mindkettőtöknek!
Mivel még csak most ismerkedek a témával ezért valszeg egy ilyet fogok beszerezni: PICkit 3 Debug Express
Olvasd el ezt is, lehet más lesz a véleményed.
Bővebben: Link
Hali!
Van egy szabályozható pwm programom, de nemtudom ugy beállítani, hogy a microszervómhoz megfelelően 1-és 2ms között lehessen állítani. Ehhez szeretnék segítséget kérni, ha valaki jártas már ebben. A programom: #include __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) cblock 0x20 Delay1 ; Assign an address to label Delay1 Delay2 Display ; define a variable to hold the diplay Display1 endc org 0 Start: bsf STATUS,RP0 ; select Register Page 1 movlw 0xFF movwf TRISA ; Make PortA all input clrf TRISC ; Make PortC all output movlw 0x10 ; A2D Clock Fosc/8 movwf ADCON1 bcf STATUS,RP0 ; back to Register Page 0 bcf STATUS,RP0 ; address Register Page 2 bsf STATUS,RP1 movlw 0xFF ; we want all Port A pins Analoga movwf ANSEL bcf STATUS,RP0 ; address Register Page 0 bcf STATUS,RP1 movlw 0x01 movwf ADCON0 ; configure A2D for Channel 0 (RA0), Left justified, and turn on the A2D module MainLoop: nop ; wait 5uS for A2D amp to settle and capacitor to charge. nop ; wait 1uS nop ; wait 1uS nop ; wait 1uS nop ; wait 1uS bsf ADCON0,GO ; start conversion btfss ADCON0,GO ; this bit will change to zero when the conversion is complete goto $-1 movf ADRESH,w ; Copy the display to the LEDs movwf Delay1 bsf PORTC,0 Kesl: incfsz Delay1,f goto $-1 bcf PORTC,0 Kesl2: decfsz Delay2,f goto $-1 goto MainLoop end[code=c]
Kösz az infót, akkor még átgondolom...
Sziasztok!
Lehet valakinek ez alapvető, de sajnos én nem találtam semmit róla, és nem vagyok még profi. A kérdésem az lenne, hogy kellene választanom a végződését. Nekem egy 16F876A kéne SOIC tokosban, ami 20 MHz-ig jó. 14.475 MHz-n akarom működtetni. Viszont nem jutok dűlőre, hogy mit jelentenek a pic neve végén a -E -I /SO /SS... PIC16F876A-E/SO SOIC PIC16F876A-I/SO SOIC PIC16F876AT-I/SO SOIC PIC16F876AT-I/SS SSOP PIC16F876T-20/SO SOIC PIC16F876T-20I/SO SOIC És amihez nincs irva, hogy -20, az is bírja? Köszi.
Aminél nincs -20, annál van egy A betű, az egy másik chip, másik adatlappal, más jellemzőkkel. Adatlapot tessék egyébként megnézni, abban benne van minden jelölés jelentése. Nekem most nincs kéznél adatlap, nem birom megnézni, de itt a fórumban is volt már erről néhányszor szó, keresgess.
Az -I és az -E az a hőmérsékleti tartományt jelöli
I: -40C-től +85C -ig E: -40C-től +125C-ig /SS = SSOP, /SO = SOIC ezek tokozások SSOP kisebb mint a SOIC (méghozzá ha jól tudom akkor a lábtávolság fele akkora) T betű azt jelenti hogy a csomagolás Tape and Reel, ha nincs T akkor TUBE a csomagolás. -20 az 20MHz-ig bírja -04 az meg 4MHz-ig bírja az A jelzésű az továbbfejlesztett/javított verzió (Ha tévedek javítsatok ki)
Szia!
Az A/D az ADRESH regiszterbe teszi a mért érték felső 8 bitjét. A kiolvasott értéket használja fel a program a következő részletben a pulzus hosszának beállítására:
Mivel a kontroller 4MHz órajelről jár (1 utasás idejére a kommnet 1 us -ot ad meg), a Kesl ciklusa 3 us alatt fut le. A mért érték 0..255 között lehet, a ciklus 256..1 -szer fut le (a skála kifordul), ami 513 ... 4 us hosszú pulzust eredményez.
Átnéztem amit írtál. Kezdem érteni ezt a gomb dolgot. Az a G_STATE konstans nem teljesen tiszta. Az elméletileg elhagyható lenne nem? Vagyis anélkül is működne a gombok figyelése? Mindenesetre a gombok vezérlésével kapcsolatban rengeteget tanultam, ezt köszönöm. Igaz az eredeti progi optokaput fog vezérelni, ha egyszer elkészül. Még annyi kérdésem lenne, hogy az eredetihttp://www.hobbielektronika.hu/forum/topic_hsz_683537.html?highlight=1#683537 progiban a port b bitjeit egyesével váltom. A gomb példaprogikba a bitek mozgatva vannak a portb-n, de én csak egyesével szeretném vezérelni a nem villogó ledeket. Ebben az esetben jó ha a BSF BCF utasításokat használom?
Idézet: Nem! Jól néznénk ki, ha mondjuk 1 másodpercig nyomod a gombot, amire 25 ms-onként ránézünk, s látva, hogy le vany nyomva, átváltjuk a LED állapotát... „Az a G_STATE konstans nem teljesen tiszta. Az elméletileg elhagyható lenne nem? Vagyis anélkül is működne a gombok figyelése?” A G_STATE állapotjelző használata biztosítja számunkra, hogy csak akkor vegyük figyelembe a gomb lenyomott állapotát, ha az előző alkalommal (tehát 25 ms-mal korábban) felengedett állapotban volt. Idézet: Nem szerencsés dolog a Read-Modify-Write probléma miattItt a probléma ismertetése (a PORTx regiszterek c. részt nézd meg) PIC18 esetében egy hardveres regiszterrel (LATA) oldották meg, PIC16 esetében szoftveresen kell alakítani valamit (pl. egy memóriarekeszben, vagy WREG-ben kell összeállítani a kimenet új tartalmát, és egyetlen jólirányzott MOVF utasítással kiírni). Én nem vagyok szakértő a témában, mert nem használok PIC16-ot... „egyesével szeretném vezérelni a nem villogó ledeket. Ebben az esetben jó ha a BSF BCF utasításokat használom?”
Köszönöm a válasz meg a rengeteg segítséget nagyon sokat tanultam belőle!
Szia!
Nem igazán értem amit a ciklusidőkről írtál nekem. Nem tudtam beállítani, hogy 1ms és 2ms között lehessen szabályozni a pwm-et. Már vagy egy hónapja próbálom beüzemelni azt a mikroszervót
Szia!
Nagyon közel jártál a megoldáshoz:
A pulzusok közötti időt szerintem még jelentősen növelni kell: Kesl2 ciklusba kell még utasításokat tenni...
Sziasztok!
A segítségeteket szeretném kérni. Épp egy 628A-val szeretnék A/D átalakítást végezni, de valamiért nem akar működni a program. A fordító nem jelez hibát, de a valóságban meg sem nyikkan az egész. RA0-as lábra kötöttem, egy 4,1 kOhm-os pot.métert, mivel az adatlap azt írja, hogy a terhelés ne legyen nagyobb 10k-nál. Ebben a pic-ben nincs A/D átalakító, csak 2 db komparátor és ehhez rendeltem hozzá a belső referencia feszültség generátort.A programról annyit, hogy, ha a valamelyik komparátor billen, akkor megszakítást okoz és a ref. fesz értékét kiíratom a B portra. Mivel egy megszakítás flag vonatkozik a 2 komparátorhoz, ezért a megszakításban vizsgálom, hogy melyik komparátor kimenete billent. A programot igyekeztem sűrűn kommentezni, hogy könnyebben érthető legyen. Lehet, hogy vannak benne nagy baromságok, amik nekem nem tűntek fel, mivel adatlapból csináltam az egészet. A banklapozást meg lehetett volna összeszedettebben is oldani, de így legalább az elvégezendő műveletek átláthatóbbak szerintem. Légyszi akinek van hangulata hozzá, az nézzen bele és mondja meg, hogy mit rontottam el. Előre is köszi a segítséget!
Szia!
- Első ránézésre a megszakítási rutinból hiányzik a W és a STATUS regiszter mentése, visszaállítása... - Amint írod, a VIZSGALAT futásakor a BANK1 aktív, de az ANDREG a BANK0-ban van definiálva:
- Az "ANDWF ANDREG,0" helyettesíthető az "ANDLW 0x0F" utasítással (Bank probléma mentes...)
Először is köszi, hogy segítettél!
Megcsináltam azokat a dolgokat amiket írtál. Sajnos így sem működik, ugyanúgy semmi sem jelenik meg a PORTB-n, de csatoltam a progit, hátha én csináltam valamit rosszul. A MAX és ANDREG-t kitöröltem és helyettük konstansokat használok. Az R1,R2 valtozót a BANK1-be definiáltam, mivel amikor meghívom a szubrutint abban a bank-ban vagyok. Beraktam a STATUS és a W mentését, bár szerintem a W mentése felesleges ebben az esetben,de lehet, hogy tévedek. A STATUS-t viszont tényleg szükséges. Ha lenne még kedved hozzá, akkor légyszi nézz rá még egyszer.
Hali
Nem volt idom vegignezni a proramot. Egy otlet : a valtozokat rakd a 0x70 cimtol, mert ez mind a negy bankban egyforman latszik.
Helyett :
Talan segit. Udv Vili Ps; Azert ez a modszer AD atalakitora egy kicsit nehezkes. Egy 'F819, v 'F690 hasonlo aru es van bennuk sok AD csatorna.
Megnéztem az oshon szimulátorában,
a RA0 és a RA4 portokat kapcsolgatja ha analóg értéket adok rá.
Ez így biztosan nem jó, mert a MOVFW makró nem a file regiszterbe ír, hanem W-be!!! Az adatlap ajánlása szerint egyébként így kell csinálni a mentést:
Természetesen W_SAVE a mindenhonnan elérhető címen legyen (pl. 0x70) Bővebben: lásd az adatlap Example 14-1 kódját!
A movfw-t elírtam, movwf akart lenni, de a többit, amit írtál nemsokára megnézem.
Köszönöm a segítséget neked is, meg vilmosd-nak is.
Tulajdonképpen a regiszterek visszaállítása az izgalmasabb, mert a STATUS regiszter helyreállítása után már nem szabad használni a MOVF utasítást (a MOVFW makrót sem)!
Interrupt végén:
Az utolsó két SWAPF helyettesíti az elvi hibás
utasításodat (az ugyanis elállítaná a Z jelzőbitet).
Köszönöm szépen a segítséget, így már működi! Szépen kijelzi a ledeken a bináris értéket.
Azt pedig, hogy a statust-t és a w-t el kell menteni egy életre megjegyeztem, meg azt is, hogy hogyan...
Örülök, hogy megoldódott a probléma! A SWAPF utasításánál pedig arra kell ügyelni, hogy PÁROSÁVAL szerepeljen, mert minden swapf felcseréli a félbájtok (nibbles) sorrendjét, így minden másodikra kerülnek vissza a helyükre.
|
Bejelentkezés
Hirdetés |