реклама на сайте
подробности

 
 
> Соединить 2 atmega168 по USART, тактуются от одного источника
Filov
сообщение Mar 3 2008, 08:40
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Здравствуйте!

Пытаюсь обеспечить передачу данными по USART между двумя мегами 168. Обе тактются от одного внешнего источника частотой 12.5МHz. BAUD=500 на обоих мегах.

Использую polled версия работы s USART из App.Note от производителя.

Соединяю так:
Код
Rx    --  Tx
Tx    --  Rx
XCK  --  XCK



Передаю число первой мегой - вторая Atmega должна принять и соответсвующее количество раз мигнуть светодиодом.

Передаю 1 - мигает 2 раза
Передаю 2 - мигант 12 раз
Передаю 3 - мигает 14 раз sad.gif

После того как 2 мега мигнула светодиодами она должна вернуть первой константу.
Но такое ощущение что в буфере приема первой меги находится больше чем одно число. Т.к. она принимает контсанту еще до того как вторая закончила мигать светодиодами. Причем число не совпадает с той константой, что должна передать 2 мега.

Подскажите, пожалуйста, что делать, чтобы заработало?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Filov
сообщение Mar 4 2008, 09:27
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Вообщем действительно USART работал у меня в асинхронном режиме (по умолчанию). Убрал проводок от XCK1 к XCK2 - ничего не изменилось.

Т.е. сейчас соединены:

Rx1-Tx2
Tx2-Rx1

земли и питание общие.

Так же изменил baudrate, чтобы скорость была близка к 4800. Точность 12500000/(16*(162+1.0))/4800*100=99.853%

Вот код для основного МК:

Код
#define F_CPU 12500000UL  // 12.5 MHz

/* Initialize UART */
void USART0_Init( unsigned int baudrate )
{
        /* Set the baud rate */
        UBRR0H = (unsigned char) (baudrate>>8);
        UBRR0L = (unsigned char) baudrate;

        /* Enable UART receiver and transmitter */
        UCSR0B = ( ( 1 << RXEN0 ) | ( 1 << TXEN0 ) );

        /* Set frame format: 8 data 2stop */
        UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);              //For devices with Extended IO
}


/* Read and write functions */
unsigned char USART0_Receive( void )
{
        /* Wait for incomming data */
        while ( !(UCSR0A & (1<<RXC0)) );
        /* Return the data */
        return UDR0;
}

void USART0_Transmit( unsigned char data )
{
        /* Wait for empty transmit buffer */
        while ( !(UCSR0A & (1<<UDRE0)) );
        /* Start transmittion */
        UDR0 = data;
}


void init_all(void){

        /***initialize clock***/  // Set the clock speed to 8MHz
        // set the clock prescaler. First write CLKPCE to enable setting of clock the next four instructions.
        CLKPR=(1<<CLKPCE);
        CLKPR=0;                                // 8 MHz
        delay_ms(20);

       // change clkout from 6.25MHz to 12.5MHz. Тактуется все от 25MHz. Получается 25/2=12.5Mhz
        delay_ms(10);
        USART0_Init(162);  /* 12500000/(16*(162+1.0))/4800*100=99.853 Set the baudrate to 4800 using a 12,5MHz int osc */

        /***enable interrupt***/
        sei();
}

int main(void){
        init_all();

        USART0_Transmit(3); // передать 2 МК число 3
        uint8_t XXX[3];
        XXX[0]= USART0_Receive;

        //записать XXX[0]  в память

        return (0);
}                               //end main



А вот код для 2 МК (почти то же самое) Вчера ограничил задачу - принять число - и столько раз мигнуть светодиодом
Код
#define F_CPU 12500000UL  // 12.5 MHz

/* Prototypes */
void USART0_Init( unsigned int baudrate );
unsigned char USART0_Receive( void );
void USART0_Transmit( unsigned char data );

/* Initialize UART */
void USART0_Init( unsigned int baudrate )
{
        /* Set the baud rate */
        UBRR0H = (unsigned char) (baudrate>>8);
        UBRR0L = (unsigned char) baudrate;

        /* Enable UART receiver and transmitter */
        UCSR0B = ( ( 1 << RXEN0 ) | ( 1 << TXEN0 ) );

        /* Set frame format: 8 data 2stop */
        UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);              //For devices with Extended IO
}

void USART0_Transmit( unsigned char data )
{

        /* Wait for empty transmit buffer */
        while ( !(UCSR0A & (1<<UDRE0)) );

        /* Start transmittion */
        UDR0 = data;
}

/* Read and write functions */
unsigned char USART0_Receive( void )
{

        /* Wait for incomming data */
        while ( !(UCSR0A & (1<<RXC0)) );

        /* Return the data */
        return UDR0;
}

void init_all(void){

        /***initialize clock***/                //Set the clock speed to 8MHz
        // set the clock prescaler. First write CLKPCE to enable setting of clock the next four instructions.
        CLKPR=(1<<CLKPCE);
        CLKPR=0;                                // 8 MHz
        delay_ms(3000);                         //change clkout from 6.25MHz to 12.5MHz
        USART0_Init(162);                       /* 12500000/(16*(162+1.0))/4800*100=99.853 error Set the baudrate to 4800 using a 12,5MH*/

        /***enable interrupt***/
        sei();
}


void led_on( unsigned int cikle){

        uint8_t i=0;
        while(i<cikle){
                /* led on, pin=0 */
                PORTC &= ~(1<<PC5);
                delay_ms(500);
                /* set output to 5V, LED off */
                PORTC|= (1<<PC5);
                delay_ms(500);
                i++;
        }
}

/* Main - a simple test program*/
void main( void )
{
        init_all();

        /* INITIALIZE */
        /* enable PC5 as output */
        DDRC|= (1<<DDC5);

        led_on(3);                                   //Тут все верно при старте мигает 3 раза
        delay_ms(1000);                        

        for(;;){                                        /* Forever */

                unsigned charinput=USART0_Receive();
                led_on(charinput);
        }
}


Мигает по прежнему 14 раз каждый раз. А должно 3. Но хоть стабильность в этом вопросе. Подскажите, почему доходит не то что нужно?

Сообщение отредактировал Filov - Mar 4 2008, 09:45
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Filov   Соединить 2 atmega168 по USART   Mar 3 2008, 08:40
- - GDI   А зачем сигнал XCK - вы в синхронном режиме чтоли ...   Mar 3 2008, 10:17
|- - Filov   Цитата(GDI @ Mar 3 2008, 13:17) А зачем с...   Mar 3 2008, 10:57
- - blackbit   оп-с.. а земли (GND) вы им действительно не соедин...   Mar 3 2008, 10:32
- - GDI   ЦитатаЯ так понял после прочтения документации, чт...   Mar 3 2008, 12:40
|- - Filov   Цитата(GDI @ Mar 3 2008, 15:40) Тактирова...   Mar 3 2008, 13:17
|- - Stanislav_S   Цитата(Filov @ Mar 3 2008, 18:17) Я как н...   Mar 3 2008, 13:29
|- - Filov   Цитата(Stanislav_S @ Mar 3 2008, 16:29) С...   Mar 3 2008, 14:10
|- - =GM=   Цитата(Filov @ Mar 3 2008, 14:10) Да надо...   Mar 3 2008, 15:04
|- - mdmitry   Цитата(=GM= @ Mar 3 2008, 18:04) 3) Не мо...   Mar 3 2008, 15:18
|- - KRS   Цитата(=GM= @ Mar 3 2008, 18:04) потому ч...   Mar 3 2008, 15:26
|- - =GM=   Цитата(KRS @ Mar 3 2008, 15:26) Это почем...   Mar 3 2008, 16:27
|- - KRS   Цитата(=GM= @ Mar 3 2008, 19:27) 1) У мас...   Mar 3 2008, 16:42
- - Aesthete Animus   2Filov Скажите, а чем вызвано желание использовать...   Mar 3 2008, 13:03
- - GDI   ЦитатаТолько инициалюзацию USART я так понимаю над...   Mar 3 2008, 14:24
- - GDI   Имхо, в синхронном режиме USART очень похож на SPI...   Mar 4 2008, 07:22
|- - KRS   Цитата(GDI @ Mar 4 2008, 10:22) Имхо, в с...   Mar 4 2008, 09:50
- - GDI   Ну, во первых, посмотрите осциллографом, что у вас...   Mar 4 2008, 09:49
|- - Filov   Цитата(GDI @ Mar 4 2008, 12:49) Ну, во пе...   Mar 4 2008, 09:53
- - GDI   ЦитатаКстати не во всех чипах есть режим SPI, (нап...   Mar 4 2008, 09:57
- - Filov   Цитата(GDI @ Mar 4 2008, 12:57) Это я зна...   Mar 4 2008, 10:04
- - defunct   Цитата(Filov @ Mar 4 2008, 12:04) Констан...   Mar 4 2008, 10:47
|- - Filov   Цитата(defunct @ Mar 4 2008, 13:47) А теп...   Mar 5 2008, 09:39
|- - mdmitry   Цитата(Filov @ Mar 5 2008, 12:39) Это я в...   Mar 5 2008, 15:55
|- - defunct   Цитата(Filov @ Mar 5 2008, 11:39) Т.е. мо...   Mar 5 2008, 16:30
- - mdmitry   Цитата(Filov @ Mar 4 2008, 13:04) Кстати ...   Mar 4 2008, 10:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016