Fórum témák
» Több friss téma |
Idézet: Azért adtam meg a linket a honlapomhoz, mert ott minden szükséges információt megtalálsz. Három jel egyidejű számlálása a legpontosabban úgy végezhető, ha teszel a PIC elé egy kapuzó áramkört, ami (egy kimenet billegtetésével) egyidejűleg tiltja vagy engedélyezi a bemeneteket.„Eredetileg én is timerekkel álltam neki, csak nem boldogulok vele.” ha néhány utasításciklusnyi eltérés nem zavar, akkor erre nincs szükség. Idézet: Nem. A felmerülő problémákat itt érdemes tisztázni, hogy más is okuljon belőle. „Privátban megkereshetlek esetleg?”
Rendben van, átolvasom az oldalad, de így első ránézésre ez ágyúval verébre. Nekem egy jóval egyszerűbb felépítésű MCU is bőven megtenné.
A privátra pedig azért gondoltam, mert már többször fel lett vetve a problémám, de megoldás még nem született rá, így gondoltam nem szemetelném a topicot tovább azzal, hogy újra és újra felteszem ugyan azt a kérdést. Köszönöm, hogy foglalkozol a problémámmal. Az eredeti problémám, amire még nem érkezett válasz az alábbi: PIC16F628A MCU-t használok és Hitech-C-vel kódolok c nyelven. A program:
Kapcsolás: Bővebben: Link Használt szenzor: Bővebben: Link Pickit2 Logic tool: http://www.hobbielektronika.hu/forum/topic_post_1402208.html A problémám az, hogy a pic az 555-ös négyszögjeleit megszámolja és ki is írja a kijelzőre, de a szenzor jelét már nem. Ha a szenzor felhúzó ellenállását a gyárilag megadott méretről lecsökkentem 51 Ohm-ra, akkor kezd el reagálni a csip a szenzor jelére: elkezdi számolni a jelét, de bizonytalanul és a kijelző is hullámzik a szenzor frekijére. Ha TMR0-t használok, akkor tökéletesen megszámolja a szenzor jelét és megjeleníti azt a kijelzőn. A csip nem hibás, a szenzor nem hibás.
Szia!
Ez pl. adódhat abból, hogy a TMR0 ST-es bemenet, ha jól láttam, míg az adott láb, amelyiken nézed, nem ( nem láttam, hogy melyik másik lábat használod egyébként, ha az is az RA4, akkor nem ez a gond !) !
Tudna valaki segiteni a max. baud rate kiszámitásában?
Adatlapoban nem találtam a max. értéket. Képlet: UART baud rate = UART module clock / (16 × (SBR[12:0] + BRFD)) SBR: UART Baud Rate Bits BRFD: Baud Rate Fractional Divisor A 13-bit modulus counter and a 5-bit fractional fine-adjust counter in the baud rate generator derive SBR + BRFD = 18 bit 2^18=262144 UART module clock lehet 120Mhz illetve 60Mhz. min. baudrate = 120 000 000 / (16*262144) = kb. 28 Baud max. baudrate = 120 000 000 / (16*1) = kb.7,5 Mega Baud Lehetséges ez? 7,5 Mega Baud nekem sokank tünik..
RA4(T0CKI) lábat használom a TMR0-hoz és az RB6(T1CKI) lábat a TMR1-hez.
Üdv!
Olyan rendszert kell építsek, ahol egy számítógép program feladatot ad az ic-nek, hogy az egyik lábán váltson állapotot, 1 tizedmásodperc múlva újra, 3 másodperc múlva újra, fél másodperc múlva újra, és így tovább, mindezt nagyjából 10 lábbal, egymástól függetlenül. Úgy kell elképzelni, mintha egy PWM lenne, ahol minden egyes magas és 0 között én szabom meg az eltelt időt. Ez idáig egyszerű feladat, abban kéne segíteni, hogy mindezt előre el kell tároltatni a PICkel és később ez alapján végzi el a feladatot. Ezek a feladatok akár 4-5 Mb-osak is lehetnek. Szóval amit tudni szeretnék: Milyen módon célszerű a feladatot továbbítani (USB, LAN, egyéb)? Milyen eszközön tároljak el ilyen mennyiségű adatot (EEPROM, SD kártya, stb)? Hogyan tároljam el, figyelem bevéve azt, hogy pic-et kíméljem az utólagos feldolgozástól, vagyis egyből végrehajtható legyen a beolvasott adat.
Köszönöm. Viszont nem találtam benne a megoldást(korábban is átolvastam már és most is megtettem, hátha csak átsiklottam felette). Ugyan az van leírva ebben is, mint az MCU doksijában. Csak itt van 1-2 asm példa(amivel sajna nem tudok mit kezdeni). Az zavar a legjobban, hogy az 555-ös jelére megfelelően működik, de a szenzor jelére nem. Szkóppal pedig ugyan úgy néz ki a jele(amennyire hihetek az ősrégi orosz szkópomnak).
A PWM periódusideje fix. Neked is fix ez az idő és mind a 10 kimeneten szinkronban van csak a kitöltésük változik egyedileg?
Ha minden idő más és változik a periódus is folyamatosan, akkor az nem PWM, megtévesztő a hivatkozásod a PWM-re. Ha fix a periódus, akkor periódusonként elég egy számot letárolni, ami arányos a kitöltéssel. Ha mégsem PWM a jeled, akkor minden időhöz egy olyan számot kell letárolni, ami kielégítő felbontást ad. Ha tized másodperc a legkisebb idő, akkor egy érték egy tizedet fog jelenteni. Két bájton 65535 tizedsec, azaz 109 perc időt tudsz eltárolni leghosszabbat. Ha elég 25 sec maximális idő, akkor egy bájtot elég letárolni ezen a felbontáson. Ha ez megvan, akkor kell egy timer megszakítás, ami 1tizedenként megszakít. Ekkor vizsgálod az adott lábakhoz tartozó számlálót, hogy egyenlő-e az adott lépéshez tartozó beállított idővel. Ha igen, akkor bekapcsolod a lábat, betöltöd az új időt, stb. Tényleg 5 millió ilyen lépés lesz egymás után? Ha igen, akkor SD kártya a megoldás, amit SPI protokollal lehet kezelni könnyen. A hozzászólás módosítva: Márc 13, 2013
A periódusidő nem fix, a jelszint váltások között eltelt időt kell átküldjem, eltároljam és feldolgozzam a pickel.
Köszönöm a segítséget, minden kérdésemre választ kaptam. 1 bájtot kell használjak, ahogy írod SD kártyán lesz tárolva. Köszönöm a segítséget!
Szia!
Ebben csak 6 osztás és egy idétlen függvényhívas van. Hiába adja vissza a C -beli osztás a maradékot is, a fordító még egyszer oszt és akkor veszi csak elő a maradékot. Ha majd ezt a rutint általánosítod 16, 32 bitre, akkor más számottevő lesz a futási idő. Nem lenne egyszerűbb 8 léptetéssel és max 8 összeadással megoldani??? A '0' .. '9' karakterek ASCII kódja, amit az LCD -nek kell küldeni: 0x30 + n (0 <= n <= 9)! Ez ugyan 32 bites, de le lehet csökkenteni 8 bitre. ;******************************************************************
A hozzászólás módosítva: Márc 13, 2013
Sziasztok! Olyan kérdésem lenne, hogy miért kapok figyelmeztetés a következőre:
Az üzenet: ...ini_16f628.c; 37. truncation of operand value (0x92) to 7 bits Azt értem, hogy csonkolja az értéket, de miért mikor egy 8bites regiszterbe szeretnék egy 8 bites értéket bepakolni. Ezt az üzit a fenti részen minden olyan sorra megkapom ahol regiszter szerepel, akkor is ha törölni akarom. A 0-ás bankban nem motyog nekem ilyeneket. A kód amúgy működik, viszont az ok érdekel. Vagy arra céloz, hogy a regiszter címéből szedett le egy bitet? A hozzászólás módosítva: Márc 13, 2013
Nem az van, hogy nem az értéket, hanem a regiszter címét csonkolja? Hiszen a 0x92 cím valójában a 0x12 offset címen érhető el a bankon belül.
Csak az lehet. Legalábbis működni működik Tulajdon képpen most próbálom közelebbről megismerni a PIC asm-et, eddig csak elég felületesen foglalkoztam vele, de illene már. Amúgy is már nagyon régen volt dolgom assemblyvel akkor is Z80, 8051 és társaival. Lehet nem a legjobb módszerrel, de egy c programom írom át.
Köszi szépen, bár még nem tartok ott, hogy optimalizáljam a kódot. Első körben be akarok indítani minden perifériát és csak ezután állok neki finomítani. Hely van még dögivel, és erőforrás is, így jelenleg nem indokolt.
Ha végre működésre tudnám fogni az RB6 lábon is a szenzort, akkor optimalizálnék.
Hát szerintem nincs amiért ne lehessen majdnem egyidőben. Megindítasz egy timert, és bekapcsolsz három IOC lábat. Minden IOC flagnél ellenőrzöd, melyik lábon jött élváltás, és mented a timer értékét a neki megfelelő változóba.
Arra figyelj, hogy a megszakításkezelés végén olvasd ki a PORTB regisztert, hogy a 'mismatch condition' törlődjön. Mondjuk pontatlanságok lehet lesznek, ahogy lekérdezed szép sorjában, hogy melyik lábon jött interrupt-on-change, de nem vészes szerintem, mert mindig ugyanannyi időbe kerül,s offsetként levonhatod külön-külön mindegyikből.
Az a baj, hogy ennek az eszköznek kritikus pontja lesz a pontosság. Két szenzor lesz ugyebár rákötve, amik minimálisan eltérő, közel azonos impulzust fognak generálni. Viszont azt a minimális eltérést szeretném majd mérni. Ha nem lenne olyan fontos a pontosság, akkor 1 timerrel mérném mind a két szenzor. Fél másodpercig az egyiket, fél másodpercig a másikat. és minden sokkal egyszerűbb lenne. Viszont kulcsszempont az egy időben való mérés ezért akarok két timert használni.
Sziasztok!
Segítsen valaki, pls! MPlab-ban, assemblyben programozok. Megírom a szoftvert egy .s file-ban, de sok a szubrutinom és hosszúak is, és szeparálni szeretném őket, h ne legyen a fő programfile olyan hosszú. Hogy lehet azt megcsinálni, hogy áttenni egy másik file-ba, és megadni a fő programfile-nak, hogy ott találja őket? Próbáltam egy másik .s-t csinálni, include-olni, de nem vezetett sikerre. Mi a megoldás? Köszi előre is!
Hat, en ugy tudom, hogy az assembly file kiterjesztese .asm
Az include file pedig .inc Es az elso filebe beirod a sor elejere, hogy include masikfile.inc
Köszi! Értem. És az inc file-nak vannak formai követelményei? vagy csak simán beteszem, amit kivettem az assembly file-ból, és kész?
Szia!
Milyen kontrollert programozol? 16 és 32 biteseken az assembly forrás állományának kiterjesztése .s .
Hello!
dspic-et. 1010-est. Ez az inc-es dolog nem müxik így hirtelen. Idézet: Nem ártott volna ezzel kezdeni...„dspic-et. 1010-est.” Nem csináltam még ilyet, de elvileg egy projektbe több .s állományt is felvehetsz (mint ahogyan .c-t is). Természetesen gondoskodni kell ról, hogy .global direktívákkal a belépési pontokhoz vagy változókhoz a hozzáférést biztosítsd a többi fordítási egység számára. A "főprogram" pedig az lesz, amelyikben ez van (pontosabban szólva itt fog elindulni a program)
Érdemes szétnézni a Microchip\MPLAB ASM30 Suite\Support\templates\assembly\ könyvtárban!
Igen, ezt írhattam volna. Az a baj, h a Microchip\... mappát már elég rendesen átböngésztem, de nem találtam meg a választ (vagy nem tudtam értelmezni) Az általad említettet is néztem, ott mindössze ennyi van: tmp6010.s, tmp6010_srt.s, tmp6014.s, tmp6014_srt.s, traps.s, readme.txt. Ezekből nem jöttem rá.
Nekem egyébként a főprogramom így kezdődik, és működik: " .equ __30F3011, 1 .include "p30f3011.inc" .global _wreg_init .global __reset .global __ADCInterrupt .global __T1Interrupt .global __T2Interrupt " Amúgy tudnál segíteni, hogy hol találok egy olyan pdf-et, amiben ezt a kérdéskört kifejtik? Mert elég sokat végigbogarásztam a MC weboldaláról (Getting Started, Programmers Manual, stb), de ezt nem találtam meg. Mint ahogy azt sem, h mire valók az "Object files, Linker script, Other files" a project struktúrában. Köszi!
Ja, és azt már próbáltam, hogy egyszerűen egy másik .s file-t csinálni, beletenni a szubrutinokat, és a Source Files-be betenni, de nem működött.
Kérek még segítséget! Idézet: Ez elég tág fogalom. „de nem működött.” Az elérhető dokumentációról a honlapomon is találsz egy linkgyűjteményt (a Kötelező olvasmányok c. részben). Idézet: Itt egy primitív példaprojekt, ezt próbáld ki!„már próbáltam, hogy egyszerűen egy másik .s file-t csinálni, beletenni a szubrutinokat” fibonacci_main.s a főprogram, ez hívja meg a fibo_sf függvényt fibonacci_sf.s ebben van a veremkeretet használó rekurzív függvény Az sf itt a Stack Frame (veremkeret) használatára utal.
Üdv! Amit írtam zavar problémával senki nem találkozott még (Link)? Újabb rejtvényem: van egy Pic16f88, amit ha felprogramozok tökéletesen működik, amíg le nem kapcsolom a tápról, utána már nem indul el többet csak ha megint felprogramozom, ha tápon hagyom felprogramozás után tökéletes, kiolvasásra tökéletes benne a program. Mi sérülhetett meg benne, valami ötlet? Köszönöm!
A hozzászólás módosítva: Márc 15, 2013
Hogy állítottad be a konfigurációs biteket?
Ha LVP nincs kikapcsolva, akkor a PGM lábat le kell húzni a programfutáshoz! Ha a BOR nincs engedélyezve, akkor a program esetleg kikapcsoláskor agyonvághatja magát. Ha a WDT nincs letiltva, akkor rendszeresen tamagocsizni kell vele, különben RESET-be viszi a vezérlőt. Ha nem Release módban fordítottad a programot, akkor is érhetnek meglepetések.
Nem ilyen probléma van, ugyanaz a program, egy másik Pic-kel működik, de mint írtam ezen is működik minden tökéletesen, amíg meg nem szakítom a tápellátást. Tehát valami a Pic-ben sérült gondolom, de mi lehet az?
|
Bejelentkezés
Hirdetés |