www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Interupti...
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 16.33
Kraj: Črnuče

PrispevekObjavljeno: Sre Sep 30, 2009 10:04 pm    Naslov sporočila: icon_question Interupti... Odgovori s citatom

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



osciloskop3.jpeg
 Opis:
 Velikost datoteke:  1.3 MB
 Pogledana:  39 krat

osciloskop3.jpeg



_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 22.60

PrispevekObjavljeno: Sre Sep 30, 2009 10:12 pm    Naslov sporočila: icon_question Re: Interupti... Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 16.33
Kraj: Črnuče

PrispevekObjavljeno: Sre Sep 30, 2009 11:09 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 22.60

PrispevekObjavljeno: Čet Okt 01, 2009 8:32 am    Naslov sporočila:   Odgovori s citatom

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 Wink

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 5.99
Kraj: Ljubljana

PrispevekObjavljeno: Čet Okt 01, 2009 8:53 am    Naslov sporočila:   Odgovori s citatom

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 Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 22.60

PrispevekObjavljeno: Čet Okt 01, 2009 10:03 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 16.33
Kraj: Črnuče

PrispevekObjavljeno: Čet Okt 01, 2009 10:50 am    Naslov sporočila:   Odgovori s citatom

Č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 Whistle

Poročam popoldne če bo stanje popravljeno.

_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 16.33
Kraj: Črnuče

PrispevekObjavljeno: Čet Okt 01, 2009 7:01 pm    Naslov sporočila:   Odgovori s citatom

@Sokrat

Hvala! Imaš eno :lasko: 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 22.60

PrispevekObjavljeno: Čet Okt 01, 2009 8:02 pm    Naslov sporočila:   Odgovori s citatom

Highlag je napisal/a:
@Sokrat

Hvala! Imaš eno :lasko: 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 16.33
Kraj: Črnuče

PrispevekObjavljeno: Čet Okt 01, 2009 9:20 pm    Naslov sporočila:   Odgovori s citatom

Ja se strinjam.

Žal se z programiranjem in elektroniko premalo ukvarjam... Oziroma manj kot bi želel. Potem pa takšne neumnosti sprašujem Smile. 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
mannetou
Član
Član



Pridružen-a: Pet 08 Jan 2010 20:34
Prispevkov: 26
Aktiv.: 0.13
Kraj: LJ

PrispevekObjavljeno: Sre Feb 23, 2011 1:31 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14803
Aktiv.: 59.91

PrispevekObjavljeno: Sre Feb 23, 2011 1:50 pm    Naslov sporočila:   Odgovori s citatom

Zdaj sem malo "zunaj" PIC-ov Confused (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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mannetou
Član
Član



Pridružen-a: Pet 08 Jan 2010 20:34
Prispevkov: 26
Aktiv.: 0.13
Kraj: LJ

PrispevekObjavljeno: Sre Feb 23, 2011 3:01 pm    Naslov sporočila:   Odgovori s citatom

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. Smile
Bistvo mojega problema je napisano v drugem odstavku.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek4
Član
Član



Pridružen-a: Sob 18 Jun 2005 20:52
Prispevkov: 2952
Aktiv.: 11.95
Kraj: Tržič - Mesto med gorami

PrispevekObjavljeno: Čet Feb 24, 2011 2:14 pm    Naslov sporočila:   Odgovori s citatom

Če tvoj projekt ni skrivnost lahko prideš do mene (30min z avto) in pogledava. Čez vikend sem verjetno doma.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mannetou
Član
Član



Pridružen-a: Pet 08 Jan 2010 20:34
Prispevkov: 26
Aktiv.: 0.13
Kraj: LJ

PrispevekObjavljeno: Čet Feb 24, 2011 9:44 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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