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

Pridružen-a: Čet 15 Jan 2009 20:44 Prispevkov: 14 Aktiv.: 0.07 Kraj: IL. BISTRICA
|
Objavljeno: Čet Jan 15, 2009 9:13 pm Naslov sporočila: PIC16F84A PREKINITVE Rb4-Rb7 |
|
|
Pozdravljeni!
Izdelati nameravam temperaturni regulator.
Željeno temp. bi nastavil s tipkama na pinih rb5 in rb6, potrditev nastavljene temp. pa s tipko na rb7. Pritisk na katerokoli tipko, bi sprožil prekinitev. V prekinitvi bi nastavljal željeno temp in previrjal tipko na rb7, ko bi bila pritisnjena. bi zapustil prekinitveni program.
Zadeva deluje vendar, se nonstop vračam v prekinitev. Ko pritisnem tipko na Rb7 za izhod se postavi bit detekcije spremembe na vhodih RBIF v INTCON reg in ga v glavnem programu ne morem pobrisat. Zato se nonstop vračam v prekinitev.
Kaj delam narobe, ali je kaka finta pri prekinitvah, ali sem si vse skupaj narobe zamislil? |
|
Nazaj na vrh |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.35 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Čet Jan 15, 2009 9:35 pm Naslov sporočila: |
|
|
Po moje je nekaj v teh pinih RB6 in RB7, ker sta dva namenjena programiranju MCU-ja je lahko zato problem, lahko bi prebral datasheet ter kaj več o teh dveh pinih!
Mislim da je nekaj na tem! _________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Čet Jan 15, 2009 10:08 pm Naslov sporočila: |
|
|
Debouncing imaš narejen? V nasprotnem primeru lahko dobiš z enim pritiskom na stikalo več prekinitev. _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
gkrusi Član



Pridružen-a: Tor 24 Jul 2007 17:22 Prispevkov: 811 Aktiv.: 3.72 Kraj: Ptuj
|
Objavljeno: Pet Jan 16, 2009 12:03 am Naslov sporočila: |
|
|
Če se ti prekinitev pojavlja cel čas pritiska na tipko, bi lahko shranil prejšnje stanje tipk in če ni spremembe ignoriraš prekinitev.
Mora pa bit verjetno kaka pravilnejša rešitev. _________________ Zakaj bi bilo preprosto, če je lahko zakomplicirano??? |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pet Jan 16, 2009 12:24 am Naslov sporočila: |
|
|
Pripni kodo, da vidimo. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
TEODOR Član

Pridružen-a: Čet 15 Jan 2009 20:44 Prispevkov: 14 Aktiv.: 0.07 Kraj: IL. BISTRICA
|
Objavljeno: Pet Jan 16, 2009 12:26 am Naslov sporočila: |
|
|
Hvala za odgovore.
Zelo čudne stvari se mi dogajajo.
Mi zna kdo povedat kje je razlika. V prekinitvi postavimo indikator prekinirve
bsf INDIKATOR,0. Če se prekinitev ne zgodi se nebi smelo nič zgodit, ali ne?
MOVLW D'5'
MOVWF KROZENJE2
ODSTEVA2
BTFSC INDIKATOR,0 ;ČE BIT NI POSTAVLJEN PRESKOČIMO
GOTO Glavni1
decfsz KROZENJE2,1
goto ODSTEVA2
goto Glavni
Če izločimo (;BTFSC INDIKATOR,0 ;GOTO Glavni1) deluje, če ne, ne deluje |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pet Jan 16, 2009 12:33 am Naslov sporočila: |
|
|
Tukaj ne vidim kake prekinitvene rutine.
Prekinitveni vektor pri pic-ih je na lokaciji 0x4. Tam je potrebno prekinitev "prestreči"
z Goto ... V koliko je v rabi več prekinitev je treba ugotovit katera se je zgodila ter tok programa ustrezno preusmerit na ustrezno rutino. Predhodno je NUJNO potrebno shraniti STATUS ter W register katerega preden prekinitev zapustimo vrnemo. Prekinitev se zaključi z ukazom RETFIE. Sklad pri pic-ih je hardwerski 8 nivojski. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
TEODOR Član

Pridružen-a: Čet 15 Jan 2009 20:44 Prispevkov: 14 Aktiv.: 0.07 Kraj: IL. BISTRICA
|
Objavljeno: Pet Jan 16, 2009 12:42 am Naslov sporočila: |
|
|
Živjo!
Tukaj je koda od prej: |
|
Nazaj na vrh |
|
 |
TEODOR Član

Pridružen-a: Čet 15 Jan 2009 20:44 Prispevkov: 14 Aktiv.: 0.07 Kraj: IL. BISTRICA
|
Objavljeno: Pet Jan 16, 2009 12:47 am Naslov sporočila: |
|
|
Oprosti ne znam dodati priponke.
Koda: |
list p=16f84
#include <p16f84.inc>
__CONFIG _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON
Cblock 0x0C ; Deklaracija spremenljivk (konstant)
;IZPIS : 3 ; 16-biten podatek za izpis
KROZENJE1, KROZENJE2
PREK_TIPKA ;INDIKATOR PREKINITVE TIPK
INDIKATORS7
IZPIS, IZPIS1, IZPIS2
Stev_BIT ; Stevec poslanih bitov
Stevec ; Stevec za izpis na zaslon
ENICE, DESETICE, DECIMALKE ; Enice in desetice za izpis na zaslon
Mux ; Spremenljivka za multipleks
W_reg, Stat_reg ; Zacasne spremenljivke za pomembne registre
Work, Stat
Cas ; Spremenljivka za stetje casa
Nicla ; Indikator nicle
Zacasna ; Zacasna spremenjlivka za Stevec
INDIKATOR
;++++++++
VREDNOST
PREDZNAK
PRESCALER ;nastavitev koraka števca (OPTION Bit_0,1,2)
KROZENJE ;nastavitev števila prekoračitev števca
TIMER ;nastavitev začetne vrednosti števca
;IZPIS ; Spremenljivka za izpis na PORTB
IOBYTE
TMP ; Address 0x23
COUNT ; Keep track of bits
;PICMSB ; Store the MSB
;PICLSB ; Store the LSB
PDBYTE ; Presence Detect Pulse
INDIKATOR_T, INDIKATOR_P
STEVKA
ENDC
;++++++++
; Assign the PORTB with Constants
constant DQ=0 ; Use RB0 (pin7) for 1-Wire
;--------------------------------------------------------
; These constants are standard 1-Wire ROM commands
constant SRCHROM=0xF0
constant RDROM=0x33
constant MTCHROM=0x55
constant SKPROM=0xCC
constant CONVT=0x44
constant RDSCR=0xBE
constant CELO=d'0'
constant DEC=d'5'
;---------------------------------------------------------
STEVILKA equ d'18'
Naslov equ 0x0c ; Naslov podatka v EEPROM-u
Podatek equ 0x0d ; Podatek za vpis ali branje
Treset equ d'70'
SER EQU 2 ; SER linija je na RB2
SCK EQU 3 ; SCK linija je na RB3
RCK EQU 4 ; RCK linija je na RB4
;---------------------------------------------------------------
PARAM_V_EE equ 0x2130 ; Naslov podatka v EEPROM-u
UGASNI EQU d'11' ;ŠTEVILKA LOKACIJE ZA ZNAK ZA UGASNJEN DISPLEJ
T1 EQU d'20'
T2 EQU d'21'
KP EQU 1
KI EQU 0
KD EQU 1
ST_LOKACIJ EQU d'5'
ORG PARAM_V_EE ;0x2130 - Naslov podatka v EEPROM-u
DE T1, T2, KP, KI, KD
;#include <MAKRO1_3.INC>
org 0x000 ; Reset vektor
goto Glavni ; Skok na glavni program
org 0x004 ; Prekinitveni vektor
goto Prekinitev
;********************* PREKINITVENI PODPROGRAM ***************************
;#include <1W_16F84A1.INC>
Prekinitev ; Prekinitvena rutina
bcf INTCON,GIE ; Onemogocimo prekinitve
movwf W_reg ; Shranimo register W
swapf STATUS,w
movwf Stat_reg ; Shranimo register STATUS
CLRF VREDNOST
CLRF PREDZNAK
bcf STATUS,RP0 ; Banka 0
; ; Ugotovimo izvor prekinitve
; btfsc INTCON,T0IF ; Ali je izvor timer?
; goto Timer ; Da, obdelaj prekinitev
btfsc INTCON,RBIF ; Ali je izvor RB7 - RB4?
goto Port ; Da, obdelaj prekinitev
goto IZHOD ; Ne, zapusti rutino
Port
clrf INTCON
BSF INDIKATOR_P,0
BSF STATUS,RP0 ; Select Bank 1 of data memory
clrf TRISA ; PORTA je izhodni port
; Tukaj vstavimo rutino za prekinitev RB7 - RB4
bcf STATUS,RP0 ; Banka 0
BTFSS PORTB,5 ;(če TIPKA NI PRITISNJENA PIN=1 preskočimo)
goto TIPKA_PLUS
BTFSS PORTB,6 ;(če TIPKA NI PRITISNJENA PIN=1 preskočimo)
goto TIPKA_MINUS
goto PRIKAZ
TIPKA_PLUS
BSF PORTA,2
MOVLW ST_LOKACIJ
SUBWF STEVKA,0 ;VREDNOST REG W ODŠTEJEMO OD REG ŠTEVKA
BTFSS STATUS,Z ;če se poszavi z preskočimo
INCF STEVKA,1 ;POVEČAMO STEVKO
GOTO ROT
MOVLW d'1'
movwf STEVKA
goto PRIKAZ
TIPKA_MINUS
BCF PORTA,2
DECFSZ STEVKA,1 ;ZMANJŠAMO STEVKO ČE JE REZ =0 PRESKOČIMO
GOTO ROT
MOVLW ST_LOKACIJ
movwf STEVKA
PRIKAZ
BCF PORTA,3
ROT
CLRW
rlf STEVKA,0 ;ROTIRAMO JO V LEVO, V WREG (ZARADI MAKROJA ZA IZPIS - Pisi)
movwf VREDNOST ; ZAMAKNJENO SHRANIMO V VREDNOST, KI JE VHODNI PODATEK ZA IZPIS
bcf STATUS,RP0 ; Banka 0
BTFSS PORTB,7 ;(če TIPKA NI PRITISNJENA PIN=1 preskočimo)
goto IZHOD
;goto IZHOD
goto Port
IZHOD
BSF INDIKATOR,0 ;POSTAVIMO INDIKATOR PREKINITVE
bcf STATUS,RP0 ; Banka 0
; Tukaj vstavimo rutino za prekinitev RB7 - RB4
;bcf INTCON,RBIF ; Izklopimo indikator prekinitve
clrf INTCON
swapf Stat_reg,w
movwf STATUS ; Povrni STATUS
swapf W_reg,f
swapf W_reg,w ; Povrnemo w v prvotno
retfie ; Konec prekinitvenega podprograma
;************************* GLAVNI PROGRAM ********************************
Glavni ; Glavni program
clrf STEVKA
BSF STEVKA,0
BSF STATUS,RP0 ; Banka 1
clrf TRISA ; PORTA je izhodni port
BCF STATUS,RP0 ; Banka 0
clrf PORTA ; PORTA je izhodni port
CLRF VREDNOST
BSF VREDNOST,1
CLRF PREDZNAK
Glavni1
BSF STATUS,RP0 ; Banka 1
clrf TRISA ; PORTA je izhodni port
BCF STATUS,RP0 ; Banka 0
BSF PORTA,3
BCF INDIKATOR,0 ;POBRIŠEMO INDIKATOR PREKINITVE movlw .1
BCF STATUS,RP0 ; Select Bank 0 of data memory
;---------------------------------------------------------
BCF INTCON,7 ; Disable all interrupts.
;---------------------------------------------------------
GOTO START
;---------------------------------------------------------
; Include the 1-Wire communication routines and macros
#INCLUDE 1W_16F84A1.inc
;#include <MAKRO2_2.INC>
;---------------------------------------------------------
START
;;-------------------------------------------------------
CALL Pisi ;IZPIS ŠTEVKE, ;VHOD je VREDNOST(prebran podatek iz eproma) IZHOD (DESETICE, ENICE, DECIMALKA) pripravljene za prikaz v prekinitvi
CALL zaIZPIS ;;MAKRO ZA PRPRAVO PODATKOV ZA IZPIS (Pošlji)
CALL Poslji ; Posljemo na izhodni pomikalni register
;*************************************************
OMOGOCI2
BCF INDIKATOR_T,0
BSF STATUS,RP0 ; Banka 1
clrf TRISB ; PORTA je izhodni port
BSF TRISB,7
BSF TRISB,6
BSF TRISB,5
BCF STATUS,RP0 ; Select Bank 0 of data memory
clrf INTCON
BSF INTCON,RBIE
BSF INTCON,GIE
MOVLW D'5'
MOVWF KROZENJE2
ODSTEVA2
;BTFSC INDIKATOR,0 ;ČE BIT NI POSTAVLJEN PRESKOČIMO
;GOTO Glavni1
decfsz KROZENJE2,1 ;zmanjšujemo št. prekoračitev štavca, ko je rezultat končamo
goto ODSTEVA2
goto Glavni
;***********************************
;PODPROGRAMI
CAKAJ10
MOVLW D'190'
MOVWF KROZENJE1
ODSTEVA decfsz KROZENJE1,1 ;zmanjšujemo št. prekoračitev štavca, ko je rezultat končamo
goto NADALJUJ
goto KONCAJ
NADALJUJ
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
WAIT .500 ;POČAKAJ .Xµs
;
goto ODSTEVA
KONCAJ
return
;#include <MAKRO1_3.INC>
END ; Konec programa |
|
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.17 Kraj: Ljubljana
|
Objavljeno: Pet Jan 16, 2009 12:57 am Naslov sporočila: |
|
|
Silvo je napisal/a: |
Prekinitveni vektor pri pic-ih je na lokaciji 0x4. Tam je potrebno prekinitev "prestreči"
z Goto ... |
IMHO..
Goto ni potreben, če se prekinitvena koda začne na tem naslovu..
Prišparaš dva programska cikla!
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pet Jan 16, 2009 1:11 am Naslov sporočila: |
|
|
GJ je napisal/a: |
Silvo je napisal/a: |
Prekinitveni vektor pri pic-ih je na lokaciji 0x4. Tam je potrebno prekinitev "prestreči"
z Goto ... |
IMHO..
Goto ni potreben, če se prekinitvena koda začne na tem naslovu..
Prišparaš dva programska cikla!
LP GJ |
Drži, a se mi zdi, da je preglednost bistveno boljša, če s prekinitvenega vektorja skačeš na prekinitveno rutino. Od 0x5 dalje pa pišeš "Glavno" kodo. Stvar navade pač.
Teodor, tole "solato" bom pregledal jutri. Sedaj je že pozna ura. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
TEODOR Član

Pridružen-a: Čet 15 Jan 2009 20:44 Prispevkov: 14 Aktiv.: 0.07 Kraj: IL. BISTRICA
|
Objavljeno: Sob Jan 17, 2009 1:07 am Naslov sporočila: |
|
|
Saj se ni treba preveč poglabljat. Bolj me zanima, zakaj se ne da pobrisati RBIF v INTCON reg.
Pozdrav, Teodor. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Jan 17, 2009 1:32 am Naslov sporočila: |
|
|
TEODOR je napisal/a: |
Saj se ni treba preveč poglabljat. Bolj me zanima, zakaj se ne da pobrisati RBIF v INTCON reg.
Pozdrav, Teodor. |
Sem mislil zadevo pregledati v službi a žal ni bilo časa. Program sem pogledal "po čez". Zastavica se vrjetno pobriše, a zadaj pride nova prekinitev- vrjetno težava zaradi odskakovanja kontaktov tipke.
Koliko sem videl uporabljaš še TMR0 prekinitev. Zakaj ne preverjaš stanja pritisnjenih tipk v njej. Istočasno se izogneš težavi zaradi odskakovanja kontaktov.
V prekinitveni rutini enostavno prebereš stanje na porta v nek register:
Koda: |
movf PORTB,W
movwf TIPKE ;s
|
sedaj imaš v registru Tipke stanje na portu. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
TEODOR Član

Pridružen-a: Čet 15 Jan 2009 20:44 Prispevkov: 14 Aktiv.: 0.07 Kraj: IL. BISTRICA
|
Objavljeno: Sob Jan 17, 2009 11:58 am Naslov sporočila: |
|
|
Živjo Silvo!
Zanimiv predlog, bom preizkusil.
Samo še nekaj glede zastavice. To da se ne pobriše sem opazil med simulacijo programa v Mplabu. Opazil sem tudi, da se pobriše šele po obravnavi prekinitve. Pa me zanima če je to normalno?
Pozdrav, Teodor. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Jan 17, 2009 12:04 pm Naslov sporočila: |
|
|
Zastavico moraš seveda brisati po koncu prekinitve. Vsaka prekinitev, ki sledi po brisanju zastavice le to znova postavi tudi, če se program izvaja v prekinitveni rutini. _________________ lp
Silvo |
|
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
|