Newsgroup: it.hobby.elettronica.digitale
Titolo: non ho capito come funziona la seriale in questo micro( o in generale?)

chiedo gentilmente delucidazione:
 
sto usando un freescale 9s12
tengo alto un pin dalla chiamata al ritorno di una funzione che dovrebbe 
trasmettere vari bit su seriale per triggerarmi su oscilloscopio
e vedere quanto dura l'esecuzione della funzione chiamata Trasmetti_Bytes();
la funzione chiamata dovrebbe trasmettermi alcuni bytes su 
seriale,schematizzo con valori a caso:
 
void Trasmetti_Bytes(void)
{
  result=AS1_SendChar(0xAA);
  result=AS1_SendChar(0x3);
  result=AS1_SendChar(0x8);
  result=AS1_SendChar(0x9);
  }
 
mi aspettavo di vedere un impulso alto della durata dei 4 caratteri 
trasmessi e invece mi vedo un impulso brevissimo,pi� breve di un singolo bit 
di un carattere trasmesso,allora mi vado a vedere come � fatta la funzione 
AS1_SendChar
 
la funzione AS1_SendChar � stata generata da uno wizard ,e se lo Shift 
register di trasmissione � vuoto carica  i dati nel registro dati di TX 
,altrimenti termina subito dando errore:
 
byte AS1_SendChar(AS1_TComData Chr)
{
 / * Is the transmitter empty? */
 if(!SCI0SR1_TDRE) {   return ERR_TXFULL;}/* If no then error */
 SCI0DRL = (byte)Chr;
  return ERR_OK;                       /* OK */
}
 
per cui mi dico che avviene questo, la funzione AS1_SendChar,come penso sia 
normale,viene svolta nel breve tempo necessario a caricare il registro 
dati,poi ci pensa l'hardware
 
anche se ci sono 4 chiamate a funzione queste verranno svolte in poco 
tempo,la prima trasmette,e le altre escono subito,poich� sono effettuate 
mentre � in corso la trasmisione del 1�byte
 
allora modifico brutalmente cos�:
 
byte AS1_SendChar(AS1_TComData Chr)
{
 / * Is the transmitter empty? */
 while(!SCI0SR1_TDRE) ;//se non � vuoto aspetta
 SCI0DRL = (byte)Chr;
  return ERR_OK;                       /* OK */
}
 
per cui deve stare nella funzione fin quando non ha trasmesso
 
eppure anche qui succede una cosa strana
 
l'impulso indicante la chiamata a Trasmetti_Bytes();
finisce mentre devono essere trasmessi ancora 2 bytes(che vengono 
trasmessi).
 
in conclusione:
non capisco come possa essere avviata la trasmissione dell'ultimo byte 
mentre � ancora in corso quella del penultimo
come se il registro dati venisse caricato dall'ultimo byte mentre � ancora 
occupato lo shift register che sta trasmettendo il penultimo
 
grazie
 
 
 
 
 

 occupato lo shift register che sta trasmettendo il penultimo
 
 
Se ho ben capito cosa intendi, mentre il penultimo byte è in 
trasmissione puoi già caricare l'ultimo byte nell'SCI e sia la funzione 
AS1_SendChar che la tua Trasmetti_Bytes ritornano "con 2 byte di anticipo".
 
Ti consiglio però di non seguire questa strada (di attendere con un loop 
il flag TRDE).
 
Creati un buffer circolare (meglio se di grandezza pari a una potenza di 
due, viene più facile). Quando vuoi trasmettere dei dati li carichi nel 
buffer tramite una funzione che si occupa anche di avviare la 
trasmissione del primo byte, se non fosse già attiva.
 
Poi tramite l'interrupt sul TRDE carichi il byte successivo fino a che 
hai svuotato il buffer.
 
Così hai un impegno minimo delle risorse (ad ogni interrupt devi solo 
spostare 1 byte, aggiornare gli indici del buffer e poco altro) ma 
soprattutto non hai alcun blocco della tua applicazione durante la 
trasmissione.
 
Ciao
Marco
 
 


grazie Marco,questa sarebbe stata la domanda successiva ,perch� lasciare un 
microcontrollore dual core(9S12X)in attesa del termine di una trasmisione 
seriale non mi sembrava una bella cosa