e.ferriani: Forse sto sbagliando strada ad utilizzare parti di codice esistenti
Secondo un vecchio detto "la pianta si raddrizza, fintanto che è piccola".
Prendiamo il caso di questa routine di servizio interruzioni (ISR).
Ora si sta a vedere se i due ingressi vanno da bassi a alti. Se li hai configurati con le resistenze di pull-down. ALTRIMENTI hai già un difetto, oppure la verifica del programma è inversa.
Per questo fai girare main() vuoto e metti solo un segnale se i due flag cambiano di stato.
void main()
{
Settaggi();
INTCONbits.GIE = 1;
while (1)
{
if (avvio_premuto) // non si puo` riagganciare senza arresto_premuto
{
RC6 = 1; // sondare se hai un risultato
arresto_premuto = 0;
}
if (arresto_premuto) // non si puo` riagganciare senza avvio_premuto
{
RC7 = 1; // sondare se hai un risultato
avvio_premuto = 0;
}
}
}
Avvenuto questo risultato, passiamo a un livello di interfaccia visiva con l' operatore. Mettiamo l' LCD.
void main()
{
Settaggi();
LCD_INIT();
INTCONbits.GIE = 1;
while (1)
{
// aggiornamento informazioni una volta al secondo, meglio non tartassare
// il display frequentemente
if (millisec >= 1000)
{
millisec = 0;
LCD_CLEAR();
if (avvio_premuto) // non si puo` riagganciare senza arresto_premuto
{
lcd_gotoxy(1,1);
lcd_puts("ingresso RC6 OK");
arresto_premuto = 0;
} else { // altrimenti non visualizziamo
lcd_gotoxy(1,1);
lcd_puts(" ");
}
if (arresto_premuto) // non si puo` riagganciare senza avvio_premuto
{
lcd_gotoxy(2,1);
lcd_puts("ingresso RC7 OK");
avvio_premuto = 0;
} else { // altrimenti non visualizziamo
lcd_gotoxy(2,1);
lcd_puts(" ");
}
}
}
}
Verifica queste due fasi. Poi passiamo ad livello successivo
Caldo consiglio :
evitare l' uso dei (delay()). Meglio implementare un metodo diverso.
evitare nomi eccessivamente lunghi. Già con tre di questi in una funzione si
rischia di avere righe troppo larghe.
Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675
postato il: 14.09.2018, alle ore 10:06
Ah!, c'è un piccolo difetto che una volta che il flag passa, in main() la condizione viene eseguita tutte le volte.
Piccola modifica.
meglio essere un granello di pepe che una cacca d'asino
picmicro675
postato il: 14.09.2018, alle ore 11:07
Questa è solo una valutazione nel caso si voglia o meno che l' evento venga preso in considerazione una o più volte. Per esempio potrebbe essere il caso che invece si voglia l' autoritenuta, quindi basta un colpetto. Se invece bisogna tenerlo premuto allora il primo caso potrebbe essere una necessità e una piccola variazione anche nella ISR che determina il cambio di stato. Però per questo caso, direi che diventa inutile passare dalla ISR, meglio leggere il piedino direttamente.
Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani
postato il: 14.09.2018, alle ore 13:08
Per i nomi lunghi, ieri sera non l'ho scritto, sono rimasti quelli che erano, non ero in condizioni di ripensare a tutti i nomi, ma è da fare, mi rendo conto che alcuni siano particolarmente lunghi.
Per i delay vedrai, salvo errori od omissioni, che li ho lasciati solo nella parte di inizializzazione del mail, prima del while. Nel resto del codice non ci dovrebbero essere. Forse nel display che mi ha passato PrimoK, ma non ricordo. dovrei guardarci.
Passiamo alle verifiche.
I pulsanti funzionano entrambi. Non ricordo se c'è un pull-up o pull-down, ma se ne rilevo lo stato se è alto presumo ci siano dei pull-down, ed il pulsante chiuda al V+.
Ad ogni modo funzionano..
Sai però quando non sai più se è questione di quello che hai scritto e ti vengono dei dubbi a volte anche infondati?
Ho provato a caricare il vecchio codice quello senza gli interrupt ne TMR0, e funziona tutto perfettamente, con i vizi che aveva quel codice, ma funziona, quindi è una questione di compatibilità tra quanto scritto nella parte riguardante I2c e quelle relativa al TMR0.
Per quanto riguarda i tuoi metodi, non escludo l' impossibilità di funzionare. Hai solo la differenza che le operazioni seguono un ciclo irregolare. Hai la probabilità che se uno slave non risponde, sei bloccato ad aspettare e tutto il traffico ferroviario perde il controllo.
Tale ciclo, visto il sorgente, legge i 5 slave e fa le operazioni di aggiornamento della console operatore. Ci sta anche che si risolve in 5 millisecondi.
Lo potresti anche vedere se metti un segnale in fondo al while da vedere all' oscilloscopio.
Se va bene quello, allora hai risolto come l' hai voluto. Magari se interessa capire altri metodi allora sono disposto a dare altri aiuti.
Infatti non esiste internamente il pull-down (per la maggior. parte degli integrati Microchip) Solo che la routine rileva uno stato alto. Quindi significa che normalmente deve stare basso.
Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani
postato il: 14.09.2018, alle ore 19:19
Tutto corretto, tranne per i tempi che hai ipotizzato. Sono ancora un po' scarso, non mi permetto e non saprei se e come correggerti.
Per il resto mi scrivi, nel messaggio precedente a questo, che il master sta comunicando con 5 slave.
Qui ti correggo.
Come da codice inserito in precedenza, il mio ultimo della pagina 17, vedi che il master lo sto facendo comunicare SOLO con lo slave 1, all'indirizzo "I2C_Master_Write(0b00000010);", e gli passo una istruzione anonima "I2C_Master_Write(0b00110011);" tanto per vedere se sul bus entra qualcosa.
Come detto, se attivo I2C con interrupt sul bus non ci finisce niente. Se disattivo l'iterrupt funziona.
Proprio ora sto riguardandoci e ti confermo quanto ho scritto.
La comunicazione con questo unico dura circa 500uS, qualcosa meno
Enea Ferriani
e.ferriani
postato il: 14.09.2018, alle ore 21:17
e.ferriani:
...
La comunicazione con questo unico dura circa 500uS, qualcosa meno
Mi correggo, 300uS esatti.
Enea Ferriani
picmicro675
postato il: 15.09.2018, alle ore 03:10
Per l' invio di un solo byte ?
Direi che è elevato. Secondo il mio ragionamento si dovrebbe poter inviare 16 bytes in circa 200 uS. Sempre che sia impostata la trasmissione tramite interrupt. Un calcolo del solo periodo che lo slave conclude la ricezione.
Attenzione penso che l"interrupt vada disattivato, se tutta la routine è via software, altrimenti cè una continua chiamata all"int senza che questo flag(?) che non ricordo venga azzerato.
meglio essere un granello di pepe che una cacca d'asino
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