Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   41 / 41
(#) TavIR-AVR válasza trioda hozzászólására (») Nov 5, 2007
Felbontás?

A timert lépkedteted...
Azaz neked kell változtatgatni. frekimérés: időegység alatt beesett impulzusok száma.

A timer1 65535 lépést tud....
(#) watt válasza edgaar hozzászólására (») Okt 31, 2007
A PNP tranyókat cseréld le NPN-re. A kollektort kösd a +5V-ta és nem kell bázisellenállás sem. H szintre lesz aktív egy szegmens.

Van még két szabad láb, miért nem arra teszed a gombokat?

A gombok a PAD1-4-ig terjedő bigyók jelképezik?
Ha igen, akkor így meg ne nyomd, mert nyekk!

A 270ohm-okat cseréld le 100 ohm-ra.

A 32,767KHz kristály nem erre való, azt a timer1 külső oszcijára lehetne tenni.
Az órajel legyen 4MHz. Pontosítást lehet tenni az itt korábban tárgyalt módokon(olvass vissza), valamint egy az OSC1 re kötött 5-40pF-es kondival.

(#) watt válasza gyengus hozzászólására (») Okt 24, 2007
A tranyókat szépen beírod a google-ba és máris látod melyik milyen.
A bekötés: Kollektor testre, emiter a katódra, bázis a PIC lábára(nem kell ellenállás).

Idézet:
„A frekin nem állítgattam”

Ez alatt mit értesz? A frekit nem is lehet állítani!

Idézet:
„Honnan tudom, hogy mennyi a megszakításkezelés ideje? Nem szeretnék találgatni, mert akkor tuti, pontatlan lesz.”

Onnan, hogy minden utasításnak megvan az ideje. Szépen összszámolgatod és kész.
Egyébként próbálgatással is lehet eredményt elérni.

Idézet:
„azt hittem, könnyebb összehozni 1 órát.”

Neked, vagy nekem? Egyébként nem nehéz, csak végig kell gondolni, mi hogyan működik.

Idézet:
„Timer0-t használom”

A timer1 és a Timer0 majdnem egyforma, csak nagyobb előosztást is lehet kérni.


(#) watt válasza gyengus hozzászólására (») Okt 24, 2007
Nos igen, a kérdések száma nem kevés! Próbálok sorban:
Ha 20MHz-es a kristályod, akkor HS oscit kell beállítani PLL nélkül. Csak 12MHz-es kaviccsal lehet a 48MHz-es PLL-es max frekit kihasználni.
Így ha helyesen állítottad be, akkor 20MHz-el kell számolni, azaz annak negyedével, mivel ezt az adatlap is írja, hogy az előosztóra az órajel negyede jut!
Egyszerűség kedvéért 5MHz-el kell számolni(kihagyva egy felesleges osztást a képletből).
Ha a timer1-et használod(kár, hogy ez nem említed!), akkor annak előosztója 1,2,4,8 lehet. Nézzük 1-el(azaz nincs osztás). Ekkor a túlcsordulás 76,2939453125Hz-enként lesz. Nos ebből kerek számot készíteni nem is olyan könnyű!
Ha előosztunk 8-al akkor 625000Hz-et kapunk. Ezt osztjuk 62500-al és kapunk 10Hz-et. No ez már egész jó, mert ebből lehet segédszámlálóval 1Hz-et készíteni.
Az állítási lehetőség a 62500-ban rejlik. Ezt a kezdőértéket változtatva elég jó felbontással lehet hangolni az órát.
Megjegyzem, hogy a megszakítás lekezelése is elég sok idő, ezt ki kell vonni a Timer idejéből. Végül elég macerával, de nagyjából pontos órát lehet kreálni.
A pontosítást a végén kell megtenni, mikor már minden működik, mert bármilyen változtatás a megszakításban elhangolhatja.

Tranyónak bármelyik jó, amelyik PNP-s. A PIC-et pedig vedd le a katódokról, mert tönkre fogod tenni! (1láb max 20mA!)
(#) Norberto válasza hátor hozzászólására (») Okt 23, 2007
Assembly-be viszonylag könnyen visszafejthető a beégetett kód (vagy a HEX fájl), de annak sincs sokszor értelme, mert hosszabb kódoknál teljesen értelmezhetetlen lesz az egész, minden csak zagyvaságnak tűnik. Ugyanis a beégetett kód sem kiegészítéseket, sem magyarázatokat, sem kommenteket nem tartalmaz, sőt, a címkék sem lesznek azok, amiknek valaha el voltak nevezve. Pl. timer1 címke helyett lesz LABEL0, ADconv helyett lesz LABEL1...szóval ezt általában így képtelenség visszafejteni.

Basic-be visszafejteni pedig szerintem egyenesen lehetetlen dolog...
(#) deguss válasza tibcsi hozzászólására (») Júl 27, 2007
Szia!

Nézd meg a chiped adatlapját (vagy esetleg írd meg nekünk), hogy hol vannak a timer1 oszcillátor lábai.
Pl. fejből tudom, hogy 16F877-esnél a T1OSO (RC0=11) és a T1OSI (RC1=12).
A programot tekintve a TMR1CS (clock source) bitet 1-re kell állítanod, hogy "extern" üzemmódban legyen. T1OSCEN is 1 kell hogy legyen, hogy menjen az inverter.
Lényeges lehet még a szinkronizáló bit, amit T1SYNC-nek hívnak és invertált.
(#) Thomas10100 hozzászólása Jún 2, 2007
Sziasztok!

Kettő kérdésem lenne, az egyik az késleltetés,a másik pedig táblázat kezelés.


A késleltetéssel az lenne a kérdésem hogy hogyan jön ki a 100us? mindent értek hogy mi mit csinál, de nem tudom hogyan jön, ki adott órajelhez, hogy mennyiszer kell ismételni(mennyit kell a változóba tenni).

itt egy program részlet:


kesl100 movlw 32; 4MHz-en100uskésleltetés
movwf timer1
kesl1 decfsz timer1,1
goto kesl1
return

A másik kérdésem pedig hogy hogyan működik a táblázat? Illetve mi is ez, és mire jó?


Itt egy részlet:

Table: addwf PCL,1
retlw 0c0h ; '0'
retlw 0f9h ; '1'
retlw 0a4h ; '2'
retlw 0b0h ; '3'
retlw 099h ; '4'
retlw 092h ; '5'
retlw 082h ; '6'
retlw 0f8h ; '7'
retlw 080h ; '8'
retlw 090h ; '9'
retlw 088h ; 'A'
retlw 083h ; 'b'
retlw 0c6h ; 'C'
retlw 0a1h ; 'd'
retlw 086h ; 'E'
retlw 08eh ; 'F'

Szóval ez egy szubrutin? És mit csinál ahol meghívom, a "call Table" paranccsal?
És mi a PCL?



Egy kicsit egybefolyt, a program.
Köszönöm a segítséget!
(#) sysy hozzászólása Máj 27, 2007
A Global Int letiltásával nem állítod le a Timer0 számlálását! Ez úgy lehetne megcsinálni, ha egy soros ellenálláson keresztül vezetnéd be a jelet a RA4 be. Az ellenállás és az RA4 csatlakozásába még egy portot is bekötsz. (párhuzamosan a két port) Ezzel a kisegító porttal le lehetne kapcsolni a bejövő jelet. (kimenetnek programozva és mondjuk "0" kiküldve rajta) Ha mérsz, akkor bementenk állítva nem zavarja a mérést.

Most utána számoltam és 20MHz mérendő freki esetén 12 asm utasítás végrehajtása alatt fordul át a Timer0. Ez meglehetősen durva dolog. Egy C sor simán lehet ennyi. Ha a PA3 lenne a kapuzó port párhuzamosan a jelbemenettel, akkor mindössze ennyit kell a timer1 megszakításának elejére berakni:

#asm
BANKSEL TRISA
bcf TRISA,3
BANKSEL PORTA
#endasm

Ez elég hamar lefut. Természetesen valahol a program elején az RA3-at kimenetnek kell beállítani és kiküldeni egy 0-át.
(#) sysy hozzászólása Máj 27, 2007
Nem hiszem, hogy az egészséges lelkületű geekek lenéznek téged ezért. Amíg asm geek voltam (és nagyon büszke) ámulattal néztem a C-ben nyomulókat és irigyeltem őket, hogy egy C utasítással megcsinálják azt, amit én egy fél képernyőnyi kóddal. (ami nem biztos, hogy működött azonnal) Mindíg nagyra tartottam azokat, akik C ben tudnak programozni. Az sem egyszerű, bár a kívülállóknak annak látszik. Visszatérve a problémádra...

Valószinűleg abban rejlik a baj, hogy nem lehet olyan gyorsan végrehajtani a C utasításokat, mint ahogyan kellene. Ilyen nagy freki mérésekor célszerű lenne a Timer0 előosztóját is használni, hogy legyen időd lekezelni az eseményeket. A timer1 megszakításába bele kellene tenni 2-3 ASM utasítást, ami gyorsan "lekapcsolja" a Timer0-ra bejövő frekit. Utána kijelzés, kinullázni a mérő regisztereket és új mérést indítani.

Megjegyzés: A timer1 ben nem kell letiltani a megszakítást, mert a megszakítás kiszolgálása alatt ez automatikusan tiltva van a függvényből való visszatérésig.
(#) davidov válasza gtk hozzászólására (») Máj 27, 2007
Köszönöm szépen!!

Tényleg az volt, a baj, hogy a timer1-hez nem rendeltem megszakítás fgv-t. Mostmár értem miért volt hiba beállítani a TIMSK-ban az OCIE1A bitet.
Ez elég láma hiba volt...

Köszi szépen még egyszer mindenkinek, aki segített!
(#) hummer válasza gtk hozzászólására (») Máj 26, 2007
Szia ! Az össes interruptben használt változót volatile-nak kell deklarálni ? Azt is, amivel csak egy 1/x műveletet hajtok végre ?

Másik kérdésem:
warning 216 "interrupts disabled during call to prevent re-entrancy: (@MULFF)" ezt a warningot kaptam. A progit le tudtam fordítani, az angol üzenetet el tudom olvasni (a timer1 interruptban a disable_interrupts(global)-ra véste), de ezzel lehet valamit kezdeni ?
(#) hummer válasza sysy hozzászólására (») Máj 26, 2007
Köszi az ötletet. Az igazság az, hogy eredetileg én is úgy csináltam, hogy a timer1-hez tettem a ste timert, de akkor az volt a szívás, hogy valamiért a timer0 interrupt nem ment, a benne levő count változóval szart se csinált. Megpróbálom az általad adott ötleteket. az amúgy nem baj, ha késik, mert akkor legalább csak egy dolgot csinál, azt könnyebb korrigálni. Holnap újítok egy frekimérőt és pontosan kimérem a TTL oszcillátorokat, mert szerintem azok is elmásznak kicsit (de persze nem +/- 2MHz-et - mert valami 10 ppm-esek, ha jól tudom). addig jöhetnek még az új ötletek.
(#) sysy hozzászólása Máj 26, 2007
Sőt!

A timer1 megszakításába raknám át a Timer0 inicializálást, mert amíg az LCD-vel szarakodik a program, addig is számlál ám a Timer0!

valahogy így:

#int_timer1
void timer1_isr(void)
{
disable_interrupts(GLOBAL);
freq=((icount*256)+get_timer0())*14.5; // kHz
period=(1/freq)*1000;
set_timer1(0x9e58);
icount=0;
set_timer0(0); //!!!
}
(#) gtk válasza davidov hozzászólására (») Máj 26, 2007
Idézet:

Így viszont azt nem értem, hogy miért indul újra, ha a TIMSK-ban az OCIE1A és az OCIE0 bitet is 1-be állítom? Azért mert PWM-hez nem kell az OCIE1A bit beállítása? Lehet, bár kicsit furcsa.”


En hasznaltam PWM-et mega8-nal,megpedig: timer1 10-bit PWM phase correct beallitassal.Ehhez nem allitottam be az OCIE1A ,(OCIE0) biteket.

Viszont ennel: OCIE1A ,benne van a neveben is hogy (output compare interrupt enable),tehat megszakitas vektor tartozik hozza.
A megfelelo megszakitas vektort ha hozzaadod a C forrashoz akkor nem fog ujraindulni.Ezt meg keresd ki a hasznalt C konyvtarad helpjeben hogy mi az.
(#) davidov válasza gtk hozzászólására (») Máj 25, 2007
Hello!

Nem akarom az egész kódot beszúrni, mert elvenné a figyelmet a lényegről. Egyébként egy szabályozható tápegységet csináltam, a timer1-et PWM módban használom, ezzel szabályzom (aluláteresztő szűrés után) a teljesítményerő részt, a timer0-lal pedig megszakításokat generálok a fesz. és árammérésekhez.

A stop timer tényleg felesleges, csak formaiság.

A TIMSK-t én is először csak egy helyen akartam beállítani. Pár hozzászólással hamarabb ott van az inicializáló fgv. De ahogy ott is írtam, és az előző hozzászólásomban is, ebben az esetben a progi újraindul. Akkor nem indul újra, ha a timer0 initben (amit későb hívok meg) megint inicializálom, de a timer0 működésnek megfelelően, tehát törölve az OCIE1A bitet.
Ebből arra következtettem, hogy PWM módban nem kell az OCIE1A bitet 1-be billenteni, hiszen működik.
Így viszont azt nem értem, hogy miért indul újra, ha a TIMSK-ban az OCIE1A és az OCIE0 bitet is 1-be állítom? Azért mert PWM-hez nem kell az OCIE1A bit beállítása? Lehet, bár kicsit furcsa.

A timer0-hoz van megszakítás fgv-em, (ISR(TIMER0_COMP_vect){...}), a timer1-hez értelemszerűen nincs.
(#) davidov válasza Reggie hozzászólására (») Máj 23, 2007
Hello!

Köszi szépen a tippet, sajnos ezzel a megoldással is úgyraindul, egy olyan fügvényben, amiben csak egy _delay_ms(1); utasítás van.

Én úgy indultam el a TIMSK regiszter beállításánál, hogy úgy is a timer1-et inicializálom hamarabb, ezért már ott beálítottam a timer0-nak megfelelő bitet, ezért először a timer0 initbe nem is írtam bele a TIMSK állítását. Ez nekem jónak tűnik. De ha így csinálom újraindul. (emiatt írtam oda a bemásolt programrészbe hogy ha ezt a sort kikommentezem, akkor újraindul)

A legfurcsább az az, hogy ezzel a megoldással működik. Igen, ez így szerintem is rossz, mert a TIMSK regisztert a timer0_init-ben felülírom, bár ezek szerint a PWM módhoz (a timer1 így működik) nem kell az OCIE1A bitet 1-be rakni a TIMSK-ban.
De azt még mindig nem értem, hogy ha mindkét bitet 1-be állítom a TIMSK-ban, vagy úgy ahogy írtad, vagy úgy ahogy én próbáltam, akkor miért kell újraindulnia?

A timer0 megszakításhoz egyébként van egy ISR(TIMER0_COMP_vect)
{...}
függvényem

Kicsit rejtélyes a dolog...
(#) Reggie válasza davidov hozzászólására (») Máj 22, 2007
Udv!

Alapveto programozasi hiba. TIMSK egyarant hasznalt a timer1-hez es Timer0-hoz.

Tehat timer1_init-ben ird ezt:
TIMSK = TIMSK & 0b11000011 | 0b00010000;
timer0_init-ben:
TIMSK = TIMSK & 0b11111100 | 0b00000010;

Termeszetesen nem hinnem hogy ettol hibas a programod.

Kerdes: a megszakitasi vektorokhoz rendeltel fuggvenyt? az avr-gcc libjei ugy vannak megirva, hogyha nem definialsz fuggvenyt egy int vektorhoz, akkor az adott vektor 0-as cimre torteno ugrast tartalmaz.
(#) davidov válasza Gory hozzászólására (») Máj 15, 2007
Hello!

Az utóbbi pár napban nem nagyon volt időm a problémával foglalkozni, de ettől sajnos nem múlt el. :no:

Így inicializálom, és hívom meg a timereket:

void timer1_init(void);
void timer0_init(void);

int main(void)
{

port_init();
timer1_init();
timer0_init();

sei();
....
}

void timer1_init(void)
{
TCCR1A = 0x0000; //stop timer
TCCR1B = 0x0000;

TCNT1 = 0;
OCR1A = 200; //f = fclk/(N*(1+TOP)) = 976.56Hz ,fclk = 8MHz
OCR1B = 0;
TIMSK = 0b00010010; //Output Compare A Match Interrupt Enable
TCCR1A = 0b10000011; //Clear OC1A, OC1B on compare match; Fast PWM 10 bit, TOP = 0x03FF
TCCR1B = 0b00001010; //Fast PWM, TOP = 0x03FF; prescale(N) = 8
}

void timer0_init(void)
{
TCCR0 = 0b00000000; //stop timer

TCNT0 = 0;
OCR0 = 78; //T = Tclk * prescale * OCR0 = 0.01s
TIMSK = 0b00000010; //ha ezt kikommentezem újra indul
TCCR0 = 0b00001101; //Clear Timer on Compare Match, TOP: OCR0, prescale = 1024
}

További érdekesség, hogy ha a timer0 initjében kikommentezem a TIMSK = 0b00000010; sort, akkor is újra indul. Ez azért furcsa, mert először a timer1-et init-jét hívom meg, és akkor már beállítom úgy a TIMSK regisztert, hogy a timer0-nak is megfelelő legyen.
Normális ez? Hiszen így a timer0_init meghívásával felülírom a TIMSK regisztert, így kitörlöm az OCIE1A bitet, ami szerintem a PWM-hez kellene (bár működik).

Van valakinek valami tippje?

(#) davidov válasza Gory hozzászólására (») Máj 7, 2007
Megvan a hiba!!

A programot C-ben írtam , így nem foglalkoztam az interrupt vektorokkal, de mikor írtad, hogy lehet, hogy rossz a sorrend, egyből eszembe jutott, hogy régebben is volt már egy ilyen problémám.
Ezért azt csináltam, hogy elővettem egy régi műküdő programot, amiben a timer1-et és a timer0-t (nagyjából) ugyanolyan funkcióra használtam (pwm, és timer megszakítás), majd szépen el kezdtem a régit átalakítani úgy, ahogy most szeretném használni a programot.
Minden változtatásra szépen futott a progi (persze nem csinált semmi értelmes dolgot), egészen addig, amíg az utolsó különbséget is kijavítottam. Ez az volt, hogy a timer1_init() fgv-t a régi programban előbb hívtam meg mint a timer0_init()-et, majd amikor ezeket megcseréltem egyből újra indult.
Igazából nem sikerült rájönnöm, hogy ez miért van, de ha előbb a timer1-et, majd a timer0-t inicializálom, akkor gond nélkül fut.

Van erre valami magyarázat??
(#) deguss válasza mokus hozzászólására (») Márc 3, 2007
Idézet:
„Szerinted nyithatok neki egy PIC-es témát?”


Nem kell, ez még belefér ebbe is, hacsak Csaplarnak nincs ellenvetése.

Szerintem a 4-30mp-re is tökéletesen megfelel a PIC timer1 modulja. Ha ez a
Idézet:
„tárgy* érzékelő elötti elhaladás”
-át fel lehet fogni egy-egy impulzusként, akkor ott a CCS I. cikk 3. oldalán a pulzusszélességmérés példában a megoldás.

INT pin-re jövő le-, vagy felfutó él elndítja a timer1-et, ha túlcsordul, egyszerűen egy számlálót növelsz. Ha újra pulzus jön az INT pin-re, megállítod a timert, és a pontos értéket úgy kapod meg, ha kiszámolod, hányszor csordult túl, és hozzáadod a timer1 aktuális értékét. Utána meg már csak számolás kérdése, hogy másodperbe alakítsd a "tick"-eket.

Üdv. deguss
(#) watt válasza miklajos hozzászólására (») Feb 22, 2007
Biztosan más oka volt a tönkremenetelnek. Mert volt többször olyan, mikor véletlenül a PC-n felejtem az égetőmet a céláramkörrel, bekapcsolt főkapcsolóval(mivel a PC-ről kapja a Vdd-t), és a gyerekeim bekapcsolták a gépet játszani. Az LPT port alapállapotban a 7406 inverter használata esetén a Vpp-t és a Vdd-t bekapcsolja, ezért kell normális esetben az égető progit elindítani, mielőtt bekapcsolod az égető tápját.
Na de a lényeg, hogy volt olyan, mikor órákon keresztül rajta volt a Vpp és a Vdd, és semmi baja nem lett. De ettől duvább dolgok is voltak, pl. fordított táp, 12V a Vdd-re meg ilyenek és ezt is kibírta! Az is mindegy, hogy milyen jeleket kap égetés közben, legfeljebb nem sikerül a program bevitele. A WPB_F18 fejlesztése közben kapott hideget, meleget néhány PIC, nem lett bajuk!
Nekem csak egy 18F1320 halt meg, mert annak a PGD, PGC lábai egyben a timer1 külső oszcillátor lábai is, és be lett kapcsolva figyelmetlenségből a külső oszci, ami azt eredményezte, hogy a kimenete szembe került az óra, vagy az adat jellel. Ettől kiakadt a port, de a beégetett kód működött, csak többé nem lehetett programozni. Ez egyébként egy láb feláldozásával a tökéletes programvédelem is egyben! Ilyen esetben egy soros 100ohm megóvhatja a portot, viszont esetleg zavarhatja az égetést, ezért nincs az égetőn alapban. Potyo ezt 4066-os aktív leválasztással oldotta meg, ami a tökéletes megoldás, ha a Vpp vezérli a 4066-ot, akkor nem lehet gond az időzítéssel, mert a Vpp később kapcsolódik be, mint a Vdd, azaz a progizó lábakra csak akkor kerülhet jel az égetőről, mikor a Vpp már átkapcsolta a PIC-et égető üzemmódra. Ha lesz egy kis időm és potyo sem bánja a 2.0-ás verzióba betenném ezt a kiegészítést!
(#) gtk válasza pakibec hozzászólására (») Okt 30, 2006
A kijelzest ne a megszakitas rutinba tedd hanem a main -loop-ba,a megszakitas rutinban csak egy flag-et allits be (kijelz_flag=1) hogy johet a kijelzes,majd kijelzesnel ezt torlod (kijelz_flag=0),igy biztonsagos es szep ...

Idézet:
„Pontatlanság annyi lehet, hogy a külső impulzus már fut, mikor a t2 elindul”


Erre en is gondoltam..
Csinaltam a timer1-nek egy maskot,es mikor timer 1 elmozdult--> erteke 1,akkor kinullaztam es indult a timer2,de rajottem hogy csak bonyolultsagot okoz,ugyanis nyugodtan lehet merni 2*idoalapnyi ideig ,akkor meg pontos lesz..
(#) pakibec válasza MaSTeRFoXX hozzászólására (») Okt 29, 2006
Sziasztok!

Szóval megoldottam a külső kristályt (kondik nélkül). Bascom-ban van a timer2-nek az aszinkron timert aktiváló beállítása. Először csináltam egy órát, 20 percet teszteltem, ez alatt nem mutatott eltérést.

A frekimérés: a négyszögjel a timer1-re (T1) jön be. Az első jel után indul timer2 az órakristályról. 1s után túlcsordul. A megszakításkor leáll mindkét timer és jöhet a kiírás. Azt hiszem Gtk is ezt a megoldást írta.

Pontatlanság annyi lehet, hogy a külső impulzus már fut, mikor a t2 elindul, de ez megoldható úgy, hogy t2 folyamatosan megy. Ekkor az első érték pontatlan lehet ugyan, de a folyamatos frissülés miatt ez nem zavaró.

Holnap letesztelem nagyobb frekvenciasávon is, majd megirom az eredményt.

Üdv
(#) gtk válasza gtk hozzászólására (») Okt 29, 2006
Tul.keppen timer1, -es 2 -t hasznalja a frekimeresre,(a proci belso oszcirol megy)igy nem sokat kavarhat be a belso oszci pontatlansaga a meresnel..

Dudus: Kulso osztot hogy kepzelted el?mondjuk 4040 -nek a clockjara menne a merendo negyszogjel,a binaris kimenetet meg kapuzni AND -el a megfelelore (kapcsoloval ?; vagy nagyobb ioval rendelkezo procit hasznalni es osszekotni egyik portjaval,majd szoftbol...?)
(#) gtk válasza pakibec hozzászólására (») Okt 29, 2006
Szia!

Odaadnam a C-forraskodot amit irtam,de az az igazsag hogy /pill fogalmam nincs hogy melyik allapotaban van,hogy egyaltalan mukodik-e ,volt -e modositva es milyen iranyban.
A probapanelt meg modositottam elegge ugy hogy kirpobalni nem tudom.

Ami biztos:

Idoalap:
KUlso 32768 orakvarc Timer2-nek ,prescaler:128
Impulzus szamlalo: Timer1 --> PD5 lab.

A timers init resz:

/* TIMER2 , kulso 32768 oszc. XTAL labakon*/

TCCR2 |= (1 << CS22)| (1 << CS20); //elooszto 128
ASSR |= (1 << AS2); //aszinkron uzemmod bekapcs

/* TIMER 1 */
/*
* egy-be allitott bitek TCCR1B reg.ben:
* CS10,CS11,CS12: kulso orajel forras,felfuto elre lep.
* --> 00000111 -->
*/
TCNT1 = 0x0; //timer1 nulla
TCCR1B |= 0x07; //timer 1 indul,felfuto elre lep. _BV(CS10) | _BV(CS11) | _BV(CS12);

/* megszakitas engedelyezes */

TIMSK |= (1<timer1 overflow enabled*/
TIMSK |= (1 << TOIE2); //timer2 overflow enabled

/* PORTD / T1 bemenet */
DDRD &= ~( 1 << PD5 ); // PD5 a timer 1 clock-->imp.szamlalo
/* PORTB kimenet*/
DDRB = 0xFF;
/* PORTC kimenet */
DDRC = 0xff;

}

FUSE BITEK:

lfuse:w:0xE4:m
hfuse:w:0xD9:m

Tovabba:
(Ahogy en csinaltam
Ha impulzusok szama > 10000 (10Khz),akkor idoalapvalatas,0.001S-re.

Timer2 overflow rutinban az impulzusok szamanak kiolvasasa:
imp = TCNT1; //timer1 erteke

Megszakitast nem kapcsoltam ki: amig az ovf.rutinbol ki nem lepik a program addig megszakitas ki van kapcsolva.>>>>>>>
(#) pakibec válasza Dudus hozzászólására (») Okt 28, 2006
Lemérem a nagyobb frekit, amint visszajutok a chip-be

Átálítottam a fusebiteknél az internal clockot external low frekvency crystal-ra.. és sajnos se kép se hang. Pedig az óra kristály a helyén. Hát ha így nem akkor fogalmam sincs hogy állítom be a timert külső időzítésre... Ami érdekes, hogy a progi -igen lassan, de fut az avr-en, csak a pc-vel nincs kapcsolat.

A timer nálam semmielyen esetben sem csordul túl. A főprogram rögtön egy ciklussal indul, ami akkor ér véget ha timer1 >= 15625 (ez nálam egy sec). A cikus alatt int0 engedélyezett. Az első int0 meghívás indítja csak el a timer1-et. Ha a ciklus -amiben egyébként csak egy nop van- végetér, timer1 megáll, nullázódik, int0 letiltásra kerül. Ez után jön a kijelzés.

Üdv
(#) gtk válasza d0b0s hozzászólására (») Szept 5, 2006
Koszi vegulis mukodik...

De nagyon erdekes dolgok vannak,amiket nem ertek.PL az elobb emlitett is,es a timer2 -vel kapcsolatosan is:
  1. //timer2 overflow bekapcsolva
  2. void
  3. timer2_overflow_disable ()
  4. {
  5.   TIMSK &= (0 << TOIE2);
  6. }
  7.  
  8. //timer2 overflow kikapcsolva
  9. void
  10. timer2_overflow_enable ()
  11. {
  12.   TCNT2 = 0x0;
  13.   TIMSK |= (1 << TOIE2);
  14. }

Eddig ok is,csakhogy kikapcsolni kikapcsolja,de be nem .A kikapcsolas,bekapcsolas feltetel 128 eloosztoval beallitott timer1 OVERFLOW rutinban van,hogy ne legyen a main loop-ban,mert ott nem akart mukodni.

Kell figyelni valamelyik regisztert?,szinkronizalas problema vagy mi lehet?
Valakinek ha van otlete please segitsen..Ugylatszik keveset tudok en meg ezekrol
(#) MaSTeRFoXX válasza Balázs hozzászólására (») Szept 3, 2006
Beraksz egy timert, és az egyik gombbal a timer1.enable:=true vagyis bekapcsol, a másik gombbal timer1.enable:=false, A vilogtatás valahogy így néz ki

A timer1 tulajdonságainál beállítod a timer1.interval:=1000 vagyis 1 mp

procedure timer1tick;
begin
PortOut($378,1);
Sleep(1000);
PortOut($378,0);
//a másik késleltetést a timer késleltetése adja
end;


Vagy másik megoldás (elegánsabb):
Csinálsz egy boolean változót, mondjuk "bekapcs"

A program kezdetetén bekapcs:=false;

majd az egyik gombnál bekapcs:=true;( ezzel indul a villogás)
a másik gombnál bekapcs:=false; ezzel kapcsolod ki a villogást

Beraksz egy timert, beállítod az időzítést mondjuk 10-re vagy 1 re (timer1.interval) (ez most nem számít bele a villogás sebességébe)

procedure timer1tick;
begin
if bekapcs=true then begin
PortOut($378,1);
Sleep(10);
PortOut($378,0);
Sleep(10);
end;

end;


Remélem érthető voltam
(#) pakibec válasza Inhouse hozzászólására (») Jún 16, 2006
Sziasztok!

Egy kapcsoláshoz én is szeretnék távirányítót használni. A vevőt is nekem kell megépíteni, TSOP+egy avr lesz. Valószinüleg a táviban is avr-t használok. A Bascom-ban benne van a teljes RC5, RC6 vezérlés előre megírva, így már egyszerü távirányítot építeni.

Szivesebben használnék viszont egy meglévő távirányítot, csak a protokoll kihámozásával gondban vagyok. Próbáltam az avr timer1-ével lemérni az időt, de egyenlőre még nem elég pontos.
(Samsung TV, vagy Silva DVD távitánytókról van szó).

Nincs valami tipptek, hogy lehetne megoldani a dolgot?

Üdv
(#) Slope válasza Tomee hozzászólására (») Feb 23, 2006
"Konfig elvileg jó mivel abban csak az osc tipusa szerepel és a sebbesége nem."
Azért ez így ebben a formában nem igaz!
Számszerű értéket valóban nem tartalmaz, de intervallumokat igen. Érdemes tanulmányozni a kiválasztott PIC adatlapját, sok szívástól menti meg az embert (tapasztalat).
Én 16F628A-t használok (sokkal többet tud mint az F84, viszont még fele annyiba sem kerül). Szóval az F628 adatlapja szerint a következő beállítások használatosak különböző frekiken:
XT => 4MHz
HS => 20MHz
LP => 200kHz
INTRC => 4MHz (fast)
INTRC => 37kHz (slow)
Ezek max értékek! (talán ez lehet a gondod)

Kapacitások timer1 osc (LP)
32kHZ = 33pF
100-200kHz = 15pF

Kapacitások órajel bemenet kristály esetén:
LP 32kHz = 68-100pF
LP 200kHz = 15-30pF
XT 100kHz = 68-150pF (C1), ill.150-200pF (C2)
XT 2 és 4MHz, valamint HS 8, 10 éa 20MHz esetén 15-30pF

Remélem segíthettem! Az adatlapok tanulmányozását csak ajánlani tudom (igaz, hogy hosszú, de utána könnyebb a hibakeresés). Az adatok F62x szériára vonatkoztak (nem tudom mit használsz, így eltérő lehet, bár nem valószínű )

Üdv!
Következő: »»   41 / 41
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem