Fórum témák
» Több friss téma |
Fórum Idézet: „Kipróbálni sajnos most nem tudom, de szerintem...” Én kipróbáltam, és azt írtam le amit tapasztaltam. Ha arra a két lábra volt kötve a programozó, és a pic már átkapcsolta azokat oszcillátor módba sem a programozás, sem a programmemória törlés vagy ellenőrzés nem működött. Másik PGEC-PGED párokon továbbra is ment minden. A tesztprogramban a másodlagos oszcillátor timer1-et hajtotta, ami egy másodpercenként generált egy megszakítást. Ilyenkor a pic uarton kiküldött egy karaktert. Amikor lekötöttem a kvarcot, és a helyére kötöttem a programozót, akkor - ahogy a programozó próbálta programozni a mikrovezérlőt - több megszakítás is történt, de maga a programozási folyamat mindig hibára futott. Én úgy gondolom, hogy ilyenkor a oszcillátor áramkör megzavarja a kommunikációt a pic és a programozó között. Hiába kapcsol át a pic programozás módba, nem fognak szót érteni egymással ha az adatvezetékeket valami más is vezérli. Természetesen elfogadom, ha van erre más értelmes magyarázat.
Sziasztok!
PIC18f25K80-at programozok épp XC8-ban. A/D convertelnél hogyan tudom kikapcsolni a Special Event Trigger-elést? Csak úgy, hogy beállítom, hogy olyantól várja, aki tudom, hogy nem fog küldeni? Mert, adatlapban csak azt találtam, hogy hogyan lehet választani aközött, hogy CCP2-től, timer1-től, CTMU-tól vagy ECCP-től várja, de teljes figyelmen kívül hagyást nem.
Sziasztok!
Szeretném a segítségeteket kérni. Sajnos nem jövök rá, hogy miért nem lehet beállítani a PIC (24EP512GU810) az elsődleges oszcillátorról (8MHz) üzemeljen és a timer1 pedig a másodlagos oszcillátorról. (32.768KHz). „OSCCONbits.LPOSCEN = 1” utasítás nem kapcsolja be a másodlagos oszcillátort. A timer1 kizárólag a belső óráról hajlandó működni „T1CONbits.TCS = 0” ha átállítom „T1CONbits.TCS = 1;” akkor nem számol a timer1. Ami érthető mert nem is rezeg a SOSC.(megmértem). Sajnos nem tudom miért nem kacsol be a másodlagos oszcillátor az „OSCCONbits.LPOSCEN = 1” utasításra. ![]()
A hozzászólás módosítva: Máj 4, 2016
A
Bevallom nem tudom, hogy a megszakítás mikor léphet életbe, de szerintem bármelyik megkezdett gépi lépést követően. Ha beleszakít egy ilyen szekvenciába, majd a megszakításban ugyanezt lefuttatja, majd visszaadja a vezérlést a félbeszakított lépésre, akkor annak bármilyen következménye lehet. Nem túl boldog gondolat, de ha olyan változót kell módosítani fő szálakban, amit a megszakításban is módosítunk, és bitenként állítunk, akkor a parancs kiadása előtt le kell tiltani a hozzá tartozó megszakítás engedélyét. Jelen esetben elég lenne a timer1-ét. Kicsit meglepő, ha ez így lenne és abszolut nem mulatságos! ![]() Természetesen várom a cáfolatokat, illetve a jó megoldást, ahogy kéne csinálnom! Köszönöm! A hozzászólás módosítva: Aug 11, 2015
Sziasztok!
PIC32MX-re írok egy programot és valami olyan hibát(?) találtam, amit nem tudok megfejteni. A kód a következő: A TimingFlags1 típusának deklarációja:
Flagek példányosítása Ezt Globálisnak tettem!
A ciklus, amiben a gondok vannak:
timer1 megszakítás kezelése:
Tehát minden fél másodpercben be kellene állítódjon a TimingFlags1.ReceptUtemFlag. Ez nem mindig történik meg. Ha kiveszem a ciklusban jelzett négy sort, akkor igen. Ha a cReceptUtemFlag char típusú változót használom Flagnek, de a négy sort bennt hagyom, működik. Olyan, mint ha a fő ciklusban nagyon gyorsan módosított bitekre szabdalt TimingFlags1 változó megakadályozná a megszakításban a megfelelő TimingFlags1 bit beállását. A megszakítás megtörténik, detektáltam, az OraTesztCounter növekszik stb. csak a jelzőbit nem áll be mindig. Lehet, hogy a Sturtura kezelése nem egy programlépésben zajlik és nem tesz jót, ha a megszakítás beleszakít? Ha igen, lehet használni egyáltalán ezt a bitenkénti módot? A PIC18-aknál ilyet soha nem tapasztaltam... Nagy segítség lenne, ha valami ötlet felmerülne! Köszönöm!
timer1 sem kell. USART-ot beállítod, hogy alacsony prioritású megszakításokat okozzan (már ami kell, ha csak küldesz, akkor persze csak TX), de nem engedélyezed a TXxIE-t. Timer2-ben növelsz egy számlálót, amikor az elért 200-ra (=10ms/50us), akkor bebillented a TXxIE-t. Ezután amint kiért a Timer2 megszakításból, azonnal belép az alacsony prioritásúba, hogy kiszolgálja az USART TX-et, mert időköben ugye a transmit buffer üres már. Az usart megszakításban pedig amikor betetted az utolsó bájtot is a bufferbe, akkor törlöd a TXxIE bitet, ezzel letiltod az usart megszakítást egészen addig, amíg a Timer2-ben ismét 200-ra nem ér a számláló. Tehát valami ilyesmi:
A hozzászólás módosítva: Júl 21, 2015
Az OSCCON első két bitje az SCS <1:0>
Idézet: „1x = Internal oscillator block 01 = timer1 oscillator 00 = Clock determined by FOSC<2:0> in Configuration Word 1.” ezzel beállíthatod, hogy belső oszcillátorról vagy timer1-ről vagy a config1-el beállított órajelről megy, kódszinten amit te akarsz az valahogy így valósítható meg :
A hozzászólás módosítva: Júl 6, 2015
Lehet nem jó helyen teszem fel ezt a kérdést, ezért ne tépjétek majd le a fejem.
Maga a probléma is elég fura, számomra egyenlőre értelmezhetetlen, de lehet csak én nézek be valamit nagyon csúnyán. Van egy projektem amiben egy részfeladat egy motor fordulatszám mérése. A motoron egy tárcsa forog, ezen van egy jelölés amit egy résoptó érzékel stb.. CCP capture módját használom a méréshez. A kód a következő:
Tudom, lehetne egyszerűbben is megírni és a pollingolás nem túl elegáns. Amikor először próbáltam a programot teljesen hibás értékeket mért. USART modullal elküldtem PC-re az ebben a függvényben használt változók értékeit. Kiderült, hogy a mes_cnt1 és mes_cnt2 változókba néha negatív számok kerülnek, és ezek okoznak furcsa dolgokat a számolásban. A nagy kérdés az, hogy mégis egy unsigned int változóba hogyan kerülhet negatív érték, pláne úgy, hogy a CCPR1L és H értékeit rakom bele, amik pedig a timer1 értékét tárolják ami 0-tól 65535-ig számol. Próbálkoztam, olyannal is, hogy ha valamelyik változó értéke negatív vegye az abszolút értékét és USARTon küldjön egy karaktert. Ennek ellenére továbbra is jöttek negatív értékek és a feltétel teljsülését jelző karakter meg nem jött meg, tehát a program nem érzékelte ezeket az értékeket negatívnak. Azt nem hiszem, hogy usart küldés miatt válnának ezek a számok negatívvá, mert kiszámított fordulatszámot LCD-re is kirakom és ott is ugyan ez látszik. Én már nagyon abszurdnak érzem ezt a szituációt és nemlátom, hogy min csúszik félre a dolog.
Üdvözlök mindenkit.
Nem vagyok nagy fórumlakó, de végső elkeseredésemben hozzátok fordulok. Már a létező összes angol nyelvű tutorialt átnéztem... Lenne egy feladat amit meg kellene oldanom. Hőmérséklet adatokat kellene két PIC között küldözgetnem aszinkron soros porton keresztül. Fentről lefelé mennek a vezérlés utasítások, stb, lentről felfelé meg az aktuális környezeti értékek, amiket mérek. Kérdés tehát: Létezik olyan megoldás amivel megoldható az oda-vissza kommunikáció úgy hogy közben mind a két oldal futtatja a saját programját? Valaki tudna nekem tippet adni, hogy hogy érdemes kezelni egy ilyen kommunikációt. (lehetőleg megszakításban, de figyelnem kell arra, hogy a lenti egységben rengeteg periféria megszakítás lesz(CCP, timer1, AD, stb)) Köszönöm. Idézet: „timer1 idejét miért nem szimulátorral méred” Mert nem áll meg a megszakításba helyezett break pontnál. Nem értetted félre. Eddig nem néztem, hogy van-e stopwatch a PK2-nél, mert még nem volt ilyen, hogy nem működik a szimulátor, ezért lepődtem meg, hogy nincs a PK3-nál debugg módban. Eddig eszembe se jutott volna PKx debugg módban időket ellenőrizni, talán logikus is, hogy nem nagyon lehet USB-n keresztül ezt megtenni, belső perifériája pedig nincs a PIC-eknek erre. A JTAG az más téma, de 18F-ekben olyan nincs is... Szóval köszi! ![]() Itt egy kép arról, hogy a TMR0 számlál, a 3 nem. Valóságban működik és debugg módban meg is áll a break-nél... Idézet: Ezt nem értem, tudtommal soha nem is volt StopWatch, ha nem a szimulátorral dolgozol ( talán a RealIce-nál kezdődik az a kategória, ahol már tud időt is mérni debuggolás közben, ha jól emlékszem!) !?„PICKit3 használata esetében megáll a breakpontál, de nincs StopWatch a Debugger menü alatt.” timer1 idejét miért nem szimulátorral méred (MPLAB SIM)? egy kicsit "összevissza" van most nekem a fórum, remélem nem értek félre valamit !? A hozzászólás módosítva: Máj 24, 2014
Sziasztok!
MPLAB 8.92, TMR1 szimuláció nem működik. PICKit3 használata esetében megáll a breakpontál, de nincs StopWatch a Debugger menü alatt. Ötlet, hogyan lehetne a timer1 idejét mérni? (debuggra gondolok, nem külső eszközökre, mert az elég gáz lenne egy IDE használatához kötni...)
Halihó
Dolgozok egy motor fordulatszám mérő programon. 1000-3000 RPM-et kéne mérnem. Kicsit elakadtam a szoftverrel (18f874)
ez a program részlet végzi a mérést. utána még van egy kis számolgatás meg az eredmény rs232 porton küldése, de az most lényegtelen, mert már annál hamarabb vannak gondok. a problémám az, hogy az eredmeny1 és eredmeny2 értékei megegyeznek, de időben együtt változnak. lehet én vagyok már vak hozzá és valami tök hülye hiba van benne amit ti messziről kiszúrtok, de kérlek segítsetek megoldani a problémát. A hozzászólás módosítva: Márc 20, 2014
RTC ic, vagy kötsz a timer1 oszcillátorra órakvarcot, az tud futni sleepben is emlékeim szerint.
Fázishasításra PIC-el van valami bevált módszer? Ugye kell hozzá nullátmenet detektálás, majd meghatározott idő után egy triak vagy SSR irányába gyújtóimpulzus kiadása egy rövid időre. Én eddig ott tartok, hogy pl. INT0 vagy RBIF megszakítás bekövetkeztekor Timer indul, túlcsorduláskor egyesre húzom az egyik lábat, majd némi idő után vissza nullába. Ezt lehet pl. úgy, hogy pl. timer1-et indítom, CCPR1H:CCPR1L regiszterekbe beírom, hogy mennyi idő után kellene a lábat egyesre állítani, CCP1IF megszakításkor pedig visszaváltom a lábat nullába. Persze a gyújtás nyílván nem tud így pontosan nullátmenetkor indulni, de ha pl. 4us késés van, akkor még mindig csak 4V-nál tart a színusz, ha jól számolom, az meg bőven belefér. Vagy van erre van valami jobb/bevált megoldás?
A CCP modul Capture módjánál nem tiszta egy dolog nekem: amikor egyezés van a CCPR1 és a TMR1 között, akkor a CCP1 lábat csak az egyezés idejére húzza magasba a kontroller, vagy pedig onnan kezdve magasan marad? Ha mondjuk a timer1-et a chip órajelével hajtom előosztó nélkül, akkor csupán egy utasitásciklus idejére marad magasan a CCP1 láb?
Szia!
Az adott portot (PORTC<14>) a programban nem olvasom ki. Amit tudok, hogy ha debug módban megállítom a program futását, akkor soha sem sikerült úgy megállítanom, hogy a 14-es bitnél 1-est lássak a PORTC regiszterben. Ennek a portnak egyébként nincs AD funkciója, csak a következők: PGEC2/SOSCO/C3IN1-/T1CK/RPI62/RC14. Mivel az adott lábra (48-as TQFP64-es toknál) van kötve a külső 1MHz-es órajel, ezért próbálkoztam a timer1-el, a T1CK-n keresztül, nem működött, s kipróbáltam Timer4-el, úgy hogy az RPI62-re mappoltam a T4CK-t, s így sem ment. Viszont ha kis vezetékkel ezt az órajelet rákötöm a pin13-ra (AN3/C2IN1+/VPIO/RPI35/RB3), s a T4CK-t az RPI35-re mappolom, akkor számol a Timer4. Amúgy erről a kódszekvenciáról nem olvastam még. A következző utasítással mappoltam a T4CK-t az RPI35-re:
Viszont az RPI62-re történő mappolás már nem működik. Tegnap még azt próbáltam ki, hogy az 1-es ICSP port helyett használtam a 2-est, mivel a PortC14, egyik funkciója a PGEC2, s tudtam programozni a procit.
Szia!
Én dsPIC33EP256MU806-al küzdök jelenleg, s én használom a QEI modult, s nekem elsőre elindult, bár én csak egy rotary encodert kezelek vele, de nagyon jól működik, persze nem szimulátorban. Viszont lenne nekem is egy kérdésem. Nekem is van periféria hozzáférés problémám, a 48-as láb (TQFP64-es tok esetén) a következő funkciókkal van felvértezve: PGEC2/SOSCO/C3IN1-/T1CK/RPI62/RC14 Nekem ezek közül az RPI62 kellene, hogy a 4-es Timer külső órajellel léptessem (T4CK) A lábon meg is jelenik az órajel, de sem a timer1-et (T1CK-n keresztül) sem pedig a Timer4-et (T4CK-n keresztül) nem tudom léptetni, belsőről mind a kettő szépen működik. A programozás a PGEC1, PGED1-en keresztül megy. A proci belső FRC osciról megy, komparátort nem használok, s még sem tudom elérni a T1CK vagy az RPI62-es funkciókat. Nekem nagyon az a gyanúm, hogy a Secondary oscillator foglalja a lábat, holott az OSCCON regiszterben tiltom ezt az órajel forrást az LPOSCEN bit törlésével. Van esetleg valami tapasztalat ezzel kapcsolatban? Már egy csomószor elolvastam az idetartozó fejezetek az adatlapban, de nem találtam semmit, az ERRATA sem ír semmit. Köszönöm előre is!
Mégse jó csak azért fordította le mert a megszakított rész az END után volt.
;------------------------------------------------------------------------------------- Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 112 : Using default destination of 1 (file). Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 114 : Using default destination of 1 (file). Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 120 : Using default destination of 1 (file). Message[305] C:\USERS\ANDRAS\DOCUMENTS\ASM\REPKOND2\ADC.ASM 133 : Using default destination of 1 (file). Executing: "C:\Program Files\Microchip\MPASM Suite\mplink.exe" /p16F887 "adc.o" /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /z__MPLAB_DEBUGGER_PICKIT2=1 /z__ICD2RAM=1 /o"adc.asm.cof" /M"adc.asm.map" /W MPLINK 4.43, Linker Device Database Version 1.9 Copyright (c) 1998-2011 Microchip Technology Inc. Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000004, length=0x00000022 Errors : 1 Link step failed. ---------------------------------------------------------------------- Debug build of project `C:\Users\andras\Documents\ASM\repkond2\adc.asm.mcp' failed. Language tool versions: MPASMWIN.exe v5.46, mplink.exe v4.44, mplib.exe v4.44 Preprocessor symbol `__DEBUG' is defined. Target debug platform is `__MPLAB_DEBUGGER_PICKIT2=1'. Debug platform options are: `__ICD2RAM=1'. Sun Sep 01 10:16:43 2013 ---------------------------------------------------------------------- BUILD FAILED
Egy háttérkép 480x320-ra 480 * 320 *16 bit = 300kB. Ez kb félig van a 512kB program memória. 320x240-en viszont csak 150kB, az simán belefér. Tehát a képek simán a program memóriában vannak. SD kártyáról elég lassan lehet betölteni, főleg egy háttérképet, amit szinte mindig ki kell rajzolni, ha bármint frissíteni kell. De a fő probléma, nem is a képek tárolásával van, mivel látszik, hogy egy háttérkép és meg jó pár ikon elfér a program memóriában. A nagyobb gond a RAM. Ugyanis ha pl egy ikont odébb akarsz húzni kijelzőn az ujjaddal, akkor frissíteni kell az ikon régi helyét, hogy az ikon nélkül látszódjon a kép, és ki kell rajzolni az ikon új helyét, hogy ott látszódjon az ikon. Az eltüntetéshez a legegyszerűbb kirajzolni mindent újra, ugyanis ha az ikon rajt volt egy téglalapon és az is rajt volt egy másik téglalapon, akkor már jó ég sem tudja, hogy mi mit takar el. Ha viszont kirajzolsz mindent újra, akkor, villogni fog az egész és az elég gázul néz ki. Ezt meg lehetne oldani úgy, hogy mindent először a RAM-ba rajzolsz ki, hogy ne kijelzőn íródjanak felül a pixelek, viszont ahhoz 320x240-es kijelzőnél is 150kB RAM kellene, pedig 128kB van max a PIC32-ben. Na ilyenkor jönnek trükközések
![]() DMA-t nem használok. Mivel ahogy utána számoltam a RAM-ból DMA nélkül kirakni egy 480 x 320-as területet kb 10ms. Igazából nem számottevő. DMA-val lenne meg pl 5ms. Viszont jelenleg csak a timer1 et és Timer2-t használja program, így nem lenne túl nehéz áttérni másik kontrollerre. Ezért lesz jó az új fajta PIC32MZ amiben 512kB RAM van és 2MB flash. 512kB-ba már valahogy dinamikusan lehetne bufferelni is a képeket.
Sziasztok!
Lenne egy olyan jellegű kérdésem, hogy egy PIC16F877 mennyi ideig képes működni egy 1F-os goldcapról úgy hogy sleep állapotba teszem ahogy megszűnik a tápellátás, viszont a timer1-nek mennie kell. Méréseim alapján ha 20MHz-n járatom a PIC-et és egy órakvarc van rákötve még pluszban, akkor 4mA-t eszik meg. Van valaki aki már foglalkozott ezekkel a goldcapokkal hasonló helyzetben? Addig nem szeretném megvenni illetve elkészíteni az áramkört amíg nem vagyok benne biztos, hogy megfelel-e a számomra. A válaszokat előre is köszönöm.
Szia!
A programot csak felületesen néztem át és néhány olyan dolgot láttam, amit nem értek. Azt tudod-e, hogy a lebegőpontos számok használata megszakításban olyan, mint ha egy várakozási ciklust tettél volna bele? Rengeteg program lépés, mire a PIC végigrágja magát a sámításokon. De ez csak az egyik rész. Ha már CCP modult használsz capture módban, miért nem a timer1 CCP regiszterekbe áttöltött értékéből számolod ki a periódust, ez előző és a mostani érték különbségéből? Mi szükség a segédváltozókra? A Timer megszakításban legfeljebb a túlcsordulásokat számold, amivel a CCP megszakításban kalkulálsz, ha két impulzus között a timer1 túlcsordulna. De motor esetében erről szerintem nem lesz szó, csak amikor áll a motor.
Sziasztok!
Az alábbi kis programot írtam pic18f25k80-ra. Az volna a lényeg, hogy egy motort tartsak állandó fordulatszámon, akkor is, ha változik a terhelés. A bejövő jel egy HALL szenzortól jövő négyszög jel. T: a HALL szenzor jelének elérni kívánt periódus ideje T1 és T2 a mért periódus idő. Tudom, hogy a periódus idők számolása nem OK, de ezen kívül más gondom is van. Az input capture-ök nem ott vannak a hol lenniük kéne. Lásd a fotót a felső a szenzor jele az alsó pedig akkor vált ha esemény van (lásd a kódot, az osztás az oszcilloszkópon 0,5 ms, az input capture a felfutó élre érzékeny). Nem telhet el ennyi idő a felfutó él és az esemény közt, hisz a timer tulcsordulását is leellenőriztem és ott az eltérés csak 0,01 ms volt a számolt értékhez képest Az adatlapban egyáltalán nem találom, hogy mi lehet a gond, tudnátok segíteni? Valaki tudna benne segíteni, hogy hogyan számoljam ki helyesen a periódusidőt? íme a program kód (C18):
A hozzászólás módosítva: Feb 5, 2013
Köszönöm. Ami nem értek. A low interruptba mégis belép amit elvileg a timer1 túlcsordulás okozna. Ezek szerint a proteusban beállított órajel szerint működik a timer1 nem?
A program végrehajtási sebességet az alkatrész tulajsonságainál kell megadni, ahol a hex fájlt betöltöd, a proteus nem szimulálja az oszcillátor működését, hogy az működtesse a virtuális PIC-et. Hogy hogyan lehet proteusban timer1-et külső órajelről működtetni, azt meg nem tudom, talán ha számláló üzemmódba teszed és bevezetsz neki egy órajelet, amit valahol a szimulátor primitívek között található impulzusgenerátorral csinálsz, akkor működni fog.
Az external oscillator HS üzemmódban megy, a timer1 időzítő pedig ugyancsak külső kvarc alapján számol. De mégse így működik. Hanem a proteus szimulátor default 1 mhz-n működtet mindent. Ez a problémám, de én is proteus hibára gondolok. Ez esetben próbálkozom abban a topicban.
![]()
Számomra értelmetlennek tűnt a kérdés, mert jelenlegi ismereteim szerint az "external oszcillator", a "HS mód" meg a "timer1" az három különböző dolog.
Hello!
Olyan problémám volna, hogy egy pic18f6722es picel fűtést automatizálok. De szeretnék bele órát is amit majd DCF vevővel szinkronizálok. A lényeg hogy timer1 megszakítással járatnám az órát. A timer1 számolás külső órakvarcról megy. De a processzor órajel pedig vagy belső, vagy egy másik külső kvarcról, ami az OSC1 ill. OSC2 lábakra van kötve. (mellékeltem kapcsolási rajzot) Proteusban tesztelem, és az a jelenség az, hogy belép a megszakítást kiszolgáló függvénybe, le is fut, de kapok egy hibaüzenetet: "External oscillator mode 'HS' requies clock to be specified on schematic part. Defaulted to 1.00MHz." És 1Mhz-n fut a program. Pedig a timer1 számláló a külső oszcillátorra van állítva. Mellékelem a main.c-t és a fontosabb header-eket.
Szia!
A 16F505 -ben nincs A/D, a 16F506 -ban már lenne, de ezek a Baseline családhoz taroznak. Nincs megszakítási lehetőségük, timer1 időzítőjük, a vermük 2 szintű. Nem való nekik a C... Egyszerűbb megvenni a 16F676 -ot.
Egy kérdéssel fordulnék hozzátok!
Egy régebbi progimat egy új picre fordítom át, és egy dolog egyszerűen nem megy. Az új picben használni akarom a beépített oszcillátort, de valamiért így a timerek egyszerűen megbolondulnak, vagy csak én nézek el valamit?
Így a led durván másodpercenként 2 alkalommal villan fel, de miért? Elvileg 65,536 ms-nak kellene lennie nem pedig 500 ms-nak! Vagy én számolok rosszul valamit? A pic egyébként egy pic18f1320-as lenne. Előre is kösz az ötleteket. |
Bejelentkezés
Hirdetés |