home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


PORTA analogica in PIC16F873A
     
Autore Messaggio opzioni
e.ferriani





postato il:
14.02.2018, alle ore 19:50
Non gira. Si ferma sul primo "if (SSPIF)", ed abendo messo l'interrupt con la l'intervento del SSPIF, mi blocca ovviamente, anche tulla la sincronizzazione tra master e slave, che già funzionava.

Bisognerà adattarlo un pochino, o adattare quello che ho a questa aggiunta.

Timer, interrupt, temporizzazioni...non ci ho mai avuto a che fare. Finora mi sono sempre accontentato di leggere delle porta quando il programma ci passa sopra...



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
15.02.2018, alle ore 17:03
Se usi un interrupt, puoi eseguirlo subito o mettere un flag e togliere quello suo in ISR. A parte che se non vuoi una ISR, il flag lo puoi usare anche fuori e ovvio che è asincrono.
Non ho la correttezza delle informazioni del protocollo I2C, suppongo che il BUS sia gestito che se il master lo tiene occupato, non c'è un limite di tempo.

Lì c'è una organizzazione che determina quando il bus viene liberato. Che dovrebbe essere lo STOP dal master. Ma avendo solo un master, gli slave non gli serve accedere, ma dovrebbero lasciare un messaggio nella locazione che il master legge.

Se facciamo un esempio dell' RTC, anche quello appare al master come una locazione di memoria, va a leggere e scrivere a determinati indirizzi, trasmessi sul bus, Anche le memorie hanno lo stesso effetto.
Penso, dal master si mette un messaggio ad una area dello slave indirizzato, do una pausa e vado a vedere all' indirizzo di risposta che tipo di condizione è lo slave.

Spero di trovare del tempo per fare esperimenti con il simulatore. Almeno si parte a discutere di effetti fattibili. Magari mi dai il pezzo di programma che funzione che provo a metterci una qualche idea delle mie. Forse puoi scrivermi in privato.



Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
16.02.2018, alle ore 07:43
In effetti mi sto rendendo conto che una comunicazione fatta così potrebbe avere "qualche" problema, nel senso che il master comunica qualcosa e poi sta ad aspettare la risposta, nel caso in cui se la dovesse perdere il gioco è finito.
Forse come dici tu Bisogna scrivere qualcosa in una zona di memoria dedicata al singolo scambio di informazioni slave->master, ma non en ho esperienza.
Poi, come scrivi tu, "void ISR interrupt()" scritto XC8 mi sembra non la recepisca proprio.



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
16.02.2018, alle ore 16:07
Non mi ricordo il comando esatto in XC8...... Vedo il manuale
void interrupt <il_nome che_vuoi>(void).

Punterei comunque nel modello di arduino che come minimo fornisce millis() non bloccante e delay bloccante. Con quello fai una pausa in un certo punto del programma, senza bloccarlo, e continui a fare altro. L' esempio di guardare l' orologio.
Come noti nel tuo esempio ho aggiunto un timeout. Ad un certo punto le MCU tornano a fare altre cose, di cui richiedi averne il controllo.

Vorrei fare una prova, ma al momento ho ancora qualche altro impegno.



Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
18.02.2018, alle ore 21:06
Trovato perchè mi si bloccava tutto all'intervento dell'interrupt su RB0. Alla chiusura del "if" avevo messo questo

INTCONbits.INTF = 0;

anziché questo

INTCONbits.T0IF = 0;

Azzeravo il registro del timer e non quello della porta B0.



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
22.02.2018, alle ore 15:58
Comunque, l' idea di usare il watchdog non è da scartare. Almeno dal lato slave si assicura che non ci sarà una condizione di stallo. Forse più pratico che usare un periodo di timeout.

Il watchdog va azzerato prima che scadano i 18 ms. Quindi ogni tante istruzioni di sorgente va aggiunto il clrwdt.



Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
11.03.2018, alle ore 20:36
Confesso, ho un problemino con questo interrupt.
Al verificarsi di una certa situazione, interrupt sul pin RB0, lo slave scrive qualcosa sul I2C bus. Verificato con oscilloscopio che funziona.
Il master quando avviene questa situazione dovrebbe saltare in un processo che comunica al secondo slave il fatto accaduto sul primo.
Bene, se abilito gli interrupt sul master non gira più niente.
Qualche anima pia riuscirebbe a darmi una dritta su come far funzionare o se ci sono altre strade?



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
12.03.2018, alle ore 09:53
Se avviene l' interrupt durante la comunicazione I2C, conviene che lo disabiliti. Quando hai finito di comunicare su I2C mandi lo STOP sul bus I2C , allora abiliti l' interrupt su RB0.
Se l' interrupt è su uno slave, penso che si deva alternare quale interrupt aver abillitato INT0 o SSPIE.

In breve o uno o l' altro e non insieme.
Penso che se intercetti un interrupt, subito disabiliti l' altro e viceversa per gli slave.



Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
23.08.2018, alle ore 13:39
Dopo un po' di tempo sto riprendendo il discorso degli interrupt su questo progetto, fino ad ora gestito con dalay.

Una domanda. Mi è stato suggerito di nn mettere delle routines bloccanti negli interrupt, ma come faccio a mettere dei ritardi e non fare in modo che la routine diventi bloccante?
Esempio. Al verificarsi di un evento, esempio l'attivazione di un sensore, devo far partire una serie di attività: controlla lo stato del resto del circuito, controlla se nel frattempo è cambiato qualcosa, rileva la velocità attuale e crea una rampa di accelerazione, alla fine della rampa vai in velocità crociera...
Ma se tutta questa roba la metto nel'interrupt questo resta attivo per qualche secondo.
Come fare allora? Attivo e disattivo delle variabili?
Suggerimenti?



Enea Ferriani
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
23.08.2018, alle ore 14:41
e.ferriani:
Attivo e disattivo delle variabili?


Sì, qualcosa del genere. La ISR deve elaborare soltanto l'evento, le azioni conseguenti verranno svolte dal Main.



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale