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

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Čet Jan 08, 2004 9:35 am Naslov sporočila: Prekinitve - kaj delam narobe???? |
|
|
Na kratko... Delam podobno zadevscino, kot se je z njo igral ze Silvo, s tem da je zraven vkljucena se rutina regulacije in vklopa z daljincem...
Zdaj pa k problemu... Ne vem zakaj mi zadeva ne stece kot imam planirano. Zelel bi namrec da me ob doloceni rutini prekinitev ne sme zmotit, a kljub temu zadeva ne spila...
Citiram: |
napaka
clrwdt
bcf status,rp0 ; dostopas prave do banke
bcf intcon, gie ; ne dovolis da te vmes kaj moti
bsf portb,led_n
call a
call a ; cca.1 sekunda
call a
bcf portb,led_n
call a
call a
call a
bsf portb,led_n
call a
call a
call a
bcf portb,led_n
call a
call a
call a
bcf intcon, t0if ; pobrises mozne ostale flage za interupt
bcf intcon, intf
bsf intcon, gie ; ponovno omogocis interupt
bsf status,rp0
goto start |
No to je napisana rutina... Kaj je tukaj narobe?
Vase mnenje?
No se to! A lahko v prekinitveni rutini klices nek podprogram? In koliko nivojske prekinitve lahko imas na 16F84 (saj veste: call nekaj, v zanki pa imas ponovno call)
Primer:
call a
call b
call c
Drejc |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jan 08, 2004 10:04 am Naslov sporočila: |
|
|
Drejc,
Iz prekinitve lahko kličeš podprogram 16F84 ima 8 nivojski hardwerski sklad.
Kaj bi bilo lahko narobe ?
Začetek programa !??
Koda: |
bcf INTCON, GIE ;tukaj se naj bi prekinitve izključile
btfsc INTCON,GIE ;so se res - ni bila vmes mogoče ravno prekinitev
goto $-2 ;če ne ponovimo
............
|
Zakaj se na koncu mapiraš na stan 1 ? Tudi to zna biti problem
Večina stalno uporabnih registrov je na Bank0
lp
Silvo |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Čet Jan 08, 2004 12:33 pm Naslov sporočila: x |
|
|
Silvo hvala za namig...
Bom probal se danes tokom dneva in porocal o rezultatih... Ko pravis naj preverim ce ne "naletim" ponovno na prekinitev... Ne vem... Quartz imam 4MHz, tako da vecina instrukcij traja 1us in da bi ravno takrat naletel na prekinitev... Perioda prekinitve je 10 ms kar pa je napram reda usekundam se vedno ogromno... Najbolj me moti to, da v prekinitev sicer skoci in prizge LED, samo ne izvede celotne procedure do konca (tisto zmikanje ledike) kljub brisanju bita GIE... Me morda jezi WDT? Sicer ga brisem vsakic se preden se istece perioda 18ms...
No kot receno bom se porocal danes...
LP Drejc |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jan 08, 2004 12:54 pm Naslov sporočila: |
|
|
Ne razumem tega najbolje. V čem je problem izvajanje rutine v prekinitvi ali izven nje. Torej del kode ki jo imaš napisene izključi prekinitev. Ko je le ta izključena se ne more izvajati več ničesar pisano v prekinitveni rutini. Vidim, da brišeš tudi WDT. Kaj če ti procesor pada v WDT reset ? Poskusi brez WDT-ja. Boč videl, če se zazanka.
P.S.
Instrukcijo "clrwdt" ni priporočljivo .oz preveč smiselno uporabljati v prekinitveni rutini. Naj bo le v glavnem programu oz. kakih časovnih zakasnitvah.
Daj pripni še del kode samega začetka prekinitvene rutine.
lp
Silvo |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Čet Jan 08, 2004 1:05 pm Naslov sporočila: x |
|
|
Da bi mi padal v reset zaradi WDT-ja dvomim (ceprav ne bom trdil da se to ne dogaja ), ker ga brisem med zankami, ki predstavljajo nek casovni zamik (cakanje na naslenji impulz), ki je daljsi od 18ms.
Brez WDT-ja mislim da se zazanka, oz. vsaj ne dela cisto tako kot bi moral....
Kodo bom pripel samo da pridem do racunala!
Omenjas da ga ni dobro uporabljati v prek.rutini... Lahko komentiras zakaj?
Drejc |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jan 08, 2004 2:22 pm Naslov sporočila: |
|
|
Nekaj je narobe WDT je le "varovalo" ob eventuelnem primeru, da program zaradi neznanega vzroka "zaide" s prave poti. Vzrok za to so lahko zunanji vplivi -napake zaradi "onesnaženega" okolja, softwerska napaka katera je lahko mimoge taka da se pojavi mogoče vsakih "100 let" ...
Del prekinitvene rutine sem hotel videt zato, da vidim že shranjuješ status ter W register.
primer "pravilne" kode:
Koda: |
IRQ_RUTINA
movwf WTMP ;shranem W register
swapf STATUS,W ;instrukcijo "swapf" uporabim ker ne vpliva na statusne bite
movwf STMP
btfsc INTCON,T0IF ;tukaj preverjam vstro prekinitve
goto TMR0_IRG ;bila je TMR0 prekinitev
;tukaj s kodo nadaljujem če imam vključenih več prekinitev ter ;ugotavljam vrsto le te
....................
....................
IRQ_END
swapf STMP,W
movwf STATUS ;vrnem status v stanje pred prekinitvijo
swapf WTMP,F
swapf WTMP,W ;vrnem še W
retfie ;nazaj na glavno rutino
|
lp
Silvo |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Čet Jan 08, 2004 2:55 pm Naslov sporočila: |
|
|
Tako imam napisano prek. rutino:
Citiram: |
;************************************
; PREKINITEV
;************************************
isr
movwf temp_w ; shrani vsebino AKU v temp_w
movf status,w ; w = status
movwf temp_s ; shrani status register v temporary
btfss intcon,intf ; preskoci ce prekinitev res externa
goto interni
; externa (postavo se je intf bit, ki ga mors brisat)
bcf status,rp0 ; zdaj bos vpisoval v tmr0
clrf tmr0 ; ga pobrises
movf _tmr0,w ; to kar imas shranjeno od tipke daj v pravi tmr0
movwf tmr0 ; prizge led (256-60=190) 190*64us=12160us=12,1m po prehodu skozi nulo
bsf status,rp0 ; se vrnes v 2 banko
bcf portb,zelena ; led naj bo vgasnjena
bcf intcon,intf ; sedaj pobrisi bit za ext interupt (vmes se ne pustis motit!!!)
; bcf intcon, t0if ; pobrisi bit tmr0 (drugace bo spet sprozil timer int)
; bsf intcon, t0ie ; postavi bit za timer interupt
goto isr_end ; gres ven iz prekinitev
interni ; tmr0 interupt se generira ob overflovu stevca iz ff na 00.ob tem se postavi bit t0if!
; stevec se poveca vsak instrukc. cikel se pravi vsako 1usekundo
; pazi na to kaksen prescaler imas v option reg. 1:64
btfss intcon,t0if ; preskoci ce je postavljen bit za interni interupt (kontrola)
goto isr_end ; idi ven s prekinitve
bsf portb,zelena ; zdaj pa prizgi led
bcf intcon,t0if ; brisi flag za interni interupt, ki se postavi
isr_end
movf temp_s,w ; premakni temp_s v AKU
movwf status ; AKU daj nazaj v status (obnovis statusni register)
swapf temp_w,f ;zamenjaj polovicko byta v temp_w
swapf temp_w,w ;zamenjaj polovicko byta v temp_w nazaj in shrani v AKU
retfie ; se vrne iz prekinitve in postavi gie bit, kar omogoci ponovni interupt
|
Zdaj pa grem dopolnit zadevo s tvojimi predlogi. Bom porocal o zadevi!
Drejc |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Čet Jan 08, 2004 3:19 pm Naslov sporočila: |
|
|
No zadeva je sledeca...
Ze ob vklopu vezja na napajanje mi zadeva skoci v prekinitev in ne pridem vec ven...
Fora je ravno v tem da imam zadevo zamisljeno tako, jo vklapljam z daljincem. No kodo in vse lepo preberem samo ta PWM regulacija mi dela preglavice...
Drejc |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jan 08, 2004 3:21 pm Naslov sporočila: |
|
|
Drejc,
V tvoji kodi sem označil z ;/// tisto kar mislim, da ti dela težave
Koda: |
************************************
; PREKINITEV
;************************************
movwf temp_w ; shrani vsebino AKU v temp_w
movf status,w ; w = status ;///uporabi ukaz swapf movwf vpliva na statusni bit »Z«///
movwf temp_s ; shrani status register v temporary
btfss intcon,intf ; preskoci ce prekinitev res externa
goto interni
; externa (postavo se je intf bit, ki ga mors brisat)
bcf status,rp0 ; zdaj bos vpisoval v tmr0
clrf tmr0 ; ga pobrises ;///tole ni potrebno///
movf _tmr0,w ; to kar imas shranjeno od tipke daj v pravi tmr0
movwf tmr0 ; prizge led (256-60=190) 190*64us=12160us=12,1m po prehodu skozi nulo
bsf status,rp0 ; se vrnes v 2 banko ;////zakaj na bank 1 ??? tukaj bo glavni problem ///
bcf portb,zelena ; led naj bo vgasnjena ;///si na bank1 tam je register TRISB ne PORTB !!!///
bcf intcon,intf ; sedaj pobrisi bit za ext interupt (vmes se ne pustis motit!!!)
; bcf intcon, t0if ; pobrisi bit tmr0 (drugace bo spet sprozil timer int)
; bsf intcon, t0ie ; postavi bit za timer interupt
goto isr_end ; gres ven iz prekinitev
interni ; tmr0 interupt se generira ob overflovu stevca iz ff na 00.ob tem se postavi bit t0if!
; stevec se poveca vsak instrukc. cikel se pravi vsako 1usekundo
; pazi na to kaksen prescaler imas v option reg. 1:64
btfss intcon,t0if ; preskoci ce je postavljen bit za interni interupt (kontrola)
goto isr_end ; idi ven s prekinitve
bsf portb,zelena ; zdaj pa prizgi led
bcf intcon,t0if ; brisi flag za interni interupt, ki se postavi
isr_end
movf temp_s,w ; premakni temp_s v AKU ;/// uporabi »swapf« glej moj primer ///
movwf status ; AKU daj nazaj v status (obnovis statusni register)
swapf temp_w,f ;zamenjaj polovicko byta v temp_w
swapf temp_w,w ;zamenjaj polovicko byta v temp_w nazaj in shrani v AKU
retfie ; se vrne iz prekinitve in postavi gie bit, kar omogoci ponovni interupt
|
lp
Silvo |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Čet Jan 08, 2004 4:27 pm Naslov sporočila: |
|
|
Kodo sem popravil kot si mi svetoval pa se vedno ni nekega "haska" ...
Bolj kot razmisljam, bolj imam obcutek da je tezava v tem, da sploh ne dam moznosti sprejemniku da prebere kodo, ki jo poslje daljinec. To sklepam zato ker mi kar nonstop utripa lucka, katere naloga je s pomocjo PWM-a dolocat svetilnost. Sem preveril se z osciloskopom in videl da je duty time cca. 50% (interupt simuliram kar s timerjem 555, cca. vsakih 100 ms), ampak dioda ne sveti konstantno s polovicno mocjo ampak "utripa". Ce bi slabse svetila bi vsaj vedel da mi PWM deluje pravilno, tako pa...
No ko spremljam zadevo preko osciloskopa je razvidno da impulzi niso periodicni (duty sicer je cca. 50), ampak jih nekaj vsakih toliko casa "zmoti", poresetira....
Tezavo osebno vidim ravno v temu, da bi istocasno moral "brat" kaj mi posilja daljinc (sekvenca je dolga cca 25 ms) in to usklajevat z prekinitvami, ki so na voljo za prozenje triaka.
Problem je skratka ker se vse odvija tako prekl*to hitro da brez osciloskopa ne moras spremljat zadev...
Se to... Ko sva debatirala o brisanju GIE bita ce je koda napacna...
Problem bi najbrz nastal, ker takrat ne mores izvajat prozenja triaka in s tem ne vem kaj se zgodi s svetilnostjo bremena... Za napacno kodo sem simuliral 2 utripa led diode, ki pa trjata cca. sekundo. No vmes "prileti" ze vsaj 10 prekinitev, ki bi morale prozit triak...
Bom jutri pripel kodo pa bomo videli kaj pocnem narobe
No upam da nisem prevec zakompliciral... Bo bolj jasno ko bo vidna koda...
Hvala zaenkrat....
Drejc |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Pet Jan 09, 2004 8:55 am Naslov sporočila: |
|
|
Citiram: |
ERRORLEVEL -302
org 0x00 ; Reset vektor..
goto ini ; ..ob zagonu procesorja preusmeri izvajanje kode na zacetek glavnega programa
org 0X04 ; Prekinitveni vektor..
goto isr ; skoci sem ob prekinitvi
org 0x05 ; Na tej lokaciji se zacne tvoj program
goto start
;****************************************************************
;* Inicializacija I/O *
;****************************************************************
ini
movlw b'00000000' ; definiras stanje na portu A
movwf porta ; vneses to not (vhod naj se obnasa kot register)
movlw b'00000000' ; definiras stanje izhodov na portu B
movwf portb ; vneses to not (vhod naj se obnasa kot register)
bsf status,rp0 ; dostopas do SRAM-a (konfiguriras direktion register-banka 0)
movlw b'00001101' ; PORTI Z 1 SO DEFINIRANI KOT VHOD, Z NULAMI KOT IZHOD
movwf trisa ; vneses to not (port naj se obnasa kot izhod)
movlw b'00000001' ; kateri izhod porta B naj bo aktiven (VSI)
movwf trisb ; vneses to not (port naj se obnasa kot izhod)
bcf status,rp0
movlw b'10110000'
movwf intcon
clrf tmr0
bsf status,rp0
clrwdt
movlw b'0101' ; prescaler NI dodeljen wdt, poresetira se vsakih 18msekund !!!!!!
movwf option_reg ; prescaler je dodeljen tmr0 (1:64) vsakih 64 us sekund se poveca
bcf status,rp0
;________________________________
start
bsf porta,led_rd ; rdeca led gori (nic ne dogaja)
call a ; da sfiltriras motnje
;adresa
movlw d'6' ; 1+6=7 x bos shiftal (zato ker ze enkrat shiftas preden se zanka izvaja)
movwf naslov_adrese ; shrani (7 bitov je S+T+ adresa)
;podatki
movlw d'6' ; 1+5=6 x ponovis zanko stevilo bitov ki jih je treba shranit (6 bitov je podatkov)
movwf vsebina ; za 2 jo je treba pomaknit!!! 7
clrf adresa ; pobrisi oba registra
clrf pod
clrf status ; mora bit pod nujno, drugace se mu sfeclja!!!!!
cakaj
clrwdt ; mora bit ker drugace caka in se prej iztece in poresetira
btfsc porta,tipka ;2 ce je tipka na 0 (sprejemas kodo),preskoci naslednjo instrukcijo, drugac ponavljaj
goto cakaj
bcf porta,led_rd ;1 vgasni rdeca led (sprejem zacel)
call pavza_1335 ;2 klici zakasnitev
; NO TUKAJ GRE SKOZI PROCEDURA ZA SPREJEM KODE DALJINCA
; TUKAJ PA PREVERJAM CE JE POSLANA KODA PRAVA IN CE JE SLEDIJO PAC NEKI UKREPI (PRIZIGANJE, UGASANJE IN NAJBOLJ VAZNO REGULACIJA)
ledika_1
movf pod,w ; ce si stisno daj vsebino pod v aku
sublw vz_4 ; vsebino akumulatorja odstej od vz_2 in vpisi nazaj v aku
btfss status,z ; je rezultat 0, potem je data tapravi, skoci ce je 1
goto ledika_2 ; koda je drugacna-gre za drugo napravo
; TUKAJ PREVERI STANJE LED
btfsc portb,rumena ; preskoci ce je vgasnjena
goto off_rumena
bsf portb,rumena ; FUll prizgi lucko
;*****************
;* do sem OK
;*****************
ledika_2
movf pod,w ; ponovno nalozi pod v aku
sublw vz_2 ; vsebino akumulatorja odstej od vz_2 in vpisi nazaj v aku
btfss status,z ; je rezultat 0, potem je data tapravi
goto ledika_3 ; koda je drugacna-gre za drugo napravo
movlw d'100' ; vnesi parameter svetilnosti
movwf _tmr0 ; shrani to na lokacijo
goto start ; idi na zacetek
; TUKAJ JE PONOVLJENA PROCEDURA ZA LED_3 IN CE KONTROLER NE NAJDE KODE KI JE VPISANA TUKAJ POTEM RECE DA GRE ZA FELER IN GRE NA NAPAKO
off_rumena
bcf portb,rumena ; za ziher vgasnes
goto start
; NO IN TUKAJ ME GROZNO JEZI!
; ZAKAJ NE SPELJE CELOTNE NAPISANE PROCEDURE
napaka
clrwdt
bcf intcon, gie ; ne dovolis da te vmes kaj moti
btfsc intcon,gie
goto napaka
bsf portb,led_n
call a
call a ; cca.0,6 sekunde
call a
bcf portb,led_n
call a
call a
call a
bsf portb,led_n
call a
call a
call a
bcf portb,led_n
call a
call a
call a
bcf intcon, t0if ; pobrises mozne ostale flage za interupt
bcf intcon, intf
bsf intcon, gie ; ponovno omogocis interupt
goto start
;************************************
; PREKINITEV
;************************************
; TAKO IMAM OPISANO PROCEDURO PREKINITVE IN PWM-A
; V OSNOVI SEM RAZMISLJAL TAKO...
; KO BOS ZAZNAL PREKINITEV (EXTERNO) ZAZENI INTERNI TIMER (TMR0) IN PO IZTEKU LE-TEGA PRIZGI LED
isr
movwf temp_w ; shrani vsebino AKU v temp_w
swapf status,w
movwf temp_s ; shrani status register v temporary
btfss intcon,intf ; preskoci ce prekinitev res externa
goto interni
; externa (postavo se je intf bit, ki ga moras brisat)
bcf status,rp0 ; zdaj bos vpisoval v tmr0
; clrf tmr0 ; ga pobrises
movf _tmr0,w ; to kar imas shranjeno od tipke daj v pravi tmr0
movwf tmr0 ; prizge led (256-60=190) 190*64us=12160us=12,1m po prehodu skozi nulo
bcf portb,zelena ; led naj bo vgasnjena
bcf intcon,intf ; sedaj pobrisi bit za ext interupt (vmes se ne pustis motit!!!)
goto isr_end ; gres ven iz prekinitev
interni ; tmr0 interupt se generira ob overflovu stevca iz ff na 00.ob tem se postavi bit t0if!
; stevec se poveca vsak instrukc. cikel se pravi vsako 1usekundo
; pazi na to kaksen prescaler imas v option reg. 1:64
btfss intcon,t0if ; preskoci ce je postavljen bit za interni interupt (kontrola)
goto isr_end ; idi ven s prekinitve
bsf portb,zelena ; zdaj pa prizgi led
bcf intcon,t0if ; brisi flag za interni interupt, ki se postavi
isr_end
swapf temp_s,w ; premakni temp_s v AKU
movwf status ; AKU daj nazaj v status (obnovis statusni register)
swapf temp_w,f ;zamenjaj polovicko byta v temp_w
swapf temp_w,w ;zamenjaj polovicko byta v temp_w nazaj in shrani v AKU
retfie ; se vrne iz prekinitve in postavi gie bit, kar omogoci ponovni interupt
; TIMERJI
; ZANK ZA CASOVNIKE NISEM DODAJAL... SO PA VNESENI KOT PAVZE MED POSAMEZNIMI BITI OB SPREJEMU....
end
|
Tako
Zdaj sem dodal kodo... Pa bi prosil struckote za kaksen nasvet kaj delam tukaj narobe...
LP
Drejc |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pet Jan 09, 2004 11:25 am Naslov sporočila: |
|
|
Si bom zvečer vzel čas pa stvar analiziral. Taka stvar vzame več časa kot bi kaj na novo pisal
lp
Silvo |
|
Nazaj na vrh |
|
 |
Drejc Član

Pridružen-a: Čet 27 Nov 2003 12:21 Prispevkov: 13 Aktiv.: 0.05 Kraj: MB
|
Objavljeno: Pet Jan 09, 2004 11:38 am Naslov sporočila: |
|
|
Ja Silvo, vljudno prosim, ce ti je...
Tudi sam sem ze ugotovil, da je najveckrat lazje zadevo na novo napisat, he, he...
Se bom oddolzil...
Drejc |
|
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: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|