Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: Nem, hanem a HIDBootLoader.exe-vel. A winbootldr.exe (amit terminálként is használunk) majd a te programod letöltéséhez kell. „majd a winbootldr.exe -vel rátöltöm az USB CDC hex-et.”
Sziasztok!
Assemblybe ADRESH-nak az értékét kiszeretnén iratni LCD-re. De csak olyan minta feladatokat találtam ahol ledeket kapcsolgatnak. Mi ennek a folyamata? Esetleg egy példát tudna valaki feltenni, hogy lássam hogy mi is történik . Köszi
Mégegyszer köszönöm a szupergyors választ
![]()
Hali
Nezz szet a konyvespolcon. Talalsz tobb csomag mintapeldat, es akad kozottuk LCD kezeles is.
Szia!
Kiolvasod a regisztert, az értékét átalakítod karakter kódokká, a karaktereket kiírod az LCD kijelzőre. A középső lépés a rázós: - Milyen számrendszerben szeretnéd látni: -- Hexadecimálisban: A 8 bitet két 4 bites részre bontod, a 4 bites számokat a "0" .. "9", "A" .. "F" karakterekké alakítod, előbb a magasabb helyiértékűt írod ki, aztán az alacsonyabbat. -- Decimálisban: A 8 bites bináris számot 3 helyiértékes BCD számmá alakítod, a három helyiértén levő 0 .. 9 számokat "0" .. "9" karakterekké alakítod, azokat írod ki a legnagasabb helyiértékűvel kezdve.
Pc táp bevan terhelve megy közben pc.
bor lvd kivan kapcsolva. mert ad mérésel van elintézve. kondit kipróbálom még, de szerintem nálad a pont ![]() hát erre már legközelebb gondolok ![]() "Nagyon fontos, hogy a jeladó és a PIC között a testen ne follyon áram, azaz a földhurok is okozhat resetet. " opto rajta van pic gnd na azt kell meg szüntetnem akkor. Remélem meg is oldódik a probléma. Köszönöm a segítséget !!! hétvégen tesztelem is.
Köszi egy ts 2596-al próbálom az low dropout.
Szia!
Találtam a dsPIC-hez bootloadert. Bővebben: Link Megpróbálom kibogarászni hogy működik. Hiába böngészem, nem tudok rájönni hogy indul el a bootprogram. Vettem egy dsPIC33FJ128GP804-et is, és ahhoz is megcsinálom a panelt. A nagy kérdés! Hol helyezkedik el a bootprogi, a memória elején vagy végén. Ha jól értettem, nem kell a linker scripten módosítani, tehát valószínűleg a végén. A többi egyenlőre még homályos, pl: hogy kell a programot beállítani a bootprogi alkalmazása esetén, megszakításvektorok, stb. Nagyon sokat keresgéltem a guglin, de a leírások általában vagy nagyon specifikusak, vagy nagyon érthetetlenek.
Tudom, hogy van dsPIC-hez bootloader (a Microchip fórumán is hirdetik), de az nem illeszkedik az általam használt, a Mississippi Egyetemről átvett Bully Bootloader programletöltő/terminál programjához (nem ért szót vele), ezért nem foglalkoztam vele.
Igen, van saját terminálja, de nem ez a lényeges számomra. Egyenlőre azt nem értem, hogy kell a programot módosítani, ha bootloadereddel akarom betölteni. Ha ez már tiszta, akkor a másik sem jelent akadályt. Odáig jutottam, hogy a példaprogramot tudom futtatni az MPLAB-ban, a nyomkövetés még csak alapjaiban megy. Viszont hogy kell módosítani a bootloaderes betöltéshez, hiszen gondolom változik a program indítási címe, a megszakítások címei, és még más is. Amit eddig olvastam róla, mind mást ír, mert specifikusak, és én még nem tudom kiböngészni az értelmét. Magát a példaprogramot simán be tudom égetni a PK2-vel, fut is, ezzel nincs gond. Viszont szeretném elkerülni az állandó előpakolászást, a kábeldzsungelt, egyebeket. Ezért lenne nagy segítség ha bootloaderrel tudnám használni a kütyüt. Alapból csak egy USB kábel van, aztán majd a fejlesztésnél a különböző panelek rákapcsolásánál jöhet a többi kábel, csak győzzem átlátni. Egyenlőre panel híján csak oszcilloszkóppal nézem a PIC lábait, nincs semmi rákötve, de a jelek nagyszerűen jönnek.
ITT már megírtam: azt a linker állományt kell használni, ami a letöltött code_examples.zip csomag lkr mappájában található az adott PIC-hez. A mintaprogramok zöme (amelyiknél a projektbe fel van véve a p24HJ128GP502_bootldr.gld állomány) eleve bootloaderhez való. Ha kiveszed a projektből ezt az állományt, akkor pedig nem bootloaderhez való. Nem bonyolult.
Úgy tudom, hogy a kód kezdőcímének eltolásán kívül semmi különleges dologra nincs szükség. Azt meg elvégzi a linker állomány. Ja, a kérdésedre a válasz: az általam használt bootloader tudomásom szerint 0x0400 - 0x0BFF között helyezkedik el.
Olvasgattam a PIC18F25K80 időzítőiről. Ennyire mélyen még nem ástam bele magam mint most... egészen elképesztő hogy milyen sok mindent meg lehet valósítani ezekkel az időzítőkkel! Microchip-éknél okos emberek ülnek a tervezőasztalnál az biztos...
A kérdésem az, hogy meg-e lehet oldani azt, hogy az egyik TMR modult (mondjuk TMR1) számlálóként használom, melynek órajele a PIC órajele, vagy esetleg annak leosztottja. Viszont kapuzni kellene az órajelet mielőtt az a számlálóba ér, ráadásul kétszer. Tehát gyakorlatilag nekem egy számláló kellene ami előtt egy három bemenetű ÉS kapu van. Az ÉS kapu egyik bemenete a PIC órajele (esetleg leosztva), a másik egy I/O láb ami külső jelet kap, a harmadik pedig egy belső jel, ami pont egy másodpercig engedi a kapuzást. Még egy dolog: az egy másodperc leteltekor nem csak a kapuzásnak kell megszűnnie, hanem megszakítást is kell generálni. Ez megoldható? Ha jól értelmezem a dolgokat az adatlapból, akkor például a TMR1 és TMR2-vel meg lehet oldani. Úgy gondoltam hogy a TMR2 adja a pontos 1 másodperces kapuzási jelet (azért, mert őneki a PR2 regiszter segítségével beállítható a "végkitérése" pont egy másodpercre). A TMR1 pedig számlálóként működne, mely külső órajelet kapna a T1CKI lábon. A két számláló közti (ÉS) kapcsolatot pedig a T1GSS bitek 01-be állításával hoznám létre. Ez nekem a dolog legködösebb része sajnos, de ha jól értem akkor ezzel a TMR1 kapuzását állítom be úgy, hogy addig engedélyezzen amíg a TMR2 tartalma egyenlő nem lesz a PR2 regiszterpár tartalmával. Márpedig ha abba én olyan értéket írok hogy pont 1 másodpercenként legyen egyenlő akkor elvileg megoldottam amit szeretnék. Jól gondolom? ![]()
Köszönöm neked is meg Vilmosd-nek is a segitséget.
A hármas kapuzást nem értem. Vagy belső órajelet számlálsz, vagy külső forrásból érkező impulzusokat (T1CKI). Nincs és. Vagy külső jellel kapuzol (T1G), vagy belső jellel (itt rúghat labdába a Timer2). Nincs és.
Timer2 8 bites, az elő-és utóosztó max. 16-szoros, tehát 64K órajel után túlcsordulás van. Milyen órajellel menne az MCU, hogy lesz ebből 1 másodperc?
Értem. Akkor szerintem külső ÉS kaput kell használnom ami nem nagy áldozat, viszont a PIC órajelét nem lehet kivezetni a tokból, legalábbis külső kvarc esetén nem. Akkor viszont egy külső kvarc órajelforrás kell.
![]()
Sziasztok! Ma az egyik ismerőssel vitatkoztunk és utána szeretnék járni a dolognak? Ha egy program részben egymás után sok NOP parancs van attól a megszakítás ugyanúgy működik?
Mi a búbánatért kellene kivezetni az órajelet? Mit akarsz vele csinálni?
Hát persze! A NOP is ugyanolyan utasítás, mint a többi, csak látható hatása nincs.
Hármas ÉS kaput!
![]() Szeretném megmérni hogy az autóban az injektor mennyi ideig van nyitva 1 másodperc alatt. Amíg nyitva van (nevezzük H szintnek), addig jó gyorsan pörög a számláló az órajelről. Ha zárva az injektor akkor megáll a számlálás. Ha megint kinyit akkor megint pörög a számláló stb. De mindezt csak 1 másodpercig csinálhatja, mert ha letelt az egy másodperc akkor álljon le az egész és generálódjon megszakítás hogy a mért értéket a számlálóból kiolvashassam. (Közben majd sebességet is mérek és kész is a fogyasztásmérő.)
Nem biztos, hogy érdemes ennyire elbonyolítani. Szerintem az is elfogadható pontosságú mérést ad, ha Timer3 periodikus megszakításainál szoftveresen inditod/állítod le a számlálást. Csak arra kell ügyelni, hogy az indítás és leállítás mindig óraütéskor történjen. A kapuzási lehetőséget pedig a T1G bemenet biztosítja.
Arra számítani kell, hogy a számlálód túlcsordulhat. Azt is számlálni kell...
Némi hardver kiegészítéssel pontos mérés is megoldható logikai IC használata nélkül is. Ezt csak gondolatébresztőnek szánom, szerintem is elegendő az a megoldás, amit icserny leírt.
Tehát az én verzióm: Másodlagos oszcillátorról (órakvarc) járatjuk pl. a TMR3-at, ami valamelyik CCP modul Compare módjának szolgál időalapul. Azért gondoltam másodlagos oszcillátorra, mert így a PIC akár max órajelen is járhat, a pontos 1 másodpercet könnyű lesz kihozni. A megfelelő CCPx láb egy tranzisztorra kapcsolódik, melyet ellenállással tápra húzunk. Ugyanide kapcsolódik egy másik tranzisztor kollektora is, mely tranzisztort az injektor jele hajt meg, így huzalozott ÉS kapcsolat alakítható ki. Ennek a kimenete megy a TMR1 kapuzó bemenetére. Így a CCPx kimenet segítségével engedélyezhető 1 másodpercig a kapuzóbemenet, ez idő alatt van lehetősége az injektornak az impulzusok adására. Remélem nagyjából érthető, hogy mit akarok kihozni ebből.
Az nem jó, ha megméred egyenként és összeadod, átlagolsz, átszámítod másodpercre, vagy amire akarod? CCPx modullal Capture módban Timer1-el vagy Timer3-al nem nagy ügy.
Sziasztok!
Potyo ötlete, amit itt is fel lehet használni: A CCP modul kimenete PWM üzemmódban nem megy magasra, ha a kitöltés 0, illetve nem megy alacsonyra, ha a kitöltés nagyobb a periódusnál. Ha a kitöltést 0 állítjuk és számláljuk a T2 túlcsordulásait, a megfelelő számú után 1 periódusra átállítjuk a kitöltést, a pic órajeléből is könnyen előállítható az 1s kapuidő. A T1 / T3 értékét a másik CCP modul minden le / felfutó élnél tárolhatja. Ekkor a PWM kimenetet a másik CCP bemenetére kell kötni, a T1G bemenetet az injector jelére. Ha biztos vagy benne, hogy a komparátor kimenete fix alacsony szintet ad, megpróbálhatod a T1 gate forrás állítását, de az eredmény a kiválasztás belső megvalósításától függhet - a multiplexer hazárdos...
Csak én érzem úgy, hogy a megoldások azért ilyen bonyolultak, mert az elvi megközelítés nem a PIC lehetőségeihez igazodnak, hanem inkább diszkrét TTL gondolkodáshoz?
Az 1 sec időt könnyen elő lehet állítani bármelyik Timer-el, (akár azzal a Timerrel is, ami a CCPx-hez van rendelve, miután nem kell pont 1 sec az átszámításhoz), az injectorok nyitási időtartamát Capture módban simán meg lehet mérni, elég nagy felbontásban. A mért értékeket össze lehet adni sorra, amíg az 1sec lejár, majd ki lehet értékelni, és hozzá lehet rendelni egy adott fizikai értékhez, mondjuk a fogyasztáshoz...
Sziasztok
Kérem segítségeteket, az internetről letöltöttem egy időzítőt, ami pic 12F675-tel működik. A leírás szerint 0-8 percig lehet állítani az időzítöt egy 5K poti segítségével. A resetet egy led villogva jelzi. A gondom az, hogy táp ráadás után (rellé még nem húzott meg, és ez így jó),resetelek és a rellé végrelen ideig húr meg. Miért, nem csinálja max 8 percig? A többi funkció jó, resetnél villog a led stb, csak az időt kéne állítanom. Segítsetek kérlek, mert nem igazán értek a programozáshoz. Melékelten küldöm az asm és a kapcsrajzot, ha valaki utána szeretné építeni. Köszönöm előre is a segítségeteket ;********************************************************************** ; * ; Filename: Pulser.asm * ; Date: 30.04.11 * ; File Version: * ; * ; Author: Káró György * ; * ;********************************************************************** ; * ; Files required: * ; 12F675i.lkr * ; P12F675.inc * ; * ;********************************************************************** ; * ; Notes: * ; A quick and dirty program. Reads pot connected to AN0. * ; A TMR1 interrupt occurs every 0.5 seconds. * ; When the number of TMR1 rollovers >= the A/D result, a * ; relay will be turned on for a 0.5 second pulse. * ; * ;********************************************************************** list p=12f675 ; list directive to define processor #include radix dec errorlevel -302 ; suppress message 302 from list file __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_CLKOUT ; pin definitions ; GP0 - Analog input from wiper of 5k pot. Sets delay time between 0.5 second relay pulses. ; GP1 - Not used. ; GP2 - Drives 4N32 optoisolator thru 200 ohm resistor. 4N32 then drives relay output. Delays between 0.5 second relay pulses are set by pot. ; GP3 - Reset button between ground and MCLR. MCLR tied high via 10k resister. ; GP4 - Fosc/4 clockout for debug purposes. ; GP5 - Drives an LED on a clock tick. Visual indication that program is working. ; #defines #define pot GPIO, GP0 #define relay GPIO, GP2 #define aliveLED GPIO, GP5 ; Shared Uninitialized Data Section INT_VAR UDATA_SHR 0x20 w_temp RES 1 ; variable used for context saving status_temp RES 1 ; variable used for context saving rollcntL RES 1 ; low byte of TMR1 rollovers rollcntH RES 1 ; high byte of TMR1 rollovers rollflag RES 1 ; bit 0 = TMR1 rollover flag for main loop to poll ;********************************************************************** RESET_VECTOR CODE 0x000 ; processor reset vector goto main ; go to beginning of program INT_VECTOR CODE 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ; check for TMR1 rollover banksel PIR1 btfss PIR1, TMR1IF ; TMR1 rollover? goto nextIRQ movlw 0xBD ; reload TMR1 banksel TMR1L movwf TMR1L movlw 0xB banksel TMR1H movwf TMR1H banksel GPIO bcf relay ; turn off relay banksel GPIO movlw b'00100000' ; toggle aliveLED for visual indication xorwf GPIO, f banksel rollflag bsf rollflag, 0 ; set roll-over flag for main loop to poll banksel PIR1 bcf PIR1, TMR1IF ; clear interrupt flag nextIRQ movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ; Main Code main call 0x3FF ; retrieve factory calibration value banksel OSCCAL movwf OSCCAL ; update register with factory cal value ; initialize variables banksel rollcntL clrf rollcntL banksel rollcntH clrf rollcntH banksel rollflag clrf rollflag ; set up direction of I/O pins banksel TRISIO movlw b'00000001' ; xx------ not implemented ; --0----- 0=output, GP5, Drives an LED on a clock tick. Visual indication that program is working. ; ---0---- 0=output, GP4, Fosc/4 clockout for debug purposes ; ----x--- not used, GP3, Dedicated to MCLR ; -----0-- 0=output, GP2, Optoisolator, relay driver ; ------0- 0=output, GP1, not used (output defective) ; -------1 1=input, GP0, analog input movwf TRISIO ; set up comparator banksel CMCON movlw b'00000111' ; x------- not implemented ; -0------ output bit ; --x----- not implemented ; ---0---- 0=non-inverted output ; ----0--- 0=Vin- to Cin- ; -----111 111=comparator off movwf CMCON ; set up A/D converter banksel ANSEL movlw b'00010001' ; x------- not implemented ; -001---- 001=Focs/8 Conversion Clock ; ----0--- 0=digital I/O, GP4, Fosc/4 clockout for debug purposes. ; -----0-- 0=digital I/O, GP2, Optoisolator, relay driver ; ------0- 0=digital I/O, GP1, not used ; -------1 1=analog I/O, GP0, analog input movwf ANSEL banksel ADCON0 movlw b'10000001' ; 1------- 1=right justified result ; -0------ 0=Vdd is voltage reference ; --xx---- not implemented ; ----00-- 00=select channel 0 (GP0) ; ------0- 0=A/D conversion not started ; -------1 1=A/D converter module is operating movwf ADCON0 ; initialize output pins init banksel GPIO movlw b'00000000' movwf GPIO ; initialize interrupts banksel INTCON movlw b'01000000' ; 0------- 0=interrupts disabled ; -1------ 1=enable peripheral interrupts ; --0----- 0=disable TMR0 overflow interrupt ; ---0---- 0=disable GP2/INT external interrupt ; ----0--- 0=disable GPIO port change interrupt ; -----0-- 0=no on TMR0 overflow ; ------0- 0=no GP2/INT external interrupt ; -------0 0=no GPIO port change movwf INTCON banksel PIE1 movlw b'00000001' ; 0------- 0=disable EE write complete interrupt ; -0------ 0=disable A/D converter interrupt ; --xx---- not implemented ; ----0--- 0=comparator interrupt disabled ; -----xx- not implemented ; -------1 1=enable TMR1 overflow interrupt movwf PIE1 banksel PIR1 movlw b'00000000' ; 0------- 0=no EE write complete ; -0------ 0=no A/D conversion complete ; --xx---- not implemented ; ----0--- 0=no comparator interrupt ; -----xx- not implemented ; -------0 0=no TMR1 overflow movwf PIR1 ; initialize TMR1 banksel T1CON movlw b'00110101' ; x------- not implemented ; -0------ 0=gate disabled ; --11---- 01=1:8 prescaler ; ----0--- 0=LP oscillator is off ; -----1-- 1=external clock input not synchronized ; ------0- 0=internal clock ; -------1 1=enable timer movwf T1CON ; preload for 500ms rollover @ 4 MHZ internal oscillator ; Fosc/4 = 1 MHZ = 1 uS per clock ; 500000 clocks per 500 ms ; with 1:8 prescaler: 65535 - (500000/8) = 3035 = 0xBDB initial value banksel TMR1L movlw 0xDB movwf TMR1L banksel TMR1H movlw 0xB movwf TMR1H banksel INTCON bsf INTCON, GIE ; enable interrupts ; Main Loop forever banksel ADCON0 bsf ADCON0, GO ; start A/D conversion btfsc ADCON0, NOT_DONE goto $-1 banksel rollflag btfsc rollflag, 0 ; TMR1 rollover? call compare goto forever ; Compare subroutine - Test rollover counter to see if it >= the A/D result. ; If it is we turn on the relay. compare banksel rollflag bcf rollflag, 0 ; reset ISR rollover flag ; increment number of rollovers banksel rollcntL incf rollcntL, f ; number of rollovers btfsc STATUS, Z ; more than 255 rollovers? incf rollcntH, f ; yes, increment high byte of rollover counter ; compare to see if rollover counter is >= A/D result (16 bit unsigned comparision) banksel ADRESH movfw ADRESH banksel rollcntH subwf rollcntH, w ; w = rollcntH - ADRESH btfss STATUS, C ; if rollcntH >= ADRESH, C=1 return btfss STATUS, Z ; if rollcntH = ADRESH, C=1 goto relay_on banksel ADRESL movfw ADRESL banksel rollcntL subwf rollcntL, w ; w = rollcntL - ADRESL btfss STATUS, C ; if rollcntL >= ADRESL, C=1 return ; rollover counter >= A/D result relay_on banksel rollcntL ; reset roll-over counters clrf rollcntL banksel rollcntH clrf rollcntH banksel GPIO ; turn on relay bsf relay return ; initialize eeprom locations EE CODE 0x2100 DE 0x00, 0x01, 0x02, 0x03 END
Kicsit utánanéztem,mi is ez. Nem tudom ki ez a Káró György, de nem volt szép tőle hogy beírta magát szerzőnek, mikor nem is ő írta a progit. Lásd: http://www.piclist.com/images/boards/pulsar/index.htm
Nem értem mire jó ez, láttam ilyet itt egyébként más, nagyrabecsült kollégától is, inkább nem írom le a nevét, nem akarom égetni. Meg elég régi a cikk már, remélem kinőtte eme szokását azóta. Visszatérve a kapcsra: ez elvileg azt kéne hogy csinálja, hogy beállított időközönként fél mp-re bekapcsolja a relét. Nem tudom, neked ez kell-e.
szia
Káró György én lennék, csak beleírtam, ennyi. Bocsánat mindenkitől. A rellét a reset gomb megnyomásával meghúzza, és a beállított idő után (max 8 perc) elenged, és mindaddig elengedve tartja, míg nem kap újabb resetet. Monostabil multivibrátor
Szia!
Nem egészen: A relét a beállított idő (0 .. 8.5 perc) lejártával egy kis időre (0.5 másodperc) kapcsolja be, aztán kezdi előlről... Ha nem ezt csinálja, akkor a relé tekercsének be- / kikapcsolása visszahat a kontroller működésére a nem kielégítő táp szűrés miatt. |
Bejelentkezés
Hirdetés |