Fórum témák
» Több friss téma |
18f4620... A D portját szereném digit bemenetnek használni. De ugyaníg jártam a 16f877A-nál is
324 Undeclared identifier 'ANSEL' in expression 324 Undeclared identifier 'ANSELH' in expression
void main()
{ TRISB=0b00001000; PORTB=0b00000001; TRISC=0; PORTC=0b00000000; TRISD=1; ANSEL =0; ANSELH =0; while(1) { Az ANSEL és ANSELH szavakat alá is húzza piros hullámos vonallal, és nem fordítja le, a fenti hibaüzenettel. A hozzászólás módosítva: Dec 3, 2016
Olvastad a kontroller adatlapját? ANSEL regiszter nincs benne.
A TRISB regisztert megtaláltad, a TRISA-t nem? Az 'A' portnak is megvannak a regiszterei. Ha analog bemenet kell, akkor az ADCON0 - ADCON2 regisztereket kell használni, konkrétan az ADCON1-ben lehet megadni, hogy melyik láb legyen analóg vagy digitális.
A hozzászólás módosítva: Dec 3, 2016
18F46K22
SPI órajelet használnám másra dolog SCKx pin...folyt nos valaki tanácsa bejött tényleg kiküldök byte ot elindul, de le is áll vagyis ha állandóan kiküldök akkor életben tartom az órajelet. Másképp nem lehet, hogy ez magától működjön ? Esetleg 1et kiküldök, de onnantól ne álljon le ? Ha nem be kell építenem a ciklusba több potya utasítás lassító tényező Melyik feltételt kell ennél kérdeznem, hogy szabad e SDOx buffer kiküldésre ? Már elmosódik minden a fáradtságtól. Kössz
Sziasztok!
Egy pic16f628a-val C-ben a timer1 modullal szeretnék egy órát csinálni. A pic közben más feladatot is ellátna. Kérdésem lenne, hogy hogy lehet a delay függvényt tmr1 (esetleg tmr0-val, de akkor a következő kérdésem erre is vonatkozik) regiszterek értékének változásával felírni (ne akassza meg az MCU-t arra az időre). Továbbá belső órajelet szeretnék használni, 4 Mhz-n a tmr1 15 környéki értékkel csordul túl, ami alapján megadtam neki az időalapegységet. Szeretném ezt a beosztást finomítani, tudom valahogy külön figyeltetni a TMR1H:TMR1L regiszterpárnak az értéknövekedését (óra pontosítására is jó lenne)? Ha sikerülne valahogy elérnem, hogy ne 16 bites túlcsordulásnál növeljen változó értéket, hanem mondjuk 12-13 bit környékén, az már megfelelő beosztás lenne. Ha valami kirívó marhaságot kérdeztem, akkor elnézést, kezdő vagyok még a témában. Válaszokat köszönöm. Jelenleg így néz ki: "/* int clock() { T1CON = 0b00000001; //set timer1 config bit: enable, internal clock, prescale: 1:1 while (1) //continous process { while (! TMR1IF); //TMR1 overflow TMR1IF = 0; Count ++; if (Count == 15) { Count = 0; sec++; } */" A hozzászólás módosítva: Dec 3, 2016
Szia!
Idézet: „Ha sikerülne valahogy elérnem, hogy ne 16 bites túlcsordulásnál növeljen változó értéket, hanem mondjuk 12-13 bit környékén, az már megfelelő beosztás lenne.” Azt nem tudod megoldani, mert a hardver úgy van kialakítva, hogy a 16 bites számláló túlcsordulásánál okozzon megszakítást, de senki nem mondta, hogy a számlálónak 0-ról kell indulnia ! Azaz pl. 10000-re állítva már csak 55536 impulzus kell a túlcsorduláshoz ( a kezdőértéket kell megfelelően megválasztani ! ) !
Köszönöm a gyors választ. Akkor TMR1H vagy TMR1L regiszterek kezdeti értékét kell megadnom a túlcsordulás után (gondolom elég az egyiknek túlcsordulnia mindkettő resetjéhez)?
Vagyis hasonló módon?: while (! TMR1IF); //TMR1 overflow { TMR1IF = 0; TMR1H = 0b0001000; Count ++; if (Count == 15) }
Nem igazán így kell gondolkoznod !
A TMR1H és TMR1L együtt egy 16 bites regisztert alkotnak ( így tudnak 65535-ig elszámolni!). Ki kell számolnod a léptetési időt ( TCY=4/fosc + az esetlegesen bekapcsolt osztók ), pl. 4 MHz-es órajelnél osztás nélkül 1 us. Szeretnél mondjuk 10ms-os túlcsordulásokat, ez azt jelenti, hogy 10 ms/ 1 us--> 10000-et kellene számolni a túlcsordulásig! Ennek érdekében 65536 - 10000= 55536-ról kell indítanod a számlálót, ami hexában ( számológéppel könnyű átváltani !) 0xD8F0, azaz ezt kell a timerbe kezdőértékként betenni ! Ezt úgy lehet, hogy először beteszel a TMR1H-ba 0xD8-at ( a felső byte-ot!), majd TMR1L-be 0xF0-t ( az alsó byte-ot!) ! Vigyázz, mert a berakási sorrend sem mindegy !
Remélem érthető voltam így hajnalban !? A hozzászólás módosítva: Dec 4, 2016
Már nem tudtam tovább szerkeszteni...!
Ezt még később pontosíthatod és kiegészítheted, mert ez így egy jó alap ! A hozzászólás módosítva: Dec 4, 2016
Szia
Én mindenképpen a Timer1-et használnám, mert az "igazi" 16 bites. Vagy tennék rá külső 32 kHz-es kavicsot (Kvarcot) és/vagy használnám az előosztót. Az egyetlen kritikus az, hogy ha a Timer 1 túlcsordul, akkor interruptot generál és ha az ezt lekezelő rutin sokáig reagál rá akkor az pontatlanságot okozhat. Idézet: „ha az ezt lekezelő rutin sokáig reagál rá akkor az pontatlanságot okozhat.” Milyen sokáig? 32KHz-s kvarccal, előosztás nélkül csaknem 2 másodperced van rá, hogy elvégezd a számításokat és töröld a flag bitet. Ennyi már csak elég!?
Beírod a keresőbe, hogy "mplabx" és az első helyen megtalálod. Nem hinném, hogy ez csak nálam lenne így.
Mint ahogy, már más is írta a PICkit 3 Stand Alone Programmer-t felejtsd el ehhez a PIC típushoz (Meg egyébként is. Én is csak vész esetére használom, régebbi típusokhoz). MPLAB X-ből sem a 3.10-es kell, mert az sem tudja. A legújabbat töltsd le!
Timer1-et szeretném, egyenlőre arra is van írva a kód, csak mivel elég sekélyesek a programozási ismereteim, ezért bizonyos problémákat elemi függvényekkel és értékadásokkal hidalok át.
Idézet: „ Már nem tudtam tovább szerkeszteni...! Ezt még később pontosíthatod és kiegészítheted, mert ez így egy jó alap ! ” Köszönöm szépen, így néz ki jelenleg a két kezdőérték kivételével a kódom, de mindjárt azt is javítom. . Lenne még egy-két kérdésem: -van 3-5V-os stab tápom itthon, de csak egy darab. Ha beszeretném építeni valahova a szerkezetemet, akkor egy stabkockás telefontöltő 3-3,5V-on, vagy egy RLC szűrős telefontöltő 5V-on elviszi a mikrovezérlőmet? -hogy tudom a delay fv.-t úgy megkerülni, hogy ne akassza meg az MCU-t arra az időre? Jelenleg egy programozható, több (>4) ágú öntöző rendszeren dolgozom, 16×2-es LCD hd44780-as driverrel. Amiket találtam LCD illesztő függvények, mind delay-t használnak. Ezért gondoltam, hogy finomítom TMR1 overflow változóját, így akár ms-es nagyságrendeket viszonylag kis szórással meg tudok adni az általam "count"-ként deklarált változó növekedésével (alap helyzetben ~4 ms-enként interruptol, ami 4 ms-es időzítésre nem feltétlen a legalkalmasabb, kis pechhel 1 ms-t sem ér el a 4 ms-nek várt érték). Erről az elképzelésről tud valaki véleményt mondani, esetleg egy jobb lehetőséget felvázolni? -mennyire mondható stabilnak a belső órajel? Annyit tudok róla, hogy nagyban függ a feszültségtől és a hőmérséklettől, valamint természetesen tűrése van. Ha kvázi stacionárius feltételeket tudok biztosítani neki, akkor alkalmas lehet pontos (max differencia: másodperc/nap) időzítésre, valamint konkrétan a 16f628a esetében a gyártó által megadott +-1%-os tűrés értékét lehet állandónak tekinteni? (szóval, ha egyik nap egy másodpercet késett a tűrés miatt (pl.: a kvarc -0,2%-os eltérése miatt), akkor következő nap nem fog 1 mp-t sietni(következő nap is -0,2%-os eltérése lesz)?) -karakterláncok megjelenítésére alkalmazzak char tömböt(n×m), vagy valahoyg be tudom ültetni a stringeket C-be? Válaszokat köszönöm előre is és utólag is, továbbra is tartom, hogyha nagyon nagy marhaságot kérdezek, vázolok fel, elnézést, lényegében első "komoly" programom, mind PIC-ek terén, mind általában és az elektronikai ismereteim is hagynak kivetni valót maguk után, de igyekszem. A hozzászólás módosítva: Dec 4, 2016
sziasztok))
Az órám nál lenn egy óra frissités(Timer0) (60sec) másik a beállítást nézi. Ez irányadó lehet???Bővebben: Link
Hali!
CCS C fordítóval hogyan lehet high-speed pwm-et beállítani?
-Tápfesz. A telefonos töltők némelyikének időnként nullára is leesik a kimeneti feszültsége. Jobb lenne az áramkör bemenetedre legalább egy diódát + kondenzátort odarakni (az értéke felhasználás függő).
-Delay. Használj aszinkron állapotgépeket a főciklusból. Akkor a delay-d modellezett lesz csak. Viszont akkor az egész alkalmazást aszinkron design szerint kell készítened, és az sokkal több türelem kérdése. Nem mindenkinek van türelme az aprólékos munkához. -Tűrés. A tűrés azt jelenti, hogy akár stabilan rajta maradhat az egyik korláton. Nincsen rá olyan szabály, hogy végül 0-ra ki kellene jönnie a végösszegnek. -C stringek: A C alapból is tömbökbe pakolja a karaktereket, azt nevezi stringnek. Külön absztrakt típus csak C++ környezetben van, C környezetben nincs.
Feljebb elmagyarázták de nem megy ez a Timer számolgatás.
Terv az 1 másodpercenként lefuttatja az interrupt . Hogyan kellene számolni egy pic16f628 nál 4Mhz külső kristállyal ??? Nagyon megköszönném ha valaki elmagyarázná szájbarágósan. A hozzászólás módosítva: Dec 5, 2016
Van egy adatlap itt: Bővebben: Link
A timer 1 modul a 7-es fejezet, a 46. oldalon kezdődik. Van egy ábra a 47. oldal alján. Ott forrásként megtalálod a belső oszcillátor 1/4-ed jelét (jelen esetedben 4 mhz / 4 = 1 mhz lesz a betápod), amit ki tudsz választani forrásként TMR1CS=1 esetén (regiszter leírás a 46. oldalon), és ott a prescaler :8 osztáshoz (125 khz lesz a betápod) T1CKPS1:T1CKPS0 töltésével (=11, regiszter leírás a 46. oldalon), ami után T1SYNC=1 (regiszter leírás a 46. oldalon) kiválasztja azt a jelet számolni, és használhatod sleep mode-ban is. Mindenre részletesen találsz todo-t az adatlap teljes elolvasásával. Legalább a szakmai angolnak mennie kell, anélkül moccanni sem tudsz a pic világban. A hozzászólás módosítva: Dec 5, 2016
Van erre program is, ha jól emlékszem "Timer Calculator" néven találsz.
Pld.: Bővebben: Link
Köszönöm
írok hogy mire jutottam Szerk: "TCY (μs)" ez mi??? és "TCY within 15.25 μs" A hozzászólás módosítva: Dec 6, 2016
Hú, ezt én se figyeltem...Meg voltam győződve arról, hogy az adott PIC ERRATA-jában leírják a vele kapcsolatos anomáliákat, de ez nem szerepel most sem benne ( konkrétan s PIC12F675-öt néztem !) !
Honnan kell tudnom, hogy milyen hibákat melyik doksiban írják le a "millió" közül , van erre valami "kigyűjtés" ( én azt hittem a saját errata az az ! ) ?!
Az errata szerint a TMR1H regiszter írásakor megtörténhet, hogy nem veszi figyelembe a TMR1L átfordulásából történő növelést. A TMR1L regiszter az órajel lefutó élére lép.
"TCY within 15.25 μs" - Hány egyszerű utasítás hajtható végre a 32.768kHz magas szintjének ideje alatt. Ha egy 16F628 4MHz órajellel jár, akkor a 32.768kHz T1 órajel magas szintjének ideje alatt 15.25 egyszerú utasítást tud végrehajtani. Ebbe beleszámít a kérés előtt megkezdett utasítás, a megszakítás rutinra való ugrás, a mentés ideje is. A legrosszabb helyzet, ha a megszakítás nincs átmenetileg tiltva valami más okból: -A kérés előtt megkezdett utasítás 2 (goto, call, decfsz, stb) -Asynchronous interrupt latency = 3-4 TCY -Mentés: minimum 4 utasítás. Eddig 10.... Ha más okból tiltva van a megszakítás: - Másik megszakítás kiszolgálása fut - Szamafor művelet vagy kritikus szakaszbeli utasítások futnak. A kiszolgálás(ok) utasításainak számát is bele kell számolni.... Ha még azt is figyelembe kell venni, hogy a timer1 előosztója törlődik, ha a TMR1H vagy TMR1L regisztert írjuk. A hozzászólás módosítva: Dec 6, 2016
Sajnos nem tudok "kigyűjtések" -ről. Illetve mindenki kigyűjtögeti, ha egyszer belefut...
mit értünk egyszerű utasításnak amit az interuptnak kell csálni 6db Shiftelés shiftregiszternek és fényerő beállítása.
Köszi!
Idézet: „Illetve mindenki kigyűjtögeti, ha egyszer belefut...” Ezt úgy érted, hogy találkozol egy hibával, ERRATA-ban nem látod, azt hiszed, hogy a programodban van a hiba, sok éjszakát beleölsz... mikor már nincs más ( vagy korábban !) kutakodsz a neten/microchipnél, hogy hátha valamilyen címen írtak erről "tanulmányt" ?!
Pontosan így értem...
Most például hetek óta nem tudom a PIC32MM0064GPL028 -et Serial Executin Mode -ba léptetni. Programozási módba sikeresen belép, ki tudom olvasni a DeviceId -t jól, még a következő sorozat is lefut talán, az MCHP Status regiszter DEVRST bitjét állítja.
Aztán jönnek a problémák: A PE loader letöltése látszólag sikeres, de amikor átadnám a PE kezdőcímét, a XferFastData hibát jelez. Apropó mi is a PE kezdőcíme: A PIC32MX és MZ -nél 0x900, a hozzájuk tartozó PE hex állományában is ez szerepel. A PIC32MM -lél 0x300 szerepel a hex állományban. Idézet a DS60001364C ből:
Idézet a gyorsan letagadott / eltörölt DS60001145P -ből:
CSak néhány eltérés van: Az 0x6950 opkód hiányzik az újabb dokumentumból. Milyen címre is kell ugrani, ha a bűvös "DEAD" megérkezik? DS60001145P szerint 0x900 -ra, a DS60001364C szerint 0x901 -re ? Az utasítások a PIC32 -n nem 32 bitre, a PIC32MM -en nem 16 bitre igazítottak? Az MpLabX IPE röhögve programozza.... Ugye milyen könnyű az élet... A hozzászólás módosítva: Dec 6, 2016
|
Bejelentkezés
Hirdetés |