Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
11/11/04 10:00
Read: times


 
#81026 - UART 9-Bits Mode Operation
Dear all,

Here is a question about UART serial mode 3, 9-bit and variable
baud rate, on a pair of ADuC814. For the best efficient serial
communication, I wrote a program that works as follow.

ADC routine sends 2 data with 9th bit by 3 bytes for 1 cycle.
DAC routine receives these data and make some DA conversion in
accordance with the 9th bits by transmittion part and flags by reception part.
Because of that this chip has 12-bit resolution, I thought this method is the best
to serially communicate. The programs recognize which is which by 9th bits and flags.
+--------+--------+--------+--------+--------+--------+--------+--------+
|9th bit |    1   |    0   |    0   |    1   |    0   |    0   |        |
|data bit|HHHHLLLL|LLLLHHHH|LLLLLLLL|HHHHLLLL|LLLLHHHH|LLLLLLLL| repeat |
|flag    |    0   |    1   |    0   |    0   |    1   |    0   |        |
+--------+--------+--------+--------+--------+--------+--------+--------+

From ADuC814 data sheet, TB8 and TR8 should be used for 9th bit
operation. I read carefully about this and wrote a program,
but things are not going well. AD routine put out serial data
correctly, DA routine doesn't put DA result well. I think probably
*9th bits operation have problems* on some parts of beyond my understanding.

I understand the fact that the following things are a basic method how to
operate TB8, RB8, and SBUF, and it accurately is written in the routines.
 For transmitting: 
 MOV TB8, C      ; Copy it into the TB8 bit
 MOV SBUF, A     ; Start transmission by writing to SBUF

 For receiving: 
 MOV A, SBUF         ; Get the received byte
 MOV C, RB8          ; Get the received parity

On the source code below, which part are wrongly used and would
you please inform me how to modify... and some correct way of
using that. Thank you very much for gracious help.

Hiroaki
-----------------------------------------------------FOR TRANSMITTION
#include <stdio.h>
#include <ADuC814.h>

////////// INITIALIZATION //////////
void init(void) {
	/* Serial Setting */
	PLLCON = 0x00;		// 16.777216MHz core clock
	SCON = 0xD2;		// 9-bit, no_parity, 1-stop_bit
	TI = 1;			// ready to transmit

	/* Baud Rate Setting */
	PCON = 0x80;		// double baud rate
	T2CON = 0x34;		// timer2 baud rate generation mode
	RCAP2H = 0xFF;		// for 57,600bps
	RCAP2L = 0xF7;		// for 57,600bps
	TH2 = 0xFF;		// timer2 high byte
	TL2 = 0xF7;		// timer2 low byte

	/* Configure ADC */
	ADCCON1 = 0x90;		// 0x92 for 246.7KHz sampling
	ADCCON2 = 0x40;		// ADCSPI
	ADCDATAH = 0x00;	// ADC high byte
	ADCDATAL = 0x00;	// ADC low byte
}


////////// ADC ROUTINE //////////
void adc(void) {
	unsigned char tmp;

	/* start AD conversion */
	SCONV = 1;	// start ADC
	while(SCONV);	// wait for ADC completion

	/* transmit HHHHLLLL 0 */
	while(!TI);
	TI = 0;
	TB8 = 1;	// 9th bit = 1
	SBUF = ((ADCDATAH&0x0F) << 4) | ((ADCDATAL&0xF0) >> 4);

	/* store bottom 4 bit to tmp and start the next conversion */
	tmp = (ADCDATAL&0x0F) << 4;	// tmp = LLLLXXXX
	SCONV = 1;	// start ADC
	while(SCONV);	// wait for ADC completion

	/* transmit LLLLHHHH 1 */
	while(!TI);
	TI = 0;
	TB8 = 0;	// 9th bit = 0
	SBUF = tmp | (ADCDATAH&0x0F);

	/* transmit LLLLLLLL 0 */
	while(!TI);
	TB8 = 0;	// 9th bit = 0
	SBUF = ADCDATAL;
}

////////// MAIN PROGRAM //////////
void main(void) {
	init();
	while(1) {
		adc();
	}
}

--------------------------------------------------------FOR RECEPTION
#include <stdio.h>
#include <ADuC814.h>

unsigned char a, high, low, flag, nine;

////////// INTIALIZATION //////////
void initialize(void) {
	/* Serial Setting */
	ADCCON1 = 0x80;	// turn on the internal reference
	ADCCON2 = 0x09; // select DAC0 channel
	DACCON = 0x0D;	// configure DAC
	DAC0H = 0x00;	// DAC high byte
	DAC0L = 0x00;	// DAC low byte
	SCON = 0xD2;	// 9-bit, no_parity, 1-stop_bit
	PLLCON = 0x00;	// 16.777216MHz core clock

	/* Baud Rate Setting */
	PCON = 0x80;		// double baud rate
	T2CON = 0x34;		// timer2 baud rate generation mode
	RCAP2H = 0xFF;		// for 57,600bps
	RCAP2L = 0xF7;		// for 57,600bps
	TH2 = 0xFF;		// timer2 high byte
	TL2 = 0xF7;		// timer2 low byte

	high = 0;
	low = 0;
}

////////// DAC ROUTINE //////////
void dac(void) {
	if(RI) {
		a = SBUF;	// read from UART
		nine = RB8;
		RI = 0;

		if(nine) {	// receive HHHHLLLL
			high |= (a&0xF0) >> 4;	// high: 0000HHHH
			low |= (a&0x0F) << 4;	// low: LLLLXXXX
			flag = 1;
		}
		else if(flag) {	// receive LLLLHHHH
			low = (a&0xF0) >> 4;	// low = LLLLLLLL
			DAC0H = high;	// output high 4bits
			DAC0L = low;	// output low 8bits			
			high |= a&0x0F;	// high: 0000HHHH
			flag = 0;
		}
		else {	// receive LLLLLLLL
			low |= a;	// low: LLLLLLLL
			DAC0H = 0x0A;	// output high 4bits
			DAC0L = 0xAA;	// output low 8bits
		}
	}
}

////////// MAIN PROGRAM //////////
void main(void) {
	initialize();
	while(1) {
		dac();
	}
}


List of 12 messages in thread
TopicAuthorDate
UART 9-Bits Mode Operation            01/01/70 00:00      
   RE: UART 9-Bits Mode Operation            01/01/70 00:00      
   RE: UART 9-Bits Mode Operation            01/01/70 00:00      
      RE: UART 9-Bits Mode Operation            01/01/70 00:00      
         RE: UART 9-Bits Mode Operation            01/01/70 00:00      
            RE: UART 9-Bits Mode Operation            01/01/70 00:00      
            RE: UART 9-Bits Mode Operation            01/01/70 00:00      
   RE: UART 9-Bits Mode Operation            01/01/70 00:00      
   RE: UART 9-Bits Mode Operation            01/01/70 00:00      
      RE: UART 9-Bits Mode Operation            01/01/70 00:00      
         RE: UART 9-Bits Mode Operation            01/01/70 00:00      
            RE: SPI vs UART 9-Bits Mode            01/01/70 00:00      

Back to Subject List