Fórum témák

» Több friss téma
Fórum » 16F887 megszakítás és led világítás
Lapozás: OK   1 / 1
(#) csabino hozzászólása Máj 7, 2010 /
 
Korábban már felvetettem az alábbi kérdésemet:

"
Tudna nekem valaki segíteni a következő rövid kis progi megírásában?

16F887-es procihoz

Van egy belső időzítő, ami elszámol egy bizonyos összegig, mondjuk 3 másodpercig, akkor kér egy megszakítást és fellvillant egy LED-et, majd folytatódik tovább a program.

Köszi előre is a segítségeteket!"

És az alábbi választ kaptam rá:
A megszakítás beállításához ezek kellenek, ha timer1-et használsz:
BANKSEL PIE1
BSF PIE1, TMR1IE ; Enable Timer1 interrupt
BANKSEL PIR1
BCF PIR1, TMR1IF
bsf INTCON,GIE
bsf INTCON,PEIE
A megszakításban:
regiszterek mentése...
clrf TMR1L
MOVLW felso ; Value to load into TMR1H
MOVWF TMR1H ; Write High byte
MOVLW also ; Value to load into TMR1L
MOVWF TMR1L ; Write Low byte
bsf LED
nop
nop
nop
bcf LED
bcf PIR1,TMR1IF
regiszterek vissza..
retfie

Lenne valaki olyan rendes, és leírná egészbe a programot? Mármint, úgy hogy le lehessen fordítani, és rá tudjam küldeni a processzorra, hogy működjön?
Tudom elég hülye vagyok hozzá, de sajnos ez lenne egy beadandó feladatom... Nagyon megköszönném
(#) gabi20 válasza csabino hozzászólására (») Máj 7, 2010 /
 
Üdv!
16F628 mikrovzérlőre meg tudnám oldani a TIMER0 - val, azt ki is tudnám próbálni. 877 - es nekem nincs itthon
(#) proli007 válasza csabino hozzászólására (») Máj 7, 2010 /
 
Hello!
Szerintem felesleges volt új topikot nyitni, megfelelt volna bármely PIC témájú is..

Meg nem oldanám helyetted a feladatot, mert szerintem nem azért kaptad.. De egy kis program részlettel támogatnám a dolgot. Innen kis erőbefektetéssel, már megoldhatod vagy eldöntheted mit szeretnél. A feladat megoldásához tanulmányoznod kellene a DS30292C adatlapot.

A feladatban kis ellentmondás van. A Timer1 időzítő egység egy 16bites számláncból, és egy előosztóból áll. A számlánc így 65536-al, az előosztó (prescaler) 1:8-al tud maximálisan osztani.
Tekintettel arra, hogy a Timer órajele, vagy saját kvarccáról, vagy a rendszeróráról (fosc/4) tud működni, így a hagyományosan a 4MHZ-es oszcillátorról, nem lehet a 3sec megszakítást közvetlenül létrehozni.

Ha 3sec megszakítási időt számolunk, annak frekvenciája 0,33333..Hz. Ezt megszorozva 65536-al, majd 8-al és 4-el, 699kHz renszeróra frekvenciát kapunk eredményül. Tehát ha a belső órajelt használjuk Timer1 meghajtásának, akkor a maximális osztási szám esetén is a processzor órajele nem lehet nagyobb a 699kHz-nél.
Ebből az okból kifolyólag, vagy a Timer1 T1OSO/T1OSI bemenetére, (a processzor órajelétől független) kisfrekvenciás kvarcot rakunk, vagy a processzor órajelét szolgáló kvarcot cseréljük kisebb értékűre mint 699kHz.
A szokványos 32768-as kristállyal, már mind két módon elérhető a közvetlen 3sec-os megszakítás.

Az osztási számot úgy számoljuk ki, (belső órajel esetén) hogy a kvarc frekvenciát elosztjuk 4-el, (ez lesz a Timer1 órajele) majd a választott előosztó osztási számával (1:1 1:2 1:4 1:8). (Tekintve, hogy a Timer1 osztóval csak egész számmal oszthatunk, ennek még egész számnak illik lenni.)
Ez után a megszakítás idejét frekvenciára számoljuk (f=1/t) és megnézzük, hogy a megszakítási időben hányszor van meg az előosztó után számolt frekvencia. Ha ez az érték egész, és kisebb mint 65536, akkor nyertünk. Ha nem, más előosztási arányt, vagy kristályt választunk..
(Ha Timer1 külső órajelét használjuk, akkor nem osztunk 4-el, mert ez közvetlenül hajtja meg az előosztót, nem a rendszerórajel negyedével.)

A mintapéldában, a megszakítás 10msec-onként jön létre, amit aztán a megszakítási kiszolgáló rutinban tovább számlálunk.
A Timer1 üzemmódjának beállításához a T1CON regiszter bitjeit, a megszakítás aktiválásához, az INTCON és PIR1 megfelelő bitjeit használjuk.

üdv! proli007

intr.asm
    
(#) icserny válasza csabino hozzászólására (») Máj 7, 2010 /
 
Idézet:
„Van egy belső időzítő, ami elszámol egy bizonyos összegig, mondjuk 3 másodpercig, akkor kér egy megszakítást és fellvillant egy LED-et, majd folytatódik tovább a program.”
Ez így olyan zavaros, kétlem, hogy így szólna a feladat!
(#) Hp41C válasza proli007 hozzászólására (») Máj 8, 2010 /
 
Szia!

Egy ötlet: A Timer2-t PWM módban be lehet állítani 250, 1000, 4000 -rel való osztásra (PR2=.249, Timer2 előosztás 1, 4, 16), a pwm kitöltését 125-re állítva a pic lábára kihozható az órajel 250, 1000, 4000 -rel leosztott frekvenciájú jele. Ezt a Timer1 külső órajelére kötve, az említett időzítésnél jóval hosszabb is megvalósítható magasabb órajel frekvencia esetén is:

Fosc=20MHz, PWM kimenet 20kHz, Timer1 megszakítás kérés 26.2144 másodpercenként,
Fosc=20MHz, PWM kimenet 5kHz, Timer1 megszakítás kérés 104.8576 másodpercenként...
(#) proli007 válasza Hp41C hozzászólására (») Máj 9, 2010 / 4
 
Hello!
Ügyes. Tekintve, hogy a PWM kitöltése nem befolyásolja a frekvenciáját, így még az is kihasználható ha kell. Csak ne legyen a kitöltés 0 vagy 100%.
üdv! proli007
Következő: »»   1 / 1
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