pm.astra2dve
Digital-Forum Senior
Il 16F84 che ha provato a usare Maxicono ha la EEPROM interna da soltanto 64 byte, se nell'arco di movimento del motore deve contare più di 256 impulsi allora per ogni posizione bisogna usare 2 byte, il che fa scendere a 32 le posizioni memorizzabili. Se poi si aggiunge il fatto che oltre alle posizioni bisogna memorizzare anche altri valori non perdibili (conteggio dei limiti, ultima memoria richiamata) ed eventualmente i registri di stato, capisci che la EEPROM interna al 16F84 non basta.
Il mio 16F876 ha 256 byte in tutto, quindi 128 posizioni a 16 bit, limitandole a 99 c'è spazio a sufficienza per tutti i dati di controllo
Nel 16F84 per implementare la gestione dei protocolli I2C (memorie 24Cxx) o SPI (memorie 93Cxx) bisogna scriversela a mano, perchè quel modello di PIC non dispone di ricetrasmettitore sincrono integrato.
Il 16F876 invece ha sia il controller sincrono che può funzionare in I2C o SPI, sia il ricetrasmettitore asincrono seriale per il telecomando. Una volta impostato a dovere, basta scrivere nei 2 registri specifici l'indirizzo, il comando o il byte da scrivere o leggere e il processore si occupa della trasmissione autonomamente, segnalando lo stato (fine trasmissione, errore ecc.) con un interrupt (quindi il PIC può tornare in attesa di altro mentre scrive o legge dalla memoria esterna).
Forse sono riuscito a eliminare comodamente il gruppo contatore esterno e il rivelatore di transizione (monostabile). Questo perchè ho modificato la logica di gestione dell'impulso dal motore: prima ogni impulso dal sensore veniva gestito in un interrupt handler che, avendo i contatori esterni, doveva soltanto verificare che il numero contato corrispondesse a quello richiesto dal richiamo memoria. Il problema è che tutti i PIC16 possono vettorizzare un solo interrupt alla volta, quindi mentre sto servendo l'interrupt gestione dell'impulso non posso accettare segnali dal telecomando, e viceversa.
Implementando il registro contatore in software, a ogni interrupt avrei dovuto gestirlo io (aumenta decrementa azzera carica ecc.), e nel caso mi arrivi un impulso mentre è in servizio la ricezione dal telecomando quell'impulso viene perso, il contatore non lo conta e va tutto a rotoli
La modifica consiste nell'eliminare l'interrupt dall'impulso, ma bensì utilizzare la tecnica del polling. Questo perchè tutti i casi in cui deve essere gestito il contatore prevedono che il processore sia più o meno occupato; quando faccio STEP devo sempre attendere l'impulso successivo per fermare il motore, al richiamo memoria devo sempre leggere gli impulsi per confrontare il numero contato con quello richiamato, il comando MOVE che con il contatore esterno può anche non richiedere di leggere gli impulsi richiede comunque il controllo se è stato raggiunto il limite e se ho premuto STOP per fermarlo. Quindi integrare qualche routine che si occupa di gestire il contatore non è troppo difficile
La rimozione del monostabile si può fare grazie al fatto che io elimino sì il conteggio tramite interrupt, ma il piedino che usavo per entrare con gli impulsi (PB0/INT) è dotato di un rivelatore di transizione, cioè può informare la CPU che l'onda ha cambiato stato, inoltre è programmabile per rilevare solo le salite o solo le discese, ma non entrambi e a me questo fa comodo
P.S. chi ha lo Jaeger H-H mi può dire quanti impulsi escono dal sensore per percorrere i 180° che copre? Non ho ancora fatto le prove...