- 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
Registro IOCA (PIC16F677)
Moderatore:
Paolino
14 messaggi
• Pagina 2 di 2 • 1, 2
0
voti
0
voti
Posso fare qualche considerazione sul codice? Ma si dai la faccio....
- 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:
Il sistema si presenta nella routine di interrupt trovandosi nel banco 1 e non 0 come ti apsetti.
Quendi la
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.
- 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
0
voti
Ciao Fabio
I tuoi consigli sono sempre ben accetti !
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
I tuoi consigli sono sempre ben accetti !
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
14 messaggi
• Pagina 2 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 17 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


