Simons Inserito: 2 marzo 2011 Segnala Share Inserito: 2 marzo 2011 salve a tutti.. vorrei sapere secondo voi qual è il metodo migliore per gestire una comunicazione seriale tra pc e pic (nel mio caso dsPIC33FJ128GP202 a 3,3V) mi spiegoil pic è usato per pilotare 3 servomotori in pwm.è possibile fare in modo che quando voglio inviare dati sulla seriale rs232 del pic (ad esempio per cambiare qualche parametro) la cosa possa essere fatta al volo senza fermare il resto del programma? una specie di console a riga di comando sulla seriale che però non blocca il resto del programma.. (ho visto alcuni esempi con le funzioni kbhit() e getch() che però restano in attesa dei caratteri da seriale e "bloccano" il programma in quel punto)utilizzo CCS C Compiler per sviluppare il programma.posso usare l'interrupt isr_RDA? grazie dell'aiuto Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 2 marzo 2011 Segnala Share Inserita: 2 marzo 2011 Se stai usando correttamente l'USART del dsPic non dovresti avere problemi. ogni volta che il buffer di ricezione riceve si scatena un interrupt, quindi l'applicazione principale si interompe per lo stretto necesario del servizio all'interupt.Ovviamente è necessario valutare quanta percentuale di CPU assorbe il tuo programma di controllo dei motori.Il "C" della CSC io lo uso per i pic a 8 bit ed è abbastanza ottimizzato. Con i dsPic uso HiTec ed anche quello non mi ha mai causato problemi. Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 3 marzo 2011 Autore Segnala Share Inserita: 3 marzo 2011 ciao Livio, grazie della risposta..l'interrupt di cui parli, non ho capito se si scatena a ogni carattere ricevuto oppure se invio una sequenza di caratteri (esempio invio "P00=1") se viene scatenato solo alla ricezione del terminatore "a capo".oppurel'interrupt viene scatenato al primo carattere, e avvio un loop finchè non ricevo un carattere terminatore (magari con un timeout) ?inoltre per convertire una stringa numerica (nel mio caso il numero "1" accanto all'uguale) posso usare la funzione atoi?grazie dell'aiuto.. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 3 marzo 2011 Segnala Share Inserita: 3 marzo 2011 L'interrupt Rx si attiva ad ogni carattere ricevuto. la routine di servizio, solitamente, si limita a trasferire il carattere dal buffer dell'usart al buffer di Rx. Lo svuotamento del buffer Rx dell'usart riabilita automaticamente l'interrupt. Se la routine è fatta decentemente comporta un centinaio di ns di tempo CPU (dipende dal clock) porchè son meno di 5 istruzioni totali.Poi l'elaborazione dei caratteri ricevuti sarà fatta secondo le condizioni previste dal programma. In genere testo sempre se ricevo "CR" che è il terminatore. Se ricevo questo carattere alzo un flag che andrò a testare qaundo la CPU non ha operazioni più pressanti da eseguire. Ma qui entriamo in argomenti più legati allo scheduling. Link al commento Condividi su altri siti More sharing options...
RESNIC Inserita: 7 marzo 2011 Segnala Share Inserita: 7 marzo 2011 Ciao,Io sto utilizzando DSPic33 per effettuare altri compiti, oltre che alla gestione Comunicazione:void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void){unsigned char Pippo; if (U1STAbits.PERR==1) { Pippo=1; } if (U1STAbits.OERR==1) { U1STAbits.OERR=0; } Buffer_in[Puntatore_Buffer_in]=U1RXREG; // Salva il Valore nel Buffer recezione Puntatore_Buffer_in++; IFS0bits.U1RXIF = 0;}Poi su altra routine:if (Puntatore_Buffer_in>=Target_puntatore) { if (CRC16(Buffer_in,Target_puntatore-2,1)==0) { Errori_Trasmissione++; CANCELLA_BUFFER(buff); } else { ecc eccDiciamo che in questo caso è il DSPic 33 che fa da Master, e quindi ho scritto routine, sapendo quale dovesse essere lunghezza d'arrivo. 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