Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
> egrosszabb esetben a 0.211 helyett 0.218-at ír ki.
Elso gondolat ezzel kapcsolatban: - Ha a 0.211 valojaban 0.2110000 volt, a 0.218 pedig 0.2189999 akkor az kb 8ms... Masodik gondolat: - Windows alatt egy bonyolul uzenet kuldesi mechanizmus van, egy bonyas preemptiv multitaszkos kernelen futtatva az egeszet, es mindezek tetejen egy meg ennel is bonyolultabb Java futtato kornyezet (vagy flash meg sem neztem miben van megirva), szoval mire mindezen vegig megy egyszer es az a kis alkalmazas eszleli a gombnyomast, hol 0.211-et hol pedig 0.218-at mer 0.200 -ra - ha erted mire gondolok... PIC-nel ilyen bonyas dolog nincs ami ilyen mertekben befolyasolhatna a merest, es valoban a 10ms, azaz a szazadmasodperces meres ide tokeletesnek tunik.
Nem az a kérdés, hogy mit kéne beállítani, hanem az, hogy mit lehet! Persze lehet külső oszcit tenni a Timer1-re, meg lehet 1MHz-es kristályt is használni(meglepődnétek milyen drága!), de nincs sok értelme!
Tehát a legkisebb "olcsó" freki a 4MHz, és ebből 125KHz-et lehet leosztani. Ezután még bejöhet a Timer1 megszakításának számolgatása is, ha nem elég a fél másodperc.
Természetesen elméleti síkon.
Amit te mondasz az a valóságban is megállja meg a helyét, és kivitelezhető, és megfelelő is.
Értem, főleg a második gondolatnál az akár már 20%-os tévedés is lehet.
Szerncsére nem Win-ben kell megoldani a gondot.
Valóban, az 1MHz mindig is drága volt. Viszont vannak szép "kerek" értékű kvarcok, fillérekért: pl. 3.2768MHz, 4.096Mhz. Ezekkel elég jól lehet a kettőhatványos osztású számlálóláncok segítségével előállítani 100 vagy 1000Hz-es interruptot, amit egy PIC-kel gyerekjáték lekezelni és szoftveres század- vagy ezredmásodperc-számlálót léptetni.
Én a PIC órajelének választanám ezt a frekit, és órajelről járó timer0-t, valamint timer0-hoz rendelt prescalert használnék. Az ezred- vagy századmásodperces felbontású számlálónál nem kell bonyolult számításokkal kiszámolni utólag a valóságos időt. Sőt, ha a számlálólánc léptetését eleve BCD-ben csináljuk, akkor egyszerűen csak a helyiértékeket kell megfelelő helyen kiírni és készen is vagyunk.
Nekem lehet 40Mhz-en fog futni.
Nem ehhez kell, hanem a többi részéhez. Most még elég a 4
Milyen PIC is ez? Tudod benne valtoztatni az orajelet? Neha mikor nagy szamitas kell felcsavarhatod az orat "tovig" es mikor nem kell akkor pedig lelassitod - ezzel felvett aramot is sporolod, es esetleg ehhez a mereshez hasznalt kulso alkatreszek szamat is csokkentheted.
Amugy pedig vagy a kulso ora kvartz ami mar tobbszor elhangzott, vagy kenytelen leszel masik timert hasznalni aminel nagyobb osztast allithatsz be es egy interrupton logo tulcsordulas szamlalot bevezetni emelle. Az a bizonyos 125KHz aka ~0.5s az 4MHz orara volt kiszamolva...
Tudom.
Most tanulmányozom, mit, hogyan kell beállítani. Felfutóél, rb0-ra a gomb, stb... Osztót is kiszámolgatom, melyik jó. Ha túlcsorul egy*, megjegyzem, ha meg több, mint egy ciklusnyit ment timer1, akkor kiírja, hogy err, vagy 0, esetleg "Lassú vagy" )). És mindezt mék mikroBasicben is meg kell keresgélnem, hogyan kell. Persze ott is lehet ASM, és lehet az a rész az is lesz. PIC-et most nem tom. 18Fxxxx. De nem tom. 3 timer van benne. Szimulátoron is, meg mikrobasicben is be van állítva. Tesztpanelem meg a PICKit 2 van.
A fogyija minden(még). Egy sleep mód max kell, de más nem.
minden=mindegy
Nos, csak ugy a kivancsisag es a tortenet kereksege erdekeben a muegeremet beallitottam, hogy amint jon egy ACK hogy USB host vette a gomb allapotat mar kuldom is a kovetkezo csomagot... Egyik csomag gomb-lanyomas masik gomb-felengedes - mindez egy 4450-essel, ami 48MHz-en ketyeg a demo boardomban - gondoltam ez is erdekes lehet ahhoz, hogy mennyire gyorsan jut el a kuldesig attol a ponttol, hogy az USB dobja az ACK-t. Ja es assembly az egesz, azt hiszem eleg jol megirva sebesseg szempontjabol, szoval tenyleg nincs felesleges huzavona.
Ha nezitek az eredmeny tablat, vannak azert 2-3ms meresek is... nem tudom hova rakni most hirtelenjeben, hacsak nem egy veletlen egybeeses tortenik olyankor, nevezetesen, hogy eger gombja nyomodik, de meg mindig "Varj" van... es epp ugy jon ki, hogy mire az a gombnyomosdi uzenet eljut a kerneltol a web alkalmazas tudataig addigra epp valt...
Látom nem hagy nyugodni. Jópofa.
Ha 8ms megy a vezérlő akkor a kernel+egyéb sebessége 2-3 ms lehet ebből ítélve. így jön ki 8ms helyett a 11ms, illetve 0 helyett a 3. Nem?
Meg driver, windows, java, stb.
De érdekes teszt volt. Na, mint kezdő, elkezdtem tanulmányozni jobban a dolgot Itt ez akód: sub procedure interrupt cnt = cnt + 1 ' increment value of cnt on every interrupt TMR0L = 96 INTCON = $20 ' set T0IE, claer T0IF end sub main: T0CON = $C4 ' assign prescaler to TMR0 TRISB = 0 ' designate PORTB as output PORTB = $FF ' initialize PORTB cnt = 0 ' initialize cnt TMR0L = 96 INTCON = $A0 ' enable TMRO interrupt do if cnt = 400 then ' if cnt is 400, then toggle PORTB leds and reset cnt PORTB = not(PORTB) cnt = 0 end if loop until 0 = 1 end. Erre azt írja, hogy minden másodpercben váltja a ledet. 8Mhz osc van megadva. De számolgattam. T0CON nekem 0:32-re jött ki. Namost 8mhz/4/32 az 62500 HZ azaz 16us TMR0L-el van gondom. Ott a 96 azt jelenti, hogy96-ig számol? Mert ugye 8 bitesre van állítva, azt megnéztem. Ha igen, akkor 1 túlcsordulásig 1,536ms telik el. A countert meg 400-ig nézi, de az 0,6144ms, h jólszámolom. Vagy elrontottam vmit? Köszi!
Számoljuk bele a gép oldalt is. Hány Mhz a procija, mik futnak? ))
Mielőtt jönne watt:
1:32
Nem, alulrol felfele szamol, es mikor atcsurran jon az interrupt. Tehat 255-96=159 *16us = 2,544ms * 400 = 1,017600s
Szoval jonak tunik nekem...
Megvan! a 96 hexában van(de akkor az elé nem kellene $?).
De akkor 0.96sec jön ki- 0.04 elmegy a nullázgatásokra?
Opsz. Ezt nem tudtam. Köszi!
De azért kitaláltam vmi a másikra is, hogy jó legyen
Ez is lehetseges magyarazat lenne, csak van meg egy kerdes akkor: A gombot fel is kell engedni hogy uj gombnyomasnak vegye, ezert egyik csomag felengedes, masik lenyomas... tehat ha 8ms-enkent kuldene csomagot, akkor 16ms-re kellene beallnia...
A lenyeg latszik godolkodsz, ha melle bujnad a doksikat is akkor egybol tudnad ezekre a helyes valaszt -- Ezt most tenyleg joindulatbol irtam, nem bantaskepp.
Uff, már nem jut eszembe semmi. Megállt a tudomány.
Doksikkal az a bajom, hogy nem találtam egy összefoglalót, amiben röviden leirogatják a dolgokat, mit miért, hogyan. Már "régóta" programozok VB, SQL, néha C, stb. Csak a PICre rá kell hangolódni, meg kell érteni. De tetszik.
Ez a leirás pl tetszik Én vhogy példákon keresztül szeretek tanulni. Csak a mikrobasic helpjében nem kommentezték agyon a dolgokat a példaprogik mellett. És nem vettem bántásnak.
Most már be tudom állítani a prescalert, hogy 0.5sec legyen a legnagyobb.
Timer meg csak pörög. Ha megnyomódik a gomb, hogyan tudom kiolvasni timer értékét(ez most lehet, oltári hülye kérdés, de nekem így lenne logikus, és a szimulátorban látszik is az értéke)? Timer0 simán kiadja? Mert akkor Ugye az kellene első lépésben, hogy gomb megnyom, timer eltárol, gomb megint megnyom, majd timer és eltárolt timer közti különbséget kell megnézni. Erre is bizti vmi egyserá módsze, mint hasonlítgassak, hogy kisebb, vagy nagyobb, és azt lekezelni. Egy xor, vagy hasonló. Nem árt ezeket újra átnéznem. Már régen voltak...
Na, találtam egy páldát
dim T1 as word absolute $FCE ' Timer1 Low and High És akkor T1-et tudom olvasni. Ok, ez 16F852-re van, majd megnézem, helyes-e a cím a sajátomnál. És ez timer1, nem 0, azt is látom. Sőt, tólcordulásnál eleve adhatok neki egy értéket,és utána indítom el, így megvan a "pontos" egész mp is. Ok, ezt is egy példaprogiról néztem le. T1CON.TMR1ON = 0 ' stop Timer1 T1 = T1 + T1_Period ' reload Timer1 + zero-sum error T1CON.TMR1ON = 1 ' start Timer1 a korrekcióba beveszi azt is, hogy 6 ciklus kell a reloadhoz. Szimulátoron úgy is meg tudom nézni, mennyit, meg hol késik/siet. Példákat eddig is találtam, de ti sokat segítettek, hogy elindulhassak! Köszönöm. És tuti, ez után is mondok hülyeséget, de most már annyira talán értek hozzá, hogy a szimlátor segítségével észre tudom venni a hülyeségeimet. Néztem ezt a watchdogos akármit is. Ha már megvan a progi, nehéz beleírni. De a legolcsóbb picet mellé téve, nem kell átírni. Egy timer kifelé adja a jelet a másik picnek, ami bereszeteli ezt, ha nem ad jelet neki Tudom, azért építették be, hogy ne kelljen..
Sajnos ezt a microbasicet nem ismerem - meg megboldogult fiatalkoromban basiceztem, aztan nagyon gyorsan raalltam az assemblyre mikor rajottem az mennyivel gyorsabb, mert azok a gepek meg lasabbak voltak mint ezek a PIC-ek De azok a basicek interpreteres nyelvek voltak (kb mint Java vagy .NET, csak ez utobbiak mar azert kisse virgoncabb hardveren futkorasznak, szoval itt mar mindegy a technolgia). Microbasic nyilvan compileres, tehat akar mindegynek is tekintheto - bar megjegyzem letezik interpreteres basic mikrokontrollereknel is - az Propeller ceg Basicstamp csaladja ilyen...
Na mindegy, a lenyeg, hogy a peldak gyakran nagy segitsegek, de hidd el, a DataSheet a PIC-ek bibliaja. Amit abban irnak az a szent torveny, amit a peldaban latsz az pedig vagy jo vagy nem jo. Erdemes jo sok peldat is megnezni, es tanulni beloluk ki hogy csinalja. Mivel magas szintu nyelven csinalod, ezert ertekek osszehasonlitasanal ne nagyon torodj xor vagy kivonas vagy egyeb dolgokkal, hisz neked van IF utasitas... hasznald egeszseggel Ha assemblyzel akkor ilyenek nincsenek es akkor tanulhatod az IF mogotti matematikat is, de lehet neked ez nem kellene meg. Ami a timert illeti: Amint egyszer elinditod az porog mint a veszedelem, szamlalo meg tulcsordul ha kell... Ha beallitasz neki interruptot, akkor tulcsordulasrol tudni fogsz, amugy csak van egy bit ami jelzi ezt (T0IF a timer0 eseten amit torol a peldad) es annak kezeleset akkor neked kell megoldanod. De abban a ledes peldaban gyonyoruen le van ez kezelve, timer tulcsordul, jon interrupt, novel egy szamlalot... Ez kell neked is ha tovabb szeretnel nyulni mint 0.5s vagy nagyobb orajellel akarod az alkalmazasod megvalositani. Gomb nyomasanak figyeleset egyenlore egy ciklussal oldd meg - varsz amig meg nem nyomjak, aztan raersz kesobb gondolkodni, hogy hogyan irdd at interruptosra. Egyenlore foljon a fejed a perges miatt... itt mar elhangzott hogynan lehet kivedeni es ha azt koveted akkor nagyjabol oke vagy. Lenyomas pillanataban olvasd ki a szamlalot + timert (szamlalo*2 = ~1s) + a szamlalod ~0.5s/65536 felbontassal megmodja az idot... A fantaziadra van bizva hogyan szamolgatod ki ebbol a valos idot... mikor kesz vagy ezzel, es ugy erzed mukodik akkor irdd meg ide, csatold a kodod - a kod termeszetesen legyen reszletesen kommentezve mit miert csinaltal es miert ugy Szerintem itt sokan segitenek majd ha valami nem megy vagy nem jol oldottal meg.
Idézet: „Doksikkal az a bajom, hogy nem találtam egy összefoglalót, amiben röviden leirogatják a dolgokat, mit miért, hogyan.” Az adatlapot próbáltad? Ez eddigi kérdéseidre abban megvan a válasz. Nála tömörebben sehol nem találsz infót. Én csak az adatlapokat használom, és abból tanultam meg a PIC-et, mivel akkoriban nem volt más, és nem is nagyon kellett. A másik, hogy miért nem választasz egy olyan nyelvet, amit többen használnak? Ez a Basic mindenre jó, csak arra nem, hogy megértsd mi miért van. Ha egy komolyabb feladatba ütközöl, nem lesz benne köszönet.
Idézet: „Ugye az kellene első lépésben, hogy gomb megnyom, timer eltárol, gomb megint megnyom, majd timer és eltárolt timer közti különbséget kell megnézni.” Ugye hogy hiába írogatunk? Aztán csodálkozol, hogy watt mumus morcos, még ijesztgetsz is vele! Ahelyett, hogy teleírkálod a topicot felesleges kérdésekkel, olvass! Le van írva a módszer, direkt neked címezve! Három betű, meg egy szám...
Csak ezek az interruptok bonyolultabbnak tűntek.
Az itteni cikk jó volt. Rövid, és leírta, mit miért. A timer pörgését értem. A számlálót is. Nekiállok, megírom. A gombnál gondolom arra gondoltok, hogy megnyomáskor egy egész elektronháború lesz az érintkezőnél. Ennek is utánaolvasok, bár most egy jelgenerátorral fogom szimulálni.
Ok, megnézem.
Értem én, hogy jót akarsz, de én maradok Mikrobasicnél. Ahogy elnézekettem, nagy különbségek nincsenek. Mikroe oldalán van a mikroc is.
Most már visszaolvasok. Akkor elsőre olyan volt, mint amikor angolul tudok 10-ig számolni, te meg levágsz nekem 4 mondatot.
|
Bejelentkezés
Hirdetés |