Fórum témák
» Több friss téma |
Idézet: „Nem tudom másnak is feltűnik-e, de az nSS vezérlésnek nem szabadna visszaváltania addig, amíg a Master ki nem adta az utolsó clock falling edge-et is.” A hiba a Microchip készülékében/mikrovezérlőjében van! Itt található az Errata, olvasd el! A 3., 4., és 19. sorszámú hibák kapcsolódnak az SPI modulhoz, ebből a 4. szerintem irreleváns. A 3. hiba szerint a TBF késve billen (egy)be, ezért mielőtt a megszűnését kezdenéd figyelni, meg kell várni a bebillenését. A 19. hiba szerint TBF túl korán billen vissza, ezért a visszabillenés után még egy órajelperiódust ki kell várni. Ez összecseng a tapasztalataiddal, s több bájt küldése esetén még tragikusabbak volnának a következmények... Alternatív megoldási javaslatok: Alternatively, do one of the following: a) Poll the RBF bit and wait for it to get set before writing to the SPIxBUF register. b) Poll the SPI interrupt flag and wait for it to get set before writing to the SPIxBUF register. c) Use an SPI Interrupt Service Routine. d) Use DMA. Tehát megvárhatod, amíg az SPI masternél a fogadás is befejeződik, vagy figyelheted az interrupt jelzőbitet, vagy használj programmegszakítást vagy DMA-t. Csak a TBF-ben ne bízz, mert az semmire sem jó!
Sziasztok!
Miért adnak meg -VREF lábat a referencia feszültség bemenetnél? Köszönöm. Üdv.
Ha tudnám akkor nem kérdezném. Van elkébzelésem, csak nem vagyok benne biztos. Azért van hogy negatív is lehet az a/d konverzió eredménye? pl. hőmérönél
Alsó és felső referencia, nem negatív referencia. A két szélsőérték között mér az AD átalakító.
Értem. Köszönöm a gyors segítséget.
Üdv.
Szia!
A referencia feszültség kb. 2.5 V (ld. adatlap) szintjéig marad a 10 bit felbontás, de az alatt a pontosság romlik. Sem a referencia, sem a bemeneti feszültség nem mehet a tápfeszültség fölé. A nagyobb feszültségek méréséhez pontos (10 bit ~ 0.1%) előosztó kell, a bemenet túlfeszültség védelme ajánlott. Az osztó ellenállásainak forrása lehet egy bontott (gazdaságos) multiméter... Szia Idézet: „Ha 2 ADC csatornát használok akkor csatornánként 50Ksample/s lesz?” Durva közelítésben igen, a valóságban egy kicsit kevesebb, mivel a csatornaváltások miatt valamivel több várakozás kell, mint két mintavétel között.
Hány voltig akarsz mérni? Kell a 10-es arány?
50V még nem a világ vége érintésvédelmi szempontból sem, de a törpefeszültség korlátja 24V, és azt már átlépted, ergo hálózati feszültség kategóriában vagy ígyis-úgyis. Akár kihasználod, akár nem.
Max arra ügyelhetnél, hogy a "bemenetek" vezeték távolsága ne 0.2mm legyen. Brumm pedig egészen addig nincs, amíg valami össze nem szedi. Ebből a szempontból a mérőzsinórjaidat hibáztasd inkább, nem a pic lesz a fő bűnös. Tápszűrésre sem kellene sajnálni sem a 10µF tantált, sem a 100nF-al párhuzamos 6.8nF-ot.
Sziasztok!
Egy példaprogrammal kapcsolatban lenne kérdésem: A 16F877A 4MHz-en megy. A TMR1H és L értékét hogyan lehet kiszámolni? Mondjuk 1 másodpercre?
A számláló bemenetére az Fosc/4-nek az 1/8-a jut, tehát a számláló
f = Fosc/4 * 1/8 = 4000000 Hz/4 * 0.125 = 125000 Hz frekvenciával számol. A példaprogramban szereplő 250ms = 0.25 s idő alatt tehát 125000 Hz * 0.25 s = 31250 periódust számlál le a számláló (a Hz az 1/s, így s-mal szorozva mértékegység nélküli mennyiséget kapunk) 1 másodperces időzítést csak úgy tudsz csinálni, ha szoftveresen kiegészíted a számlálót (számlálod a túlcsordulásokat), ugyanis a 15 bites számláló 65535 után (2^16-1) túlcsordul, és ismét nulla lesz. Neked meg a fentiek alapján 125 000 eseményt kellene leszámolni. Javaslat: hagyd a beállítást úgy, ahogy van, s akkor másodpercenként 4 db megszakítást kapsz. Növelj egy egybájtos változót minden Timer1 megszakításkor, s amikor elérte a 4-et, akkor nullázd, és hajtsd végre, amit a másodperc leteltével akartál!
Köszönöm az azonnali választ!
Sajnos egy 7000Ft-os könyvbe ez a levezetés nem fért bele... Másik kérdésem az lenne, hogy T1-et külső órajelről üzemeltetném /32KHz/ akkor az egy másodpercet hogy számolom ki? Bocs hogy ilyen alap dolgokkal fárasztalak, de egyszer már olvastam erről a fórumban, de most nem találom.
Uhh! Jó hülye vagyok.
Az lett volna amúgy a kérdésem, hogy: TMR1H miért 0x85 és TMR1L miért 0xEE? A válasz pedig: hogy a 16bit=2*8bit. Így már képben vagyok a számolást illetően! Viszont akkor, ha az előosztót csökkentem, akkor meg lehet csinálni az egy másodpercet is. Ugye?
Gondolom, a Timer1 32 kHz-es saját oszcillátoráról van szó. Ekkor a bemenő frekvencia ~32768 Hz. Ha 1 másodperces időzítés kell, akkor az 1:1-es arányt célszerű használni.
A mintaprogramodban tehát a Timer1 inicializálását másképp kell csinálni (külső oszcillátor, 1:1-es számlálás), a számláló regiszterbe pedig 65536 - 31250 helyett most 65536 - 32768-at kell írni (2^16 - 2^15), vagyis TMR1H = 0x80 és TMR1L = 0x00. Ajánlott olvasmányok: PIC - Miértek, hogyanok topikban "timer1" kulcsszó keresése PIC - Mid-Range MCU Family Reference Manual (12. fejezet: Timer1) Timer1 Errata (ez utóbbiról van szó az ajánlott PIC Miértek, Hogyanok topikban is) Idézet: „ha az előosztót csökkentem, akkor meg lehet csinálni az egy másodpercet is. Ugye?” Pont fordítva: az előosztást növelni kellene. De már nincs hova...
Köszi!
Olvasgatok még kicsit a témában. Egy utolsó kérdés. Ha lehet még. Olyat hogy lehet, hogy feltételtől függően a számláló megáll, aztán ugyanonnan folytatódik?
A TMRxON bitet kell törölni, akkor megáll. Ha megint 1 akkor onnan folytat.
Általában a legkisebb bit a TxCON regiszterben. x: Az adott számláló "sorszáma". ui: A számlálót és az időzítőt azért különböztessük meg egymástól. Akkor beszélünk számlálóról, ha egy külső esemény miatt nő a tartalma. Időzítő meg szabadon fut magától. Pongyola megfogalmazással.
Köszi neked is!
Most kísérletezgetek meg olvasgatok még kicsit, aztán tovább! Mégegyszer kösz mindenkinek!
Kéredzz bátran, még akkor is ha hülyeségnek érzed, nem egyszerű témába vágtad a fejszéd :yes:
Kérdés gyakorlott kóderekhez:
Vegyes asm & C programban közös változókat (struktúra tömböket) kellene kezelni. A vonatkozó atomic folyamatokat megszervezem, meg a volatile-re is figyelek majd C-ben, de még mindig probléma a változók pontos helyének megállapítása. A tapasztalat arra kellene, hogy eldönthessem, hogyan fog végül pofásabban kinézni a program mindkét oldalon. Callback-eket gyártsak C-ben, amiket visszahívok asm-ből és úgy kérdezzem le a változók címeit? Init() folyamat gyanánt előre adjam át C-ből asm-nek a változók címeit, és tegyek minden pointert asm oldalon változóba? Alapból asm-ben hozzam létre a változókat, és C-ben packed struktúra-ként érjem el pointereken keresztül - elég rendesen kezeli a fordító a packed-et egy ilyen manőverhez ? Ha valakinek akadnak tapasztalatai, szívesen venném. Ha nem, feldobok egy dobókockát
Hello mindenki!
Segítséget szeretnék kérni a következő kérdésben. Van egy 0-5V négyszögjelem (szkóppal megnéztem) egy valószínűleg hall jeladós sebesség jeladóból. Szeretném a piccel mérni egy impulzus hosszát. De. Nem sikerül illesztenem a jelet mert mikor a picre engedem, a kilométeróra megvakul, mintha megenné a jelet a pic, nem megy tovább. Próbáltam növelni az impedanciát 1Mós ellenállással, próbltam schmittet, tranyóval de sehogy nem jön össze. Ha meg épp jó lenne, akkor sem illenek a jelszintek a pichez szükséges magas = 0,8 Vdd, alacsony = 0,2 Vdd szintekhez. Van valakinek valami ötlete?! Annyira megköszönném...
Üdv Mindenkinek.
Kezdőként a következő a kérdésem: Itt egy program részlet, melyre a MPLAB az alábbi üzenetet adja minden sorra. (16F876A) ORG H'1B00' ; START ADR OF CHAR.SET 256 BYTES DE 0,0,0,0,0 ; ASCII DEC 00 . . . DE 0,0,0,0,0 ; ACSII DEC 31 DE 0,0,0,0,0 ;SPC ASCII DEC 32 DE 0,0,95,0,0 ;! DE 0,7,0,7,0 ;" DE 20,127,20,127,20 ;# DE 36,42,127,42,18 ;$ DE 35,19,8,100,98 ;% DE 54,73,85,34,80 ;& DE 0,0,3,0,0 ;' DE 0,28,34,65,0 ;( DE 0,65,34,28,0 DE 34,20,127,20,34 ;* DE 8,8,62,8,8 ;+ DE 0,80,48,0,0 ;, DE 8,8,8,8,8 ;- DE 0,96,96,0,0 ;. DE 32,16,8,4,2 ;/ DE 62,81,73,69,62 ;0 DE 68,66,127,64,64 ;1 DE 66,97,81,73,70 ;2 DE 34,65,73,73,54 ;3 Argument out of range. Least significant bits used. Mi a hiba, és mit tudok tenni? Köszönettel
A DE az Data Eeprom, vagyis eeprom adatok elhelyezésére szolgál. Ha programmemóriaterületre akarod az adatokat elhelyezni, akkor DT kell szerintem. Ha pedig eeprom területre, akkor ORG 0x2100 után rakd, ne 0x1B00 után.
Helló Potyo.
Köszönöm a gyors válaszodat. Nem tudom, hogy mit "akarok". Ez egy kész program. Mellékelem az asm-t. Megköszönném ha megnéznéd, mert a hardver már készen van. Köszönettel
Talán dobhatnál egy kapcs rajzot mit és hogyan kötnél, mert gyanús, hogy valamit elkötöttél.
Jelet be egy soros ellenálláson keresztül tranzisztor bázisára, collectorra munkaellenállást küldeni a pic tápfeszre, és egy ellenállást kötni a pic bemenetre is. A legegyszerűbb szint illesztés külső áramkör és pic között, és még butaság biztos is. Épp csak invertál, de azt programból megoldod. Simán működnie kell. Ha nem működik: -A/D-t kapcsold ki a picen program starton, mert ha analógon hagyod, nem tudsz digitális bemenetet mérni. -Ha van JTAG a picen, configban kapcsold ki, mert elszipkázza a bemeneti funkciót. -Biztosan kap órajelet az a pic? Config bitekre odafigyelni. -Watchdog kikapcs. -Ha sikerült éppen az OSCIO2-es lábat kiválasztani a funkcióra, configban figyelj rá, hogy az is digit io-ra legyen kapcsolva. Ha ezek után sem működik, kapcsrajz mellé egy programot is dobj.
Sziasztok!
Ismét lenne egy kérdésem: Timer1 et 32KHz-es órakvarcról működtetem 22pF-os kondikkal, mert nincs más itthon. Ez mennyiben befolyásolja a működést, mert nekem úgy tűnik, egy kicsit siet...
Minden frankón van kötve, azzal nincs gond. Most tettem egy BC337et kollektor 1kóval tápra, bázisra 61Kval hall jele és emitter a tápra. Kollektor a picbe.
Holnap kipróbálom. Két jel közti idő mérése CCPvel, jel az RC3ra, CCPR1 két mérés közötti különbségéből számolom az időt. PIC18f442@20hmz. Mostmár gondot csak a tranyó fog okozni, mert egy bizonyos freki felett nem fog kapcsolni... |
Bejelentkezés
Hirdetés |