Vai al contenuto
PLC Forum


Controllo Degli Ingressi Pic 16f84


Vick

Messaggi consigliati

Sto imparando ad usare i PIC, ho gia fatto qualche programmino ma adesso non so come risolvereun problema..

Devo controllare 4 ingressi costantemente e al variare dello stato di uno di questi (sia da

1->0 che da 0->1) far partire una routine di ritardo.

C'é qualcuno che saprebbe consigliarmi o mi aiuterebbe nelle scrittura della parte di codice relativa al controllo/ lettura degli ingressi?

ciao a tutti

Link al commento
Condividi su altri siti

  • 2 weeks later...

Ciao VICK!

la risposta più ovvia alla tua domanda, (tanto che forse la sai già :rolleyes: ) è quella di utilizzare la funziona ad "interrupt" disponibile anche , quardacaso, proprio su quattro ingresso della porta B ovvero dal 4 al 7 .

Devi abilitare la loro funzionalità IPT dal registro INTCOM che risponde alla locazione 0Bh.

Il problema, semmai, è quello che:

1. quando almeno uno degli ingressi cambia stato, lo stack pointer si porta alla locazione 0004h ma nel contempo spegne gli interrupt ulteriori (per "non essere disturbato" ) ma se ti arriva un ulteriore cambio stato anche di un'altro input, prorpio in quel mentre (stiamo comunque parlando di pochi msec) lo perdi.

2. La funzione ad interrupt può essere abilitata solo (ma sarebbe meglio tu ti leggessi il manuale del tuo PIC) o sul fronte di salita o su quello di discesa, non su entrambi. e questo lo decidi dal registro OPTION 81h

Sul manuale dell'MPLAB c'è comunque tutto.

Non ti posto nessun listato, poichè se guardi meglio io sono forse messo peggio di te (senza offesa, ovviamente) come scrittura codice. :rolleyes:

Ciao!

Modificato: da tatonilo
Link al commento
Condividi su altri siti

Salve! Giusto un paio di precisazioni giusto x essere pignoli pignoli :angry: .

1. Non è lo stack che si porta alla locazione 0004h della mem. di prg,bensì il program counter, lo stack memorizza l'indirizzo che punta all'istruzione che il micro avrebbe dovuto eseguire se non fosse intervenuto l'interrupt, ne è lui che spegne gli stessi come si potrebbe capire dal tuo msg.

2. Non perdi il monitoraggio degli ingressi per pochi msec ma per pochi usec! a meno che tu non usi un quarzo da 1 Hz o tu abbia una routine dell'interrupt di migliaia di righe, supponendo di utilizzare un 16F84 con un quarzo da 4Mhz avresti un tempo di esecuzione di un prog di 1024 istruzioni di 1,024 msec.

Tra l'altro l'interrupt è fatto x gestire eventi veloci, se ti facesse perdere qualche ms staremmo freschi :o !

Per gestire situazioni simili l'interrupt a mio avviso è un pò esagerato, se date un occhiata al corso "Pic By Example" del mitico Tanzilli B) potrete trovare alcuni esempi che potrebbero fare con poche modifiche al caso vostro e togliervi diversi dubbi sul funzionamento di 'sti benedetti micro.

Scusate l'intromissione,saluti ;) !

Link al commento
Condividi su altri siti

Banalmente si potrebbe fare una prima lettura degli ingressi, azzerare i bit che non interessano (per esempio da RB0 a RB3) e salvare il valore in un registro.

MOVF PORTB,W
ANDLW 11110000B
MOVWF REGISTRO_SALVATAGGIO
Successivamente quando serve si rileggono gli ingressi, si azzerano come prima i bit non interessanti, e si confronta il nuovo valore con quello precedente. Si salva in ogni caso il nuovo valore e se era diverso si richiama la subroutine.
MOVF PORTB,W
ANDLW 11110000B
XORWF REGISTRO_SALVATAGGIO,F
MOVWF REGISTRO_SALVATAGGIO
BTFSC STATUS,Z
CALL RITARDO

Il limite di questo sistema e' di poter perdere variazioni che avvengono in momenti in cui il programma non legge gli ingressi, e di considerare come una sola piu' variazioni contemporanee.

Modificato: da Claudio F
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...