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 

PIC16F84A PREKINITVE Rb4-Rb7
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
TEODOR
Član
Član



Pridružen-a: Čet 15 Jan 2009 20:44
Prispevkov: 14
Aktiv.: 0.07
Kraj: IL. BISTRICA

PrispevekObjavljeno: Čet Jan 15, 2009 9:13 pm    Naslov sporočila:  PIC16F84A PREKINITVE Rb4-Rb7 Odgovori s citatom

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



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.35
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Čet Jan 15, 2009 9:35 pm    Naslov sporočila:   Odgovori s citatom

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



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

PrispevekObjavljeno: Čet Jan 15, 2009 10:08 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 24 Jul 2007 17:22
Prispevkov: 811
Aktiv.: 3.72
Kraj: Ptuj

PrispevekObjavljeno: Pet Jan 16, 2009 12:03 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Jan 16, 2009 12:24 am    Naslov sporočila:   Odgovori s citatom

Pripni kodo, da vidimo.
_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TEODOR
Član
Član



Pridružen-a: Čet 15 Jan 2009 20:44
Prispevkov: 14
Aktiv.: 0.07
Kraj: IL. BISTRICA

PrispevekObjavljeno: Pet Jan 16, 2009 12:26 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Jan 16, 2009 12:33 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Čet 15 Jan 2009 20:44
Prispevkov: 14
Aktiv.: 0.07
Kraj: IL. BISTRICA

PrispevekObjavljeno: Pet Jan 16, 2009 12:42 am    Naslov sporočila:   Odgovori s citatom

Živjo!
Tukaj je koda od prej:
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TEODOR
Član
Član



Pridružen-a: Čet 15 Jan 2009 20:44
Prispevkov: 14
Aktiv.: 0.07
Kraj: IL. BISTRICA

PrispevekObjavljeno: Pet Jan 16, 2009 12:47 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.17
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jan 16, 2009 12:57 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Jan 16, 2009 1:11 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Čet 15 Jan 2009 20:44
Prispevkov: 14
Aktiv.: 0.07
Kraj: IL. BISTRICA

PrispevekObjavljeno: Sob Jan 17, 2009 1:07 am    Naslov sporočila:   Odgovori s citatom

Saj se ni treba preveč poglabljat. Bolj me zanima, zakaj se ne da pobrisati RBIF v INTCON reg.
Pozdrav, Teodor.
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jan 17, 2009 1:32 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Čet 15 Jan 2009 20:44
Prispevkov: 14
Aktiv.: 0.07
Kraj: IL. BISTRICA

PrispevekObjavljeno: Sob Jan 17, 2009 11:58 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jan 17, 2009 12:04 pm    Naslov sporočila:   Odgovori s citatom

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
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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group