Vick Inserito: 9 agosto 2005 Segnala Inserito: 9 agosto 2005 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
tatonilo Inserita: 23 agosto 2005 Segnala Inserita: 23 agosto 2005 (modificato) Ciao VICK!la risposta più ovvia alla tua domanda, (tanto che forse la sai già ) è 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 81hSul 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. Ciao! Modificato: 23 agosto 2005 da tatonilo
ezln77 Inserita: 30 agosto 2005 Segnala Inserita: 30 agosto 2005 Salve! Giusto un paio di precisazioni giusto x essere pignoli pignoli .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 !Per gestire situazioni simili l'interrupt a mio avviso è un pò esagerato, se date un occhiata al corso "Pic By Example" del mitico Tanzilli 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 !
tatonilo Inserita: 31 agosto 2005 Segnala Inserita: 31 agosto 2005 (modificato) Ciao a tutti.io sono forse messo peggio di te .......... come scrittura codice Modificato: 31 agosto 2005 da tatonilo
Claudio F Inserita: 31 agosto 2005 Segnala Inserita: 31 agosto 2005 (modificato) 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: 31 agosto 2005 da Claudio F
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora