Comunicazione seriale tra Labview ed i microcontrollori 8051

Comunicazione seriale tra Labview ed i microcontrollori 8051

Karl sta lavorando su un progetto di ricerca universitario usando Labview, ma non ha alcuna precedente esperienza con la programmazione dei controllori embedded e avrebbe bisogno di un consiglio.

In particolare, vorrebbe consigli per stabilire una comunicazione tra il microcontrollore 8051 e LabVIEW.

Karl vuole usare LabVIEW per leggere l’output seriale dalla ISR-Driven Serial I/O V2 (http://www.keil.com/download/docs/200.asp) usato su un microcontrollore C8051F300.

Il codice C compila senza errori o avvisi:

void main (void)
{
com_initialize ();              /* initialize interrupt driven serial I/O */
com_baudrate (1200);            /* setup for 1200 baud */

EA = 1;                         /* Enable Interrupts */

printf ("Interrupt-driver Serial I/O Example\r\n\r\n");

while (1)
  	{
  unsigned char c;

 		 printf ("Press a key.\r\n");
  		c = getchar ();
 		 printf ("\r\n");
  		printf ("You pressed '%c'.\r\n\r\n", c);
 	 }
}

Il programma sembra bloccarsi prima della riga printf e Karl pensa che possa essere un problema con com_initialize() o com_baudrate.
L’unico cambiamento che ha fatto è che ha cambiato XTAL (vedi il codice qui sotto).

La funzione originale:

void com_baudrate ( unsigned baudrate)
{
/*------------------------------------------------
Clear transmit interrupt and buffer.
------------------------------------------------*/
TI = 0;             /* clear transmit interrupt */
t_in = 0;           /* empty transmit buffer */
t_out = 0;

/*------------------------------------------------
Set timer 1 up as a baud rate generator.
------------------------------------------------*/
TR1 = 0;            /* stop timer 1 */
ET1 = 0;            /* disable timer 1 interrupt */

PCON |= 0x80;       /* 0x80=SMOD: set serial baudrate doubler */

TMOD &= ~0xF0;      /* clear timer 1 mode bits */
TMOD |= 0x20;       /* put timer 1 into MODE 2 */

TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));

TR1 = 1;            /* start timer 1 */
}

Cambiata seconda con l’ultima riga:

TH1 = (unsigned char) (256 - (24500000 / (16L * 12L * baudrate)));

Gli potete dare una mano?

Stefan propone di:

prova a settare TI

TI=1;

Prima della chiamata printf(…) dovrebbe funzionare

Hans dice:

Dovresti verificare se questo baudrate può essere usato con questa frequenza di oscillazione del quarzo. Fai una doppia verifica del codice C51 che si occupa del calcolo del baudrate.

Barry:

Ecco alcuni suggerimenti:
1. Compila il codice, carica e lancia il simulatore. Stop e verifica il valore del registro TH1, è quello che ti aspetti?
2. Guarda la finestra con i dati della porta seriale, i valori sono corretti?
Usa il SIN vtreg e verifica se viene eseguito correttamente.
3. 24.5 MHz sembra un po troppo alto per un baudrate di 1200, sei sicuro del baudrate?
4. Puoi usare il simulatore per verificare la porta seriale sul tuo PC. Collega un secondo PC con Labview ed esegui i vari test.
5. Collega un oscilloscopio per verificare il baurate della porta seriale. Questo è il velo valore di baudrate!

Alla fine TUTTO FUNZIONA!
Ho corretto il baudrate e mi sono assicurato che TH1 avesse il valore che mi aspettavo.
Grazie,
Karl

STAMPA     Tags:,

Leave a Reply