 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
| Poglej prejšnjo temo :: Poglej naslednjo temo |
| Avtor |
Sporočilo |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 16.33 Kraj: Črnuče
|
Objavljeno: Sre Sep 30, 2009 10:04 pm Naslov sporočila: Interupti... |
|
|
Rad bi zmeril frekvenco nekega signala, ki ga dobim z rotorja motorja.
Signal peljem preko šmit trigerja, da je lepe oblike, na vhod pica PortB.6. Ta je še edini še edini prost na tem portu. Zadeva je na razvojni plati, ki ima na portB priključen LCD.
Nastavil sem, da signal na tem pinu generira interupt.
Drugi interupt generira še timer1. - vsakih 100ms
In potem zadevo zaženem. V interupt rutini preverim kateri interupt je sprožen - če je signal, števcu prištejem 1, ter zbrišem interupt, če je timer 1, vrednost števca prepišem v drugo spemenljivko, ki se potem prikaže na displeju, števec pa zbrišem prav tako interupt2.
Takole preko palca - ker motor ustvari 6000RPM, dobim z njega 100Hz, kar bi pomenilo, da bi moral števec prišteti nekje do 10. (0,1s/0,01s=10), prišteje pa do blizu 2000.
Ker mi nič ni bilo jasno, sem delovanje posameznega interupta preslikal na izhoda D in E in lepo meril z osciloskopom čas, oziroma frekvenco. Ugotovil sem, da je timer interupt izveden pravilno vsakih 100ms, signal ki ga dobim ob prekinitvi portaB pa je ena zmešnjava. Nič mi ni jasno...
Namesto, da bi dobil enih 10 pulzov, dobim nekakšne pakete podatkov, ki vsebujejo množico pulzov. Posamezen paket je sestavljen iz pravokotnega signala, ki ima precej stabilno frekvenco 40,32KHz. Pripenjam sliko.
Zelen signal je timer1, rumeni števec.
Ima kdo kašno idejo?
Takole zgleda interupt rutina, pa še nastavitve pica....
sub procedure interrupt
if intcon.RBIF=1 then ' each time motor turns 1 revolution
stevec=stevec+1 ' generates 1 interupt and increases stevec
intcon.RBIF=0
PortE= NOT PortE
end if
if Pir1.TMR1IF=1 then ' timer runs for 100ms
stevec_izpis = stevec ' counts number ov turns in that time
stevec = 0 ' clears stevec for another cycle
TMR1H = Timer_H ' preset for timer1 MSB register
TMR1L = Timer_L ' preset for timer1 MSB register
Pir1.TMR1IF = 0 ' Clear TMR1IF interupt
PORTD=NOT PORTD
end if
end sub
sub procedure InitMain
' 76543210
ANSEL = %00010000 ' AN4 (PortA.5 = A/D input)
ANSELH = %00000000 ' rest I/O
PORTA = %11111111 '
TRISA = %11111111 ' PORTA = input
PORTB = %01000000 ' PORTB = Output except PortB.6 -> counter
TRISB = %01000000 ' input - interupt
PORTC = %00000000 ' PORTC = output
TRISC = %00000000 '
PORTD = %00000000 ' PORTD =output
TRISD = %00000000 '
PORTE = %00000000 ' PORTE =output
TRISE = %00000000 '
ADCON1 = %00000000 '
ADCON0 = %10010000 '
T1CON = %00110001 ' T1CON setup
PIR1.TMR1IF = 0 ' Clear TMR1IF
PIE1 = %00000001 ' Enable Timer1 overfolw interupt
PIE2 = %00000000
INTCON = %11001000 ' Enable interupts + peripherial int. + portB change int.
IOCB = %01000000 ' Enable interupt on PortB.6
end sub
CPU=16F887 16MHz
| Opis: |
|
| Velikost datoteke: |
1.3 MB |
| Pogledana: |
39 krat |

|
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
| Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 22.60
|
Objavljeno: Sre Sep 30, 2009 10:12 pm Naslov sporočila: Re: Interupti... |
|
|
You English veri loše ?
V poglavju 3.4.3 datasheeta je jasno napisano kako se pravilno obravnava "interrupt on change". Zdaj se interrupt sprozi enkrat, ko motor da signalcek, potem pa se sproza v neskoncnost, ker nikoli ne resetiras stanja, ki interrupt povzroca.
_________________ Ka ti bo pa torba ce si kupu kolo ? |
|
| Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 16.33 Kraj: Črnuče
|
Objavljeno: Sre Sep 30, 2009 11:09 pm Naslov sporočila: |
|
|
Ma sem mislil da ukaz intcon.RBIF=0 zbriše RBIF zastavico v INTCON registru in ustvari pogoje za nov interupt. (vsaj moral bi)
Al pa res ne razumem? Pravi da bereš/ pišeš na port B ali pa zbirišeš RBIF, da odstraniš pogoj za interupt. Ali berem narobe?
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
| Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 22.60
|
Objavljeno: Čet Okt 01, 2009 8:32 am Naslov sporočila: |
|
|
| Highlag je napisal/a: |
| Ma sem mislil da ukaz intcon.RBIF=0 zbriše RBIF zastavico v INTCON registru in ustvari pogoje za nov interupt. (vsaj moral bi) |
To je nujen, ne pa tudi zadosten pogoj.
| Citiram: |
| Al pa res ne razumem? Pravi da bereš/ pišeš na port B ali pa zbirišeš RBIF, da odstraniš pogoj za interupt. Ali berem narobe? |
Beres narobe - nikjer ni nobenega 'ali'; narediti je potrebno a in b.
Racunalnistvo (MCUji so fizicno majhni racunalniki) je zelo eksaktna stvar. PICi so (v primerjavi z nekaterimi drugimi MCUji) zelo natancno dokumentirani, vse potrebne informacije za razvoj aplikacije pa so zbrane v enem samem dokumentu (datasheetu), torej je potrebnega samo dovolj "zicledra", da stvari delujejo
_________________ Ka ti bo pa torba ce si kupu kolo ? |
|
| Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 5.99 Kraj: Ljubljana
|
Objavljeno: Čet Okt 01, 2009 8:53 am Naslov sporočila: |
|
|
Problem pri uporabi interrupt on change je ta, da se tvoj port spreminja tudi ko oddajaš/sprejemaš na LCD.
Bolj varno bi bilo uporabljati INT/RB0. Če pa ne boš imel velikih frekvenc, pa lahko uporabiš CCP modul za merjenje le teh
|
|
| Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 22.60
|
Objavljeno: Čet Okt 01, 2009 10:03 am Naslov sporočila: |
|
|
| bungee je napisal/a: |
| Problem pri uporabi interrupt on change je ta, da se tvoj port spreminja tudi ko oddajaš/sprejemaš na LCD. |
Saj maskiras pine, za katere ncoes da jih obravnava za IOC.
_________________ Ka ti bo pa torba ce si kupu kolo ? |
|
| Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 16.33 Kraj: Črnuče
|
Objavljeno: Čet Okt 01, 2009 10:50 am Naslov sporočila: |
|
|
Če prav razumem bi moral opraviti še neko branje/pisanje dotičnega Pina na portu.
Interupti na ostalih pinih so maskirani z IOCB = %01000000
Malo je nerodno, ker imam na razvojni plošči LCD na portu B, drugače bi ga raje prestavil na kak drug port.
Žal z interupti nimam nič izkušenj. Strmim v datasheet že kakšen teden. In tole je nastalo iz mojega razumevanja.
CPP pride na vrsto, ko mi tole ne bo delovalo
Poročam popoldne če bo stanje popravljeno.
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
| Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 16.33 Kraj: Črnuče
|
Objavljeno: Čet Okt 01, 2009 7:01 pm Naslov sporočila: |
|
|
@Sokrat
Hvala! Imaš eno v dobrem. Piknik mogoče?
Dvomim, da bi tole rešil sam.... Če bi zadevo napisali malce bolj jasno nebi bilo nič narobe.
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
| Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 22.60
|
Objavljeno: Čet Okt 01, 2009 8:02 pm Naslov sporočila: |
|
|
| Highlag je napisal/a: |
@Sokrat
Hvala! Imaš eno v dobrem. Piknik mogoče?
Dvomim, da bi tole rešil sam.... Če bi zadevo napisali malce bolj jasno nebi bilo nič narobe. |
Saj je jasno napisano, samo razmisljati moras na enak nacin kot tisti, ki je to napisal. Res pise vse, zelo malo je stvari, ki bi bile napisane nejasno ali celo narobe, sploh ce je sel datasheet skozi vec iteracij (crka na koncu imena ti pri Microchipu pove iteracijo).
Upam, da bo to dobra vzpodbuda za v prihodnje in ja, en teden je zelo malo casa - jaz gledam datasheete od mikrokontrolerjev zadnjih 12 ali 13 let, pa jih moram vedno znova sproti.
_________________ Ka ti bo pa torba ce si kupu kolo ? |
|
| Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 16.33 Kraj: Črnuče
|
Objavljeno: Čet Okt 01, 2009 9:20 pm Naslov sporočila: |
|
|
Ja se strinjam.
Žal se z programiranjem in elektroniko premalo ukvarjam... Oziroma manj kot bi želel. Potem pa takšne neumnosti sprašujem . Se pa sigurno odločim za spraševanje na forumu šele potem ko res ne najdem rešitve. Po posvetovanju z datasheetom, pa še googlom....
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
| Nazaj na vrh |
|
 |
mannetou Član

Pridružen-a: Pet 08 Jan 2010 20:34 Prispevkov: 26 Aktiv.: 0.13 Kraj: LJ
|
Objavljeno: Sre Feb 23, 2011 1:31 pm Naslov sporočila: |
|
|
Si bom sposodil kar tole temo.
Torej. Za pic 16f886 sem spisal program (asembler), ki z timer1 gate funkcijo, preko komparatorja, zajema duty cycle pwm signala, duty cycle pa bi rad prikazal na dveh multipleksiranih 7 segmentnih prikazovalnikih. Ker zajemam signale tudi okoli 100Hz imam prekinitev nastavljeno vsakih cca. 30ms (T(tmr1)=2^16*4*Tosc= 32,768ms). To trajanje velja za 8MHz kristal, ki se mi je glede na ostale zahteve (AD pretvorba) zdel najprimernejši. Problem je, da se prekinitev izvaja v prevelikem intervalu, da bi lahko prikazoval širino impulzov na LED prikazovalnikih. S kodo v prekinitvi si torej ne morem pomagati, koda za prikaz v glavnem delu programa pa z zakasnitvami ne deluje tako kot mora (zaradi prekinitve?). Dodatna prekinitev s časovniki ne pride v upoštev, saj je za merjenje duty cycla nujno konstantno izvajanje prekinitve. Sicer tudi časovnikov nimam več na razpolago. Kako bi lahko rešil ta problem (razen z shift registri)?
Hvaležen bom za vsak nasvet. LP
Nazadnje urejal/a mannetou Sre Feb 23, 2011 3:05 pm; skupaj popravljeno 2 krat |
|
| Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14803 Aktiv.: 59.91
|
Objavljeno: Sre Feb 23, 2011 1:50 pm Naslov sporočila: |
|
|
Zdaj sem malo "zunaj" PIC-ov (navedenega pic-a ne poznam)
Torej koliko razumem dejansko prekinitev rabiš za multipleksiranje dispjeja? V prekinitvi pa vršiš še AD konverzijo. Problem pa nastane, ker ne moreš imeriti daljše periode zaradi prepogoste prekinitve.
Kaj pa, če timer uporabiš za meritev. Multipleksiranje izvedeš v zanki zunaj prekinitve. Prav tako lahko AD bereš zunaj prekinitve. Morebiti vključiš AD prekinitev.
_________________ lp
Silvo |
|
| Nazaj na vrh |
|
 |
mannetou Član

Pridružen-a: Pet 08 Jan 2010 20:34 Prispevkov: 26 Aktiv.: 0.13 Kraj: LJ
|
Objavljeno: Sre Feb 23, 2011 3:01 pm Naslov sporočila: |
|
|
Hvala za hiter odgovor. V programu deluje vse razen prikazovanja na 7 seg LED displej. V zanki zunaj prekinitve mi prikaz z zakasnitvami ne dela. Zakaj, ne vem. V prekinitvi pa ne morem prikazovati, ker se izvaja na tako dolg interval, da bi prikazovalnika utripala. Eden bi še šel, ker 1/32,768ms = cca. 30Hz, dva pa potem prikazuje z 15Hz kar za človeško oko utripa.
Ne vem ali sem še tako zelen, ampak problem pri multipleksiranem prikazu na 7seg LED displej imam vedno, ko spišem program s prekinitvijo in je le-ta namenjena nečemu drugemu kot prikazovanju. Ne razumem zakaj, prekinitev ne traja veliko ciklov in nisem pozabil na retfie. Je problem, ker se program prekine vedno na drugem mestu? Tudi AD pretvorba mi ne dela v glavnem programu (izven prekinitvene rutine). Mislim, da ni problem s stackom, to se mi dogaja tudi pri enostavnih programih. Za programiranje/debagiranje uporabljam ICD2.
Pic je 28 pinski, s sicer enakimi lastnostmi kot 40 pinski 16F887, ki je naslednik 16F877A, 16F886 pa naslednik 16F876A. V primerjavi ima pic nekaj nove periferije (gate funkcijo, enhanced CCP,...), drugače pa se ne razlikuje dosti.
Se opravičujem, če nisem bil povsem jasen glede mojega programa. Zajemam PWM signal, berem duty cycle (comparator + Timer1 Gate funkcija) in ga primerjam z DC vrednostjo izhodne napetosti vezja (AD pretvorba). Na izhod vplivam tako, da popravim izhodni PWM signal. Torej % duty cycle vhodnega PWM signala naj bi bil enak kot % vrednosti izhodne napetost v primerjavi z referenčno. Referenčna je enaka napajanju vezja, recimo 5V in če je vhodni PWM signal s trajanjem enke 20% periode, potem želim na izhodu 1V. Ker ostalo vezje ni povsem linearno, je potrebna korekcija.
Glavni del programa je v zanki. V njej sem prvotno mislil spisati AD pretvorbo, prikaz na LED, je pa zaenkrat samo generiranje izhodnega PWM signala. Ta zanka se izvaja ves čas, ko Timer1 z Gate funkcijo šteje trajanje enke PWM signala, ko čas poteče se izvede prekinitev in vrednost Timerja 1 se vpiše v registre. Nato se izvede še AD pretvorba in program se vrne nazaj v glavno zanko. Pri tem PICu funkcija Gate (Timer1 gate source), ne omogoča postavitve zastavice (prekinitve), ko je končana, zato za merjenje trajanja periode uporabljam Timer 0, ki je 8 biten z 1:256 prescale-om.
Torej glavna zanka se izvaja cca. 30ms, nato se sproži prekinitev, ki traja vsega le nekaj 10 ciklov, kar ne nanese niti 30us(mikro sekund) in potem se program iz prekinitve vrne v glavno zanko.
To je to. Upam, da sem bil bolj jasen, če ne lahko poskusim še v tretje.
Bistvo mojega problema je napisano v drugem odstavku.
|
|
| Nazaj na vrh |
|
 |
mucek4 Član


Pridružen-a: Sob 18 Jun 2005 20:52 Prispevkov: 2952 Aktiv.: 11.95 Kraj: Tržič - Mesto med gorami
|
Objavljeno: Čet Feb 24, 2011 2:14 pm Naslov sporočila: |
|
|
| Če tvoj projekt ni skrivnost lahko prideš do mene (30min z avto) in pogledava. Čez vikend sem verjetno doma.
|
|
| Nazaj na vrh |
|
 |
mannetou Član

Pridružen-a: Pet 08 Jan 2010 20:34 Prispevkov: 26 Aktiv.: 0.13 Kraj: LJ
|
Objavljeno: Čet Feb 24, 2011 9:44 pm Naslov sporočila: |
|
|
Najlepša hvala za ponudbo. Če ne bo druge rešitve se res uglasim. Sicer program ni nobena skrivnost in ga lahko tudi pošljem.
V glavnem mi dela probleme samo ena stvar in to je nedelovanje multipleksiranega prikazovanja na 7seg LED. Prikazovanje mi deluje v programu brez vsakršnih prekinitev, ali s prekinitvami, ki so namenjene prikazovanju (timer->izpis). Zakaj ne deluje izven prekinitvene rutine v glavnem delu programa? Konec koncev je le vklapljanje in izklapljanje portov. Zakaj ena prekinitev tako zmede mikrokontroler, da potem ne more več vklapljati LED? Je to splošen problem ali samo sam počnem kaj narobe? Verjetno je kdo že naletel na to težavo. Na internetu pa tud ne najdem nič uporabnega v zvezi s tem problemom.
|
|
| Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 233 dni
Powered by phpBB © 2001, 2005 phpBB Group
|