slavin89 Inserito: 8 febbraio 2016 Segnala Share Inserito: 8 febbraio 2016 Buongiorno a tutti recentemente mi avete aiutato a comandare l'arresto di un motore utilizzando un sensore hall e tutto è avanzato bene, ora sto sviluppando il programma definitivo nel quale devo controllare l'avvio motore tramite la pressione di un pulsante con l'istruzione if(!BTN1) { MOTORE=1; } poi utilizzando gli interrupt sull'ingresso del pic dove è collegato il sensore eseguo l'arresto void interruptISR(void) { if(INTF) { MOTORE=0; INTF=0; } } il problema è che se tengo il pulsante premuto il motore si arresta e riparte di continuo mentre io vorrei che il ciclo fosse: premo il pulsante->motore parte arresto pilotato dal sensore hall (INTF) se il pulsante continua ad essere premuto->nessuna azione se il pulsante viene rilasciato e ripremuto->rieseguo il ciclo di avvio e arresto tramite sensore secondo voi come potrei fare? ciao e grazie in anticipo Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 febbraio 2016 Segnala Share Inserita: 9 febbraio 2016 per prima cosa dovresti dire con quale PLC stai lavorando e quindi si sposta la discussione nel forum appropriato, anzi era giusto se tu l'avessi aperta nel forum PLC e nella sezione relativa al tipo di PLC che stai usando. per fare quello che vuoi il pulsante non deve comandare direttamente il motore, ma deve alzare e abbassare un flag, ovvero un bit di memeoria. Premo il pulsante, alzo il flag di marcia. Se tutte le condizioni sono corrette il motore parte. Premo nuovamente il pulsante, se il flag è alto lo abbasso. Se il flag è basso il motore si ferma. Però non sipuò, per motivi di sicurezza, usare un unico pulsante per fare marcia e arresto. E' necessario usare un pulsante di marcia ed uno di arresto, separati. Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 9 febbraio 2016 Autore Segnala Share Inserita: 9 febbraio 2016 in realtà sto utilizzando un PIC12f629. Io con il pulsante comando solo la marcia perchè l'arresto viene pilotato dal sensore hall. La cosa che non riesco a fare è di non far ripartire il motore se il pulksante non viene rilasciato..cioè se premo il pulsante devo fare un ciclo che si arresta quanto il sensore hall dà il consenso e per riavere un avvio motore devo primare togliere la pressione dal pulsante e ripremerlo. Quindi se tengo premuto il pulsante devo fare sempre e solo un ciclo spero di essere stato chiaro Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 febbraio 2016 Segnala Share Inserita: 9 febbraio 2016 Devi sentire solo transizione di stato. Il pulsante di marcia alza un flag che comada la marcia; alza inoltre un flag di memoria. Il flag di marcia sarà abbassato solo dal sensore che comanda l'arresto. Il flag di memoria sarà abbassato solo dopo che il pulsante sia stato aperto. Se questo flag non è basso lo stato di chiusura del pulsante non influenza il flag di marcia. Spero che tu l'acquisizione del pulsante la faccia con un debouncing software. Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 9 febbraio 2016 Autore Segnala Share Inserita: 9 febbraio 2016 si l'anti rimbalzo lo faccio software..non ho voluto appesantire le istruzioni qui nella discussione.. però non riesco a tradurre in codice quello che mi hai scritto..puoi farmi un esempio? Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 9 febbraio 2016 Autore Segnala Share Inserita: 9 febbraio 2016 forse ci sono..dovrebbe essere cosi if(FLAG==0) { if(!BTN1) { MOTORE=1; FLAG=1; } else { FLAG=0; } poi utilizzando gli interrupt sull'ingresso del pic dove è collegato il sensore eseguo l'arresto void interruptISR(void) { if(INTF) { MOTORE=0; INTF=0; } } vi sembra corretta? Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 febbraio 2016 Segnala Share Inserita: 9 febbraio 2016 I flags sono 2: uno flg_puls ti da lo stato del pulsante, l'altro fgl_start è il comando di marcia. Se si considera vero lo stato del pulsante premuto sarà (in pseudo "C"): If ((in_pusante == vero ) and (flg_puls == falso) and (flg_start == falso)) { flg_ start = vero; } If (in_pulsante == falso) flg_pulsante = falso; poi nell'interruopt metti falso il flg_start. Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 10 febbraio 2016 Autore Segnala Share Inserita: 10 febbraio 2016 buongiorno a tutti e grazie Livio..ha funzionato ma ho dovuto aggiungere il controllo flag pulsante. grazie mille Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 10 febbraio 2016 Segnala Share Inserita: 10 febbraio 2016 Quale controllo? Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 10 febbraio 2016 Autore Segnala Share Inserita: 10 febbraio 2016 flg_puls== vero dopo aver portati a vero anche il flg_ start Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 10 febbraio 2016 Segnala Share Inserita: 10 febbraio 2016 Si non l'ho scritto nelle istruzioni, perchè lo avevo messo nella descrizione generale. Attenzione in "C", ma anche con arduino, quando usi "==" è solo per confronto, invece quando vuoi forzare lo stato devi usare "=". Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 7 luglio 2016 Autore Segnala Share Inserita: 7 luglio 2016 Buongiorno a tutti riprendo questa discussione perchè nel tempo il mio progetto si è leggermente evoluto e riscontro qualche problema spero mi possiate aiutare..per riassumere si trattava di un progetto in cui dovevo controllare la marcia di un motore tramite un pulsante e l'arresto con un sensore hall, utilizzando un pic 12f629. La problematica attuale èche nello stesso circuito ho inserito due sensori hall che debbono comandare due azioni diverse tramite interrupt, per fare questo ho abilitato l'interrupt IOC e analizzato quanto la sorgente di interrupt è la porta "0"..nel caso sia la porta "0" deve arrestarmi il motorino. Di seguito il codice while(1) { if ((!PULSANTE) && (PULS_PREM==0) && (START==0)) { PULS_PREM=1; START=1; } if (PULSANTE) { PULS_PREM=0; } } } void interruptISR(void) { if (GPIF) { if (GPIO,0) { START=0; } GPIF=0; } } il problema è che il motore si avvia solo se tengo premuto il pulsante e nel contempo il sensore passa davanti ad un magnete ma poi l'arresto non avviene, come se non individuasse più l'interrupt eppure ho azzerato il flag dovrebbe rilevarlo nuovamente ..cosa sbaglio secondo voi? Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 8 luglio 2016 Segnala Share Inserita: 8 luglio 2016 Cosa è GPF e quando è vero? Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 8 luglio 2016 Autore Segnala Share Inserita: 8 luglio 2016 GPIF e' il flag che individua gli interrupt su cambio di stato della porta Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 luglio 2016 Segnala Share Inserita: 9 luglio 2016 E' inutile, perchè l'interrupt scatta su di una transizione da 0-->1 o da 1-->0, e questo viene deciso nella configurazione. Se vuoi azzerare il flag START ti basta scrivre nella routine di in terrupt if ((GPIO, O) == 0) { START = 0 } Link al commento Condividi su altri siti More sharing options...
slavin89 Inserita: 16 settembre 2016 Autore Segnala Share Inserita: 16 settembre 2016 Buongiorno a tutti..andando avanti con il mio progetto ho terminato di realizzare la parte hardware del progetto ma in fase di test qualcosa non va..in pratica il pulsante avvia il mio motore e l'arresto viene effettuato dal sensore hall ma se il pulsante lo tengo premuto il motore non si arresta mai come se non venisse tenuto in considerazione il flag del pulsante premuto..non ho utilizzato le resistenze di pull up esterne bensi ho abilitato quelle interne al pic..può essere quello il problema secondo voi? di seguito il codice AVVIO è l'uscita per pilotare il motore PULSANTE è l'ingresso dal pulsante pulsante è il flag del pulsante premuto (dichiarato come bit nel setting) avvio è il flag di motore in marcia (dichiarato come bit nel setting void main(void) { setting(); AVVIO=0; while(1) // eseguo un ciclo finito { if ((!PULSANTE)&&(pulsante==0)&&(avvio==0)) { pulsante=1; avvio=1; } if (PULSANTE) { pulsante=0; } if (avvio==1) { AVVIO=1; } else { AVVIO=0; } } } void interruptISR(void) { if (INTF) { avvio=0; INTF=0; } } Link al commento Condividi su altri siti More sharing options...
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