Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Registro IOCA (PIC16F677)

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Registro IOCA (PIC16F677)

Messaggioda Foto Utentemros » 29 ott 2013, 17:39

Codice: Seleziona tutto
       PROCESSOR       16F677
        RADIX           DEC
        INCLUDE         "P16F677.INC"
        ERRORLEVEL      -302

   __CONFIG        0x3F32

        ORG     0x00
   
   GOTO start

        cblock     0x20

   Count:3      
   PB         
   CONT      
   RIPET      
   CICLO      
   DUTY0      
   DUTY1
   DUTY2
   DUTY3
   DUTY4
   DUTY5
   DUTY6
   DUTY7
   RIPETI      
   DIGIT      
   
   ENDC

   

        ORG     0x04


        BTFSC   INTCON,T0IF
        GOTO    IntT0IF
        BTFSC   INTCON,INTF
        GOTO    IntINTF

End_ih
        BCF     INTCON,T0IF
        BCF     INTCON,INTF

        RETFIE


IntT0IF
      GOTO    End_ih

IntINTF
   CLRF   PORTC
   CLRF   DIGIT
D10S         ;CIRCA 10 S
        MOVLW   49
   MOVWF   Count
        MOVLW   10
   MOVWF   Count+1
        MOVLW   20
   MOVWF   Count+2
mDelayLoop1

   BTFSS   PORTA,2
   GOTO   STP

        DECFSZ  Count,1
        GOTO    mDelayLoop1

        DECFSZ  Count+1,1
        GOTO    mDelayLoop1

        DECFSZ  Count+2,1
        GOTO    mDelayLoop1
   
   BSF   STATUS,0
   
   RLF   PORTC,F   
   INCF   DIGIT,F

        MOVLW   29
   MOVWF   Count
        MOVLW   10
   MOVWF   Count+1
        MOVLW   15
   MOVWF   Count+2
   
   GOTO   mDelayLoop1
STP
        GOTO    End_ih

start:

;***********************************************
;   Option_REG                             *
;1)No pull-up                                  * 
;2)Interrupt INT abilitato sul fronte di salita*
;***********************************************

   BCF   STATUS,RP1
        BSF     STATUS,RP0   ; banco 1

        MOVLW   B'11000000'   ;Inte. sul fronte di salita
   MOVWF   OPTION_REG     ;No pull-up

;************************
;   Settaggio Porte *
;************************
   
   BCF   STATUS,RP1
        BSF     STATUS,RP0   ; banco 1
       
   MOVLW   B'11111111'   
        MOVWF   TRISB        

        MOVLW   B'11111111'   
        MOVWF   TRISA       

        MOVLW   B'00000000'   ; C0-C7 USCITE LED
        MOVWF   TRISC      


;************************
; Settaggio A/D         *
;************************

   BSF   STATUS,RP1
        BCF     STATUS,RP0   ; banco 2

   CLRF   ANSEL
   CLRF   ANSELH      ;TUTTI GLI INGRESSI SONO DIGITALI

;************************
; Resistenze di pull-Up *
;************************

;********************************
;     Settaggio Interrupt      *
;1)Interrupt Abilitati      *
;2)ABILITO L'INTERRUPT INTF   *
;********************************

        BCF     STATUS,RP0   
        BCF     STATUS,RP1   ;banco 0

   MOVLW   B'10010000'   
        MOVWF   INTCON       

;************************
; INIZIALIZZAZIONE      *
;************************

        BCF     STATUS,RP0   
        BCF     STATUS,RP1   ;banco 0

        MOVLW   B'00000000'   
        MOVWF   PORTA

        MOVLW   B'00000000'   
        MOVWF   PORTB

        MOVLW   B'00000000'   
        MOVWF   PORTC

;*******************************
;   Settaggio OSCILLATORE  *
;*******************************

   BCF   STATUS,RP1
        BSF     STATUS,RP0   ; banco 1
   
        MOVLW   B'01100000'   ; IMPOSTO 4 MHz
        MOVWF   OSCCON

        BCF     STATUS,RP0   
        BCF     STATUS,RP1   ;banco 0


;*****************************************
;   MAIN                             *
;*****************************************

MainLoop

   CLRF   CICLO
   CLRF   CONT
   INCF   CONT,F
   

   GOTO   $-3   
END
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

0
voti

[12] Re: Registro IOCA (PIC16F677)

Messaggioda Foto Utentec1b8 » 29 ott 2013, 18:23

Posso fare qualche considerazione sul codice? Ma si dai la faccio.... :mrgreen:
- L'inizializzazione del clock deve essere la prima cosa che fai non l'ultima delle inizializzazioni
- L'attivazione degli interrupt (ovvero settare il bit GIE di INTCON) deve essere l'ultima
- nella routine di interrupt non salvi il "contesto" del micro e non ti porti nella condizione necessaria la funzionamento della routine di interrupt. Questo può causare errori. Vedi "Context Saving During Interrupts" a pagina 207 del datasheet.
In particolare questo ultimo punto non è abbligatorio, ma vediamo cosa potrebbe provocare nel tuo codice.

Tu abiliti gli interrupt, scrivi tutti 0 sulle porte (A, B e C) quindi cambi banco di memoria per impostare l'oscillatore.
Hai detto prima che il pin RA2 è libero, quindi potrebbe per effetto di disturbi generare un interrupt inaspettato appena abilitato l'interrupt. Supponi che l'interrupt si verifichi subito dopo queste istruzioni:
Codice: Seleziona tutto
;*******************************
;   Settaggio OSCILLATORE  *
;*******************************

        BCF     STATUS,RP1
        BSF     STATUS,RP0   ; banco 1

        MOVLW   B'01100000'   ; IMPOSTO 4 MHz

Il sistema si presenta nella routine di interrupt trovandosi nel banco 1 e non 0 come ti apsetti.
Quendi la
Codice: Seleziona tutto
        BTFSS   PORTA,2
        GOTO   STP

non controlla RA2 ma controllo TRISA, 2. Come conseguenza non esci mai dall'interrupt.
Ma se tu uscissi potresti, anzi lo hai fatto sicuramente, corrotto il registro W andando a caricare in OSCCON un dato diverso da quello che ti aspetti.
Anche la RLF PORTC,F non funzionerebbe a dovere con conseguenza di portare la PORTC come input e non come output e non vedere i led accendersi in progressione.

Potrebbe non accadere nulla di questo sia chiaro, ma è un bel rischio.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[13] Re: Registro IOCA (PIC16F677)

Messaggioda Foto Utentemros » 29 ott 2013, 22:42

Ciao Fabio
I tuoi consigli sono sempre ben accetti ! :ok:
Purtroppo manco di esperienza ed e' molto facile impazzire quando capita ciò che ha descritto nel tuo l'ottimo messaggio.
comunque ho messo il pin a massa con ma resistenza e eliminato il controllo del flag, nell'interrupt, del timer e per magia ( sedere ) e' andato tutto bene.
comunque sia seguo i tuoi consigli e modifico il firm.

Grazie e buona notte
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

0
voti

[14] Re: Registro IOCA (PIC16F677)

Messaggioda Foto Utentec1b8 » 29 ott 2013, 22:59

Ottimo :ok: =D>
Buona notte!
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti