MECCANICA e DINTORNI

COSTRUIAMO LE NOSTRE CNC DIVERTENDOCI CON L'AIUTO DI TANTI PROFESSIONISTI ESPERTI
Oggi è mar mag 14, 2024 05:25

Tutti gli orari sono UTC +1 ora




Apri un nuovo argomento Questo argomento è bloccato, non puoi modificare o inviare ulteriori messaggi.  [ 1423 messaggi ]  Vai alla pagina Precedente  1 ... 88, 89, 90, 91, 92, 93, 94, 95  Prossimo
Autore Messaggio
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 17:30 
Non connesso
FINALMENTE USO IL TORNIO

Iscritto il: mar nov 10, 2009 12:36
Messaggi: 564
Località: Udine
Tutto quello che c'e' nel ciclo for fa parte della routine di interrupt.
NON e' il codice della vite elettronica ma solo dell'interrupt, messo dentro un ciclo for per misurarne la velocita' (salvo micros() in una variabile, faccio girare 100 mila volte il codice che voglio testare, alla fine sottraggo micros() a quello che avevo letto e ottengo il tempo che ci ha messo ad eseguire il ciclo for. Divido per 100.000 e ottengo il tempo che ci mette a fare il pezzo di codice che mi interessa testare).

A scanso di equivoci, ti allego il codice completo.
Si, in effetti leggo un canale dell'encoder in pooling all'interno dell'interrupt. Ma tramite la lettura diretta dei registri (vedi il define di DREAD) e' abbastanza veloce.

Per quanto riguarda la funzione firestep() diventata un #define, non sapevo si chiamassero macro.
L'ho messa cosi' perche' analizzando il codice con Mecha mi aveva fatto notare che chiamavo una funzione all'interno di un interrupt (e si pensava potesse rallentare l'esecuzione dell'interrupt).
In realta' non cambia nulla, la velocita' e' praticamente la stessa (evidentemente il compilatore fa gia' una buona ottimizzazione).
Ho lasciato lo stesso nome firestep() solo per comodita' di non cambiare il nome all'interno del codice, avrei potuto chiamarla SPARAunCOLPO che il concetto non sarebbe cambiato (o, meglio, sostituire firestep() con TCNT1=65533; ma visto che lo fa gia' il compilatore al posto mio ho risparmiato fatica)


Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 18:19 
Non connesso
TORNITORE E FRESATORE

Iscritto il: lun set 29, 2008 23:19
Messaggi: 1781
Località: Cologno Monzese
Ti do i miei 2 cent professionali, ma poi il codice è tuo e fai come preferisci. Ciò che hai fatto con la macro non si fa semplicemente perché non è parlante. Soprattutto con arduino che splitta il codice in più file. Se hai in 10 file diversi quella chiamata, un altro programmatore che leggerà il tuo sorgente non capirà mai che stai facendo al primo sguardo, e lo costringi ogni volta a cercarla per capire. In generale, non nel tuo caso perché non ho visto il tuo codice, funzioni e soprattutto variabili devono essere parlanti, non k j x o kmix() scrivi() leggi() ecc..sono regole di buonsenso, come il camelCase o gli _ prefix nelle variabili private delle classi, che velocizzano la manutenzione del codice...

_________________
Ù.


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 19:09 
Non connesso
FINALMENTE USO IL TORNIO

Iscritto il: mar nov 10, 2009 12:36
Messaggi: 564
Località: Udine
Chiaro. Sapevo già di questa regola ma sul momento il nome della variabile/funzione/macro/ecc... mi sembra sensato e chiaro. Poi mi accorgo che neanche io capisco cosa ho scritto.
Nel caso specifico la funzione (poi diventata macro per provare) è abbastanza chiara. La sua funzione è sparare un impulso di step e McMax, giustamente, l'ha chiamata firestep.
Comunque io sono autodidatta e pasticcione, il mio codice è scritto male e commentato peggio. Me ne rendo conto quando, a distanza di tempo, devo rimettere mano al codice. A volte ho preferito ricominciare da capo piuttosto che cercare di capire cosa ho fatto...


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 19:58 
Non connesso
APPRENDISTA E ADDETTO ALLE PULIZIE

Iscritto il: gio lug 05, 2012 13:17
Messaggi: 8
Località: Roma
Mimoletti hai recuperato il programma per Mega? Se non puoi allegarlo non fa niente... Quale sarebbe il programma del russo? È gratis?
Grazie


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 20:37 
Non connesso
TORNITORE E FRESATORE

Iscritto il: dom dic 27, 2009 11:31
Messaggi: 1140
Località: Torre del Greco (NA)
Non ancora, non ci siamo incontrati. Prova con quello del russo.

_________________
Solo gli stupidi non cambiano mai idea!

Tornio Wabeco D6000 con ELS; Fresa Wabeco F1210; Segatrice Nebes TM125 Inverter; Tavola a dividere Vertex HV-6,Morsa meccnica Allen MAP/78-N

https://www.youtube.com/watch?v=cobEZI8KvOk


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 20:55 
Non connesso
APPRENDISTA E ADDETTO ALLE PULIZIE

Iscritto il: gio lug 05, 2012 13:17
Messaggi: 8
Località: Roma
Link al russo? Grazie


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 22:11 
Non connesso
CAPO OFFICINA
Avatar utente

Iscritto il: dom gen 31, 2010 21:46
Messaggi: 8857
Località: Bussero (MI)
Matteou, mi piacerebbe capire come mai vuoi eseguire tutto quel codice sotto interrupt ma senza commenti, scusami, non riesco a seguirlo.
Una prima considerazione che faccio è che io non farei mai una routine di interrupt così complicata e soprattutto così lunga. L'nterrupt per definizione deve essere una singola azione che non può essere ritardata dal resto del codice. Nell'applicaizone specifica del ELS l'interrupt deve essere la lettura dell'encoder che, come output, deve avere un incremento o un decremento di passo. Tutto il resto non è prioritario e deve essere eseguito al di fuori della routine di interrupt.

Altra cosa che non capisco è perché vuoi tenere sotto interrupt un solo canale dell'encoder e leggere l'altro in polling (anche se questo non è un polling ma un semplice controllo) solo per determinare la direzione. Tra l'altro, così facendo, sfrutti solo la risoluzione nominale dei passi e non x4. Cioè in pratica stai facendo fare al micro quello che normalmente si fa fare esternamente ad un flip-flop, ovvero una logica a stati hardware che costa niente ed è molto più veloce di un codice.... non mi pare molto efficiente.
Ragiona sul fatto che la routine di interruppt ti serve solo per intercettare il passo dell'encoder istantaneamente, tutto il resto è conseguenza di quel passo ma non dovrebbe essere fatto nella routine di interrupt.

Questa è la mia, con i tempi di esecuzione stimati (il calcolo fatto usando il clock di arduino micros() o millis() non è molto affidabile)

Codice:
void InterruptEncoderFilettatura()
{
static byte prev_encoder; //definizione di variabile byte (1 ciclo di clock: 62,5 nanosecondi)
byte port; //definizione di variabile byte (1 ciclo di clock: 62,5 nanosecondi)

port = PIND & B00001100; //and logico tra due byte e trasferimento indiretto (3 cicli di clock: 187,5 nanosecondi)
port |= prev_encoder; //or logico tra due byte e trasferimento indiretto (3 cicli di clock: 187,5 nanosecondi)
steps += encoder[port]; //addizione tra due valori e trasferimento indiretto (3 cicli di clock: 187,5 nanosecondi)
absolute_encoder_steps += encoder[port]; //addizione tra due valori e trasferimento indiretto (3 cicli di clock: 187,5 nanosecondi)

port >>= 2; //shift a destra di due posizioni (2 cicli di clock: 125 nanosecondi)
prev_encoder = port; // load indiretto di 1 byte (2 cicli di clock: 125 nanosecondi)
step_flag = true; // cambio di stato logico di variabile boolean (1 ciclo di clock: 62,5 nanosecondi)
} //END of the Interrupt Service Routine


I calcoli sono stimati tenendo conto del clock di Arduino UNO a 16Mhz (62,5ns a ciclo)
In totale sono 1187,5 ns. Ovvero 1,1875 us.
Stiamo larghi e consideriamo anche il tempo di chiamata e push/pop dallo stack, direi che in 2us facciamo tutto comodamente.
Mi pare strano che la tua impieghi solo 4us, anche considerando che se fai operazioni tra variabili a 16 bit impieghi molti più cicli.

_________________
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: dom nov 21, 2021 22:49 
Non connesso
FINALMENTE USO IL TORNIO

Iscritto il: mar nov 10, 2009 12:36
Messaggi: 564
Località: Udine
Adesso sono sul telefono e mi fa fastidio scrivere troppo, quindi rispondo velocemente.
McMax, non sono d'accordo. La lettura dell'encoder e la generazione degli step devono avere la stessa priorità. Se la mia routine riesce a leggere tutti i passi di encoder ma il resto del programma non riesce a generarmi tutti gli step sono fregato al pari di perdermi un impulso di encoder (carro e mandrino non saranno più in Sincro in entrambi i casi).
Quindi tanto vale mettere tutto nella routine di interrupt o sbaglio ragionamento?
Al banco sembra funzionare ma la prova è da fare sul tornio (spero prossimi giorni).
Al resto rispondo dal PC, molto più comodo :cool:


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 00:51 
Non connesso
CAPO OFFICINA
Avatar utente

Iscritto il: dom gen 31, 2010 21:46
Messaggi: 8857
Località: Bussero (MI)
No Matteou non sbagli ragionamento, il tuo è un errore di concetto.
Ricordati sempre che stai programmando un microcontrollore, non un codice che gira su un PC con dietro un sistema operativo col suo livello di astrazione dell'hardware. Qui è l'hardware che devi controllare, e sono i tempi di reazione dell'hardware quelli a cui ti devi adattare.
Iniziamo col capire come mai ti serve un interrupt: essenzialmente per intercettare un input (encoder) a prescindere da cosa il codice stia facendo in quel momento. Senza l'interrupt la lettura dell'encoder andrebbe fatta in polling, ovvero restando ad "ascoltare" i pin di ingresso encoder in attesa del momento in cui cambiano di stato. Ma questa operazione è assolutamente inefficiente visto che:
- ci costringe a stare in un loop dove a cadenza regolare devo controllare lo stato degli ingressi
- non è detto che ci faccia intercettare l'evento nel momento stesso in cui avviene: se ad esempio sto facendo altro e l'encoder cambia di stato potrei accorgermene in ritardo fino al caso in cui mi perdo addirittura l'evento perché mentre avveniva i codice stava facendo altro.
Con l'interrupt sono sicuro che qualsiasi cosa io stia facendo in quel momento, il programma darà precedenza (o priorità) all'evento di interrupt fermando temporaneamente l'esecuzione del resto del codice. Ma attenzione, l'evento di interrupt NON evita la normale esecuzione del programma, semplicemente la ritarda.
Ma cosa succede se stai eseguendo la routine di interrupt e si genera un altro evento che dovrebbe generare un interrupt? semplice: te lo perdi! La chiamata all'interrupt attiva un flag che si resetta solo quando la chiamata termina, quel flag evita che un altro interrupt possa interrompere l'esecuzione dell'interrupt corrente quindi, mentre sto gestendo un interrupt, non ne posso gestire un altro. In realtà non è del tutto vero perché esistono anche interrrupt a diversa priorità che si possono chiamare uno sull'altro (si chiama "nesting") ma direi che siamo fuori scopo con un microcontrollore così modesto.

Tutto questo per dire che l'interrupt deve essere un'eccezione, un evento prioritario non mascherabile che si genera e si deve esaurire nel più breve tempo possibile.
Non so che lavoro tu faccia ma immagina che il tuo capo ti dia 10 lavori da fare: di questi ce ne saranno alcuni più urgenti rispetto ad altri, e magari uno o due più urgenti di tutti. Normalmente assegni le priorità corrette ed esegui subito i più urgenti per poi passare a quelli meno urgenti e poi ai meno urgenti ancora. Ma se a certo punto diventassero tutti urgenti sarebbe uguale ad averli tutti non urgenti visto che avrebbero tutti lo stesso livello di priorità! Ed a quel punto a cosa ti servirebbe la priorità.. e quindi l'interrupt ?
Tu praticamente stai facendo fare tutto il lavoro alla routine di interrupt ma, ricordi a cosa ci serviva? A leggere l'encoder, e solo a quello! Ma perché serve solo a quello? Semplice, perché quello è l'evento che accade (il cambio di stato del pin encoder) che non è controllato dal codice, avviene da solo, randomicamente (non esattamente ma per il codice è come se lo fosse), quindi il codice deve essere in grado di intercettarlo a prescindere da quello che sta facendo.
La generazione del passo per lo stepper invece è controllata dal tuo codice, sei tu che decidi quando farlo, non avviene randomicamente.

_________________
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 07:34 
Non connesso
TORNITORE E FRESATORE

Iscritto il: lun set 29, 2008 23:19
Messaggi: 1781
Località: Cologno Monzese
Max, potrei farti un'osservazione, ovvero quando entro nell'handler dell'interrupt riattivo il flag globale cosi va in catch su un altro interrupt ;-)
Ma sappiamo TUTTI che è una FOLLIA farlo poichè potrebbe generare un loop infinito...

_________________
Ù.


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 10:11 
Non connesso
CAPO OFFICINA
Avatar utente

Iscritto il: lun feb 29, 2016 11:29
Messaggi: 13621
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
OT - On
Visto che in questo thread si usano pochi termini in inglese, potreste coinvolgere anche Carlo1974 che voglio vedere cosa salta fuori ? :lld:
OT- Off

_________________
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 10:46 
Non connesso
CAPO OFFICINA
Avatar utente

Iscritto il: dom gen 31, 2010 21:46
Messaggi: 8857
Località: Bussero (MI)
Davide, Carlo è il benvenuto se vuole partecipare alla discussione :mrgreen:
Non sono un fan degli inglesismi ma purtroppo quando si tratta di elettronica e informatica a volte i termini in italiano nemmeno esistono :risatina:

_________________
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 16:18 
Non connesso
APPRENDISTA E ADDETTO ALLE PULIZIE

Iscritto il: gio lug 05, 2012 13:17
Messaggi: 8
Località: Roma
Ho provato con soddisfazione la versione originale ora stavo cercando di vedere come funzionava la versione di sbinf sia per il cablaggio più semplice che per vedere il menù avanzamento, perchè nella versione che ho provato, forse a causa mia (ma non sono così esperto per capirlo), non riesco a utilizzarla per fare un avanzamento vincolato...
provando la versione I2C l'arduino IDE mi da continuamente errori di compilazione a causa della libreria LCD, volevo chiedere a sbinf se può ricaricare la sua versione aggiornata come aveva detto per poter vedere se così riesco a utilizzarla, grazie.
Ho messo il sistema su un myford Super 7, se qualcuno ne avesse bisogno ho disegnato e rendo disponibili anche qui (basta chiedere e li carico, non lo faccio subito per evitare di sporcare il thread) gli stl delle pulegge MXL da 10,12, 26 e 36 denti con scasso adatto alla barra filettata da 16mm del tornio e trascinamento a chiavetta e compatibili (le piccole) con un asse stepper da 6,35mm.


Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 18:57 
Non connesso
TORNITORE E FRESATORE

Iscritto il: ven nov 21, 2008 14:34
Messaggi: 1343
Località: Roma
Eccola ho usato la libreria proposta dal libray manager di arduino

Allegato:
libreria_usata.GIF


Per quanto riguarda l'avanzamento vincolato effettivamente ho fatto delle modifiche proprio perchè anche io avevo incontrato delle difficoltà nell'interazione con questo menù.


Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

_________________
-->I MIEI VIDEO<--


Ultima modifica di sbinf74 il lun nov 22, 2021 21:18, modificato 1 volta in totale.

Top
 Profilo  
 
 Oggetto del messaggio: Re: ELS (Electronic Lead Screw) - progetto con ARDUINO
MessaggioInviato: lun nov 22, 2021 19:05 
Non connesso
APPRENDISTA E ADDETTO ALLE PULIZIE

Iscritto il: gio lug 05, 2012 13:17
Messaggi: 8
Località: Roma
Grazie mille!! Molto gentile


Top
 Profilo  
 
Visualizza ultimi messaggi:  Ordina per  
Apri un nuovo argomento Questo argomento è bloccato, non puoi modificare o inviare ulteriori messaggi.  [ 1423 messaggi ]  Vai alla pagina Precedente  1 ... 88, 89, 90, 91, 92, 93, 94, 95  Prossimo

Tutti gli orari sono UTC +1 ora


Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Cerca per:
Vai a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzione Italiana phpBB.it