PIC- začiatočník

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Experience
Příspěvky: 11
Registrován: 30 čer 2011, 00:00

#16 Příspěvek od Experience »

Zdravím Vás
Mám taký problém, snažím sa ovládať jednoduchý DC motor, no skončil som pri prerušení, ako vzor prerušenia som použil : http://pandatron.cz/?154&skola_programovani_pic-10_dil , no nejak mi nefunguje, použil som PIC16F690, program beží normálne, len ani pri zmene úrovne na RA2, sa nič nedeje, prerušenie jednoducho nenastane, prerušenie by malo na nejaký čas zastaviť motor, vie niekto pls kde je chyba ?? Díky

Kód: Vybrat vše

 #include <p16F690.inc>
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0
cblock 20h
Delay1
Delay2
Delay3
Delay4
Delay5
Delay6
W_save
Sta_sav
PCL_sav
FSR_sav
endc


org   00h
   goto   Start

   org   04h      ; ulozeni hlavnich registru
   movwf   W_save      ; W
   movf   STATUS,W
   clrf   STATUS      ; Banka 0
   movwf   Sta_sav      ; STATUS
   movf   PCLATH,w
   movwf   PCL_sav      ; PCLATH
   movf   FSR,w
   movwf   FSR_sav      ; FSR
   GOTO   PRERUS
Start
     bsf     STATUS,RP0       ; banka 1
   MOVLW   0x04          ; I-O
   MOVWF   TRISA
     bcf     STATUS,RP0       ; Banka 0
   MOVLW   B'10010000'   ; povoleni preruseni pouze od RA2
   MOVWF   INTCON
     bsf     PORTA,0          ; zapnutie motora
   call   CAKAJ

   bcf      PORTA,0
   CALL   CAKAJ


   GOTO   Start

PRERUS
   BTFSC   INTCON,1
   GOTO   PRER0      ; od RA2
   GOTO   PRERKON      ; nezname = nic

PRER0
   BCF   INTCON,1   ; smazat priznak
   BCF   PORTA,0      ; na nejaký čas sa vypne motor
   CALL CAKAJ1

   GOTO   PRERKON


PRERKON
   MOVLW   B'10010000'   
   MOVWF   INTCON
   clrf   STATUS      
   movf   FSR_sav,w   ; FSR
   movwf   FSR
   movf   PCL_sav,w   ; PCLATH
   movwf   PCLATH
   movf   Sta_sav,w   ; Status
   movwf   STATUS
   swapf   W_save,f   ; W
   swapf   W_save,w
   retfie








CAKAJ
   clrf   Delay1
   clrf   Delay2
slucka
   DECFSZ   Delay1,1
   GOTO   slucka
   DECFSZ   Delay2,1
   GOTO   slucka
   RETURN   

CAKAJ1
MOVLW   .100
MOVWF   Delay3
MOVWF   Delay4
MOVWF   Delay5

slucka1
   DECFSZ   Delay3,1
   GOTO   slucka1
   DECFSZ   Delay4,1
   GOTO   slucka1
   DECFSZ   Delay5,1
   GOTO   slucka1
   RETURN

CAKAJ2
   clrf   Delay6
   
slucka2
   DECFSZ   Delay6,1
   goto   slucka2
   RETURN

     end
Uživatelský avatar
MiloPS3
Příspěvky: 279
Registrován: 07 srp 2010, 00:00

#17 Příspěvek od MiloPS3 »

Cau, koukni se do DS pod jaky preruseni spada ten RA2 a podle toho to zapni (to mas spatne + vypnuti periferie sdilene s timto pinem,pokud sou zaply), truchu to pooprav at se v tom da vyznat

Kód: Vybrat vše

   LIST P=16F690
   #include <p16F690.inc>
   __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
;***********************
   cblock 20h
Delay1
   endc
;***********************   
   org   00h     
      goto   Init
      
      org    0x04
   goto   Preruseni
;***********************   
Preruseni   nop   
   ;ulozeni registru
   ;obsluha preruseni
   ;vynulovani flagu
   ;obnova registru
         
   retfie
;************************         
Init   nop
   ;pokud sou nejake periferie sdilene s pouzitymy piny ->
   ;->je treba je vypnout
   ;nastaveni I/O
   ;vynulovani flagu
   ;povoleni preruseni / pokud jde o periferii ->
   ;->povolit preruseni od periferie
   ;povolit globalni preruseni
;**************************         
Start   nop
   goto   $-1

;*************************
      END
Uživatelský avatar
Experience
Příspěvky: 11
Registrován: 30 čer 2011, 00:00

#18 Příspěvek od Experience »

Takže tu je poupravený program:

Kód: Vybrat vše

#include <p16F690.inc>
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0
;***********************
cblock 20h
Delay1
Delay2
Delay3
Delay4
Delay5
Delay6
W_save
Sta_sav
PCL_sav
FSR_sav
endc

;*********************** Zalohovanie registrov
   org   00h
   goto   Program
   org   04h            ; ulozeni hlavnich registru
   movwf   W_save      ; W
   movf   STATUS,W
   clrf   STATUS      ; Banka 0
   movwf   Sta_sav      ; STATUS
   movf   PCLATH,w
   movwf   PCL_sav      ; PCLATH
   movf   FSR,w
   movwf   FSR_sav      ; FSR
   GOTO   PRERUS

;*********************** Prerusenie

PRERUS
   BTFSC   INTCON,1
   GOTO   PRER0      ; od RA2
   GOTO   PRERKON      ; nezname = nic

PRER0
   BCF   INTCON,1   ; smazat priznak
   BCF   PORTA,0      ; na nejaký čas sa vypne motor
   CALL CAKAJ1

   GOTO   PRERKON


PRERKON
   MOVLW   B'10010000'   
   MOVWF   INTCON
   clrf   STATUS      
   movf   FSR_sav,w   ; FSR
   movwf   FSR
   movf   PCL_sav,w   ; PCLATH
   movwf   PCLATH
   movf   Sta_sav,w   ; Status
   movwf   STATUS
   swapf   W_save,f   ; W
   swapf   W_save,w
   retfie

;*********************** Nastavenie
Program
     bsf     STATUS,RP0       ; banka 1
   MOVLW   0x04          ; I-O
   MOVWF   TRISA
     bcf     STATUS,RP0       ; Banka 0
   MOVLW   B'10010000'   ; povoleni preruseni pouze od RA2
   MOVWF   INTCON
;***********************  Hlavny program
Start
   bcf      STATUS,RP0
     bsf     PORTA,0          ; zapnutie motora
   call   CAKAJ
   bcf      PORTA,0
   CALL   CAKAJ
   GOTO   Start

;*********************** Podprogramy

CAKAJ
   clrf   Delay1
   clrf   Delay2
slucka
   DECFSZ   Delay1,1
   GOTO   slucka
   DECFSZ   Delay2,1
   GOTO   slucka
   RETURN   

CAKAJ1
MOVLW   .100
MOVWF   Delay3
MOVWF   Delay4
MOVWF   Delay5

slucka1
   DECFSZ   Delay3,1
   GOTO   slucka1
   DECFSZ   Delay4,1
   GOTO   slucka1
   DECFSZ   Delay5,1
   GOTO   slucka1
   RETURN

CAKAJ2
   clrf   Delay6
   
slucka2
   DECFSZ   Delay6,1
   goto   slucka2
   RETURN

;***********************

     end
     


Čo sa týka RA2, tak vlastne týmto zápisom:
MOVLW B'10010000'
MOVWF INTCON

som nastavil:
Enables the RA2/INT external interrupt
Enables all unmasked interrupts

Potom nechápem, čo tam mám zle :(
Uživatelský avatar
MiloPS3
Příspěvky: 279
Registrován: 07 srp 2010, 00:00

#19 Příspěvek od MiloPS3 »

nooo ..., kdybych ten DS otevrel hned tak bych vedel ze placam hovadiny (s 690 sem jeste nedelal), mas to dobre nastaveny ale jde o jednu periferii s RA2 sdilenou, viz. NOTE v 4.1 PORTA and the TRISA Registers,v INTCONu je lepsi nastavovat bity zvlast nez zapisem do celyho registru
Uživatelský avatar
Experience
Příspěvky: 11
Registrován: 30 čer 2011, 00:00

#20 Příspěvek od Experience »

Aha, díky, zdá sa, že už to ide, použil som inicializaciu z datasheetu:

Kód: Vybrat vše

BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTA ;Init PORTA
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 0Ch ;Set RA<3:2> as inputs
MOVWF TRISA ;and set RA<5:4,1:0>
;as outputs
BCF STATUS,RP0 ;Bank 0
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“