Stránka 1 z 1

Multisim+prerušenie

Napsal: 29 srp 2010, 09:57
od edguy21
Zdravím!


Idem sa konečne pustiť do programovania PIC 8O 8O
Potrebujem pomôcť s MULTISIM.
PIC 16F84
Začínam sa baviť so simulaciou PIC.Programator PICKIT kupím neskôr.
Ako prvu zložitejšiu funkciu chcem otestovať prerušenie,ale neviem kde je chyba či v programe alebo v MULTISIM,lebo som skusil rozne zapojenia a nič.
Neviem či to Multisim vie lebo ak nie tak na simulaciu PIC neviem čo použijem ešte pred naprogramovanim.
Nechcem teraz sedieť hodiny za tym a rozmyšľať kde je chyba.

multisim

Kód: Vybrat vše

http://www.edisk.sk/stahni/86891/rar.rar_156.24KB.html

Obrázek

Ak neviete vyjsť z môjho zapojenia tak poprosím o vaše jednoduché zapojenie na Prerušenie PORT 4-7 napr,niečo na Blikač

Je to blikanie LED a LED1
Ak vždy stlačim TL vyvolam prerušenie ,zmenim parameter "prep"=0a1 a tým sa zmení na blikanie LED alebo LED1 ,a zmení sa aj rychlosť
Teraz tu je vyvolane prerušenie z RB4-RB7,ani to nejde ako nešlo RB0

Prerušenie a uloženie hodnot mam asi spravne ale neviem či aj
nastavenie prerušenia a zmazanie
port4
prerušenie::
prerus movwf W_save
swapf STATUS,w
movwf Sta_sav
......
......
.....
.....
swapf Sta_sav,w
movwf STATUS
swapf W_save,f
swapf W_save,w
retfie

zmazanie prerušenia:::
ORG 04h ;vektor přerušení
BCF INTCON,GIE ;zakázání všech přerušení
BCF INTCON,RBIF ;smazání příznaku přerušení od RB4-RB7

nastavenie prerušenia:::
init ...
.....
.....
MOVLW B'10001000' ; povoleni preruseni pouze od RB0
MOVWF INTCON
....





ASM------------------

Kód: Vybrat vše

    LIST P=16F84
   INCLUDE<P16F84.INC>
   __CONFIG _PWRTE_ON & _WDT_OFF & _RC_OSC

#DEFINE   TLAC   PORTB,4      ; tlacidlo
#DEFINE   TLAC1   PORTB,3      ; tlacidlo
#DEFINE   LED   PORTA,0      ; za stredniky !!!
#DEFINE   LED1   PORTA,1      ; za stredniky !!!
c2       EQU      h'21'              ;proměnné pro cykly
cas      EQU      h'30'               ;pocet bliknuti
prep     EQU      h'22'               ;prepinac blikania medzi LED a LED1
GIE      EQU      H'0007'
EEIE     EQU      H'0006'
T0IE     EQU      H'0005'
INTE     EQU      H'0004'
RBIE     EQU      H'0003'
T0IF     EQU      H'0002'
INTF     EQU      H'0001'
RBIF     EQU      H'0000'
W_save equ 29h                  ; zaloha w
Sta_sav equ 25h                 ; zaloha status
PCL_sav equ 26h                 ; zaloha pcl
FSR_sav equ 27h                 ; zaloha fsr

;- zaciatok-------------------------------------------------
   ORG 00h      ;přesun na vykonávání
   GOTO   init         ;programu

   ORG 04h         ;vektor přerušení
   BCF INTCON,GIE      ;zakázání všech přerušení
   BCF INTCON,RBIF   ;smazání příznaku přerušení
    GOTO prerus
;- inicializacia-------------------------------------------------
init   BSF   STATUS,RP0
   MOVLW   B'00000000'    ; port A vystup
   MOVWF   TRISA
   MOVLW   B'11111111'    ; port B vstup
   MOVWF   TRISB
   BCF   STATUS,RP0
   MOVLW   B'10001000'   ; povoleni preruseni pouze od RB0
   MOVWF   INTCON
   MOVLW   B'00100000'     ; vloženie 64 smyčku
   MOVWF   cas
;- prepinanie LED-------------------------------------------------   
hej     BTFSC prep,0
     GOTO ld1
      BTFSS prep,0
      GOTO ld2
;- blikanie-------------------------------------------------
ld1    BSF      LED           ; provádí blikání LED
         CALL     cekej              ; podle hodnoty tempu
         CALL     cekej              ; se v tomto bloku provádí
         BCF      LED            ; určený počet bliknutí
         CALL     cekej
         CALL     cekej                       ;podprogram čekání           
         GOTO     hej

ld2    BSF      LED1           ; provádí blikání LED1
         CALL     cekej              ; podle hodnoty tempu
         CALL     cekej              ; se v tomto bloku provádí
         BCF      LED1            ; určený počet bliknutí
         CALL     cekej
         CALL     cekej                       ;podprogram čekání           
         GOTO     hej
             
;- smycka-------------------------------------------------
 
cekej    MOVF   cas,w                ;podprogram čekání
         MOVWF    c2     
wait2    DECFSZ   c2,1
         GOTO     wait2
         RETURN                      ;návrat z podprogramu

;- prerusenie --zniženie blikania-----------------------------------------------
prerus movwf W_save
    swapf STATUS,w
    movwf Sta_sav
    MOVLW B'00100000'
    ADDWF cas,1              ;pripocitanie na zmeny rychlosti
    comf prep,1             ;zmena LED a LED1
    BTFSC TLAC               ;cakat na pustenie TL
    GOTO  $-1
    swapf Sta_sav,w
    movwf STATUS
    swapf W_save,f
    swapf W_save,w
    retfie

   END

-------------------------------------------------------





Diiiiky za každu radu
:idea: :wink:

Napsal: 29 srp 2010, 10:57
od MiloPS3
Cau, priznak preruseni od RB0 je INTF, instrukce SWAPF prohodi spodni a horni 4 bity , takze pokud tam je 0 tak se to nemeni ,jestly chces negovat tak instrukci COMF, pokud neni chyba jinde mohlo by to fungovat

Napsal: 29 srp 2010, 12:41
od edguy21
:wink: :wink: :wink:
DDDDDDDDDDDDiiiky už ide aj rychlost aj zmena LED a LED1
neviem presne kde bola chyba,možno definicia TLAC a priznak povolenia prerušenia či nulovania
ide aj RBO aj RB4

dobabral som to lebo som to chcel asi narýchlo a chybička kedykoľvek nastane

00.Skusím aj program ISIS, to je PROTEUS že????
0.MPLAB viem čo je a použivat budem
1.simulacia ide aj so zapojenymi VDD VSS na PIC
2.RBIF som zamenil s INTF nechtiac ked som posielal prosbu na forum ,opravene na fore
---ak PORTB,4 zmenit
#DEFINE TLAC PORTB,4 ; tlacidlo

ORG 04h ;vektor přerušení
BCF INTCON,GIE ;zakázání všech přerušení
BCF INTCON,RBIF ;smazání příznaku přerušení
GOTO prerus

MOVLW B'10001000' ; povoleni preruseni pouze od RB4
MOVWF INTCON

---ak PORTB,0 zmenit
#DEFINE TLAC PORTB,4 ; tlacidlo

ORG 04h ;vektor přerušení
BCF INTCON,GIE ;zakázání všech přerušení
BCF INTCON,INTF ;smazání příznaku přerušení
GOTO prerus

MOVLW B'10010000' ; povoleni preruseni pouze od RB0
MOVWF INTCON
-----
3. BCF INTCON,GIE tiež sa použiva aj nulovanie GIE
4.Uloženie W a STATUS mam podla datashet kde je použite aj SWAPF,inde na niektorych konštrukciach to niektory nepouživaju

3.zmena blikania LED na LED1--lebo neišlo so SWAPF::::
SWAPF prep,1 som zmenil na comf prep,1







Ešte otazočka na prerušenia??
RB4-RB7 ako prerušenie + vystup počas prerušenia na odoslanie dat ide to ????
Napr.ak použijem PORTB4-7 pre tlačidla na prerušenie ,možem ich použit ak Vystup počas Prerušenia napr.na posun registrov(a pod.) pre LED display,
videl som niečo podobne v Učebnica programovania PIC


Příklad 6-1: Uložení obsahu registru W a STATUS do RWM
PUSH MOVWF W_TEMP ; uložení střadače do záložního registru
SWAPF STATUS,W ; načtení obsahu registru STATUS do střadače (s přemístěním horních a dolních 4 bitů)
MOVWF STATUS_TEMP ; uložení obsahu registru STATUS do záložního registru
ISR : :
:
; rutina obsluhy přerušení, která může libovolně měnit volbu banky registrů
POP SWAPF STATUS_TEMP,W ; načtení záložního registru s původním STATUS (s přemístěním horních a dolních 4 bitů)
MOVWF STATUS ; uložení původního obsahu STATUS do registru STATUS (POP)
; (obnovení volby banky registrů)
SWAPF W_TEMP F ; přemístění horních a dolních 4 bitů v


ešte raz VĎAKA
:idea: :wink:
p.s. MPLAB už použijem a teraz už možem tvoriť zložitejšie zapojenia s PIC a študovať TMR,SLEEP a mnoho viac o PIC,zapojenia LED,DISPLAY,Krok.motor.............

Napsal: 29 srp 2010, 13:13
od Atlan
Pozor na RA4 pin...je s otvorenym kolektorom na 16f84 16f628 a podobne asi na vsetkych picoch.

Napsal: 29 srp 2010, 17:33
od Chenzee
Priznak preruseni zmenou na RB4-RB7 lze smazat az po precteni registru PORTB.

Napsal: 29 srp 2010, 20:26
od edguy21
Ok
takže počas prerušenia možem zmenit vstup na vystup kde su TL

PIC naštudujem ako to je s rezistormi na TL

napr.na RB4-RB7 budu TL ale možno aj iny PIC alebo LED alebo posuvny register...a pod. ak by som obsadil všetky piny ----
ˇškola programovania tam boli TL na PORTeB ale aj pripojeny posuvny register pre Multiplexny režim 7segment.Led displeja

Napsal: 29 srp 2010, 22:31
od edguy21
nevieš ako to je s Multisim::
kopia v novom projekte a simulacia

ak vytvorim schemu s PIC+asm ide,
potom dam novy projekt a všetko skopirujem ale nejde,kopiu robim preto aby som niečo upravil v scheme aj v asm a nerobil všetko odznova

Robim všetko teraz odznovu -inu schemu ale už ani to nejde



neviem či treba novu schemu robit od začiatku alebo program(pochybujem že chyba je tu)


ono asi nejde ani s klasickymi sučiastkami ak skopirujem do noveho projektu