Vai al contenuto
PLC Forum


Interrupt Rs232 E Dspic33


Simons

Messaggi consigliati

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 spiego

il 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 smile.gif

Link al commento
Condividi su altri siti


Livio Orsini

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

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".

oppure

l'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

Livio Orsini

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

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 ecc

Diciamo 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

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...