Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega128 инициализация UART0, UART01
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
west329_
Даже и незнаю на что грешит.

Инит юартов. Использую прерывания RX
Код
/***********************************************************************
Function :    uart0_init
Parameters :  nil
Date :  
Desc :        int disabled
              //UART0 initialize
              // desired baud rate: 57600
              // actual: baud rate:57600 (0,0%)
              // char size: 8 bit
              // parity: Disabled
              //ICC-AVR application builder : 04.06.2008 15:23:56
              // Target : M128
              // Crystal: 7.3728Mhz
***********************************************************************/

void uart0_init(void)
{
#ifndef UartOVF
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x07; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x18;
#else
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x07; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
//UCSR0B = 0xB8;
UCSR0B = 0x98;  //without UDR is now empty int
#endif
}




/***********************************************************************
Function :    uart1_init
Parameters :  nil
Date :  
Desc :        int disabled
              //UART1 initialize
              // desired baud rate:57600
              // actual baud rate:57600 (0,0%)
              // char size: 8 bit
              // parity: Disabled
              //ICC-AVR application builder : 04.06.2008 15:23:56
              // Target : M128
              // Crystal: 7.3728Mhz
***********************************************************************/

void uart1_init(void)
{
  
#ifndef UartOVF  
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x07; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x18;

#else
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x07; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
//UCSR1B = 0xB8;
  UCSR1B = 0x98; //without UDR is now empty int
#endif
}



вызовы
Код
/***********************************************************************
Function :    putchar
Parameters :  
Date :  
Desc :        
***********************************************************************/
void putchar(unsigned char tx_char, unsigned char CASE_UART)
{
  
    switch(CASE_UART)
    {
    case UART_1:{                                        //printing to UART PHONE  
                while( !(UCSR0A & (1 << UDRE0) ) );         // ??????????????????????????????????
                UDR0 = tx_char;
                break;}

    case UART_2:{                                        //printing to UART TUNER  
                while( !(UCSR1A & (1 << UDRE1) ) );         //???????????????????????????????????
                UDR1 = tx_char;
                break;}



    case UART_3:{                                        //printing to UART_3  (SOFT DEBUG UART)
                sUARTtx(tx_char);
                break;}
    }

}


при этом первый юарт работает нормально как только вызываю второй программа вешается, как я понял на строке while( !(UCSR1A & (1 << UDRE1) ) ); и всё вечное ожидание.
Qwertty
Цитата(west329_ @ Sep 3 2008, 21:05) *
Даже и незнаю на что грешит.

Начните с проверки состояния фьюза M103C....
west329_
Цитата(Qwertty @ Sep 3 2008, 20:35) *
Начните с проверки состояния фьюза M103C....


Проверяю в понипрог нам стоит птичка как я понял для фьюза это 0.

Перед тем как заливать код в железо предварительно код отладил в протеусе, там всё работает как часы, хотя этот симулятор не показатель.
Flasher
Цитата(west329_ @ Sep 3 2008, 20:50) *
Проверяю в понипрог нам стоит птичка как я понял для фьюза это 0.

Перед тем как заливать код в железо предварительно код отладил в протеусе, там всё работает как часы, хотя этот симулятор не показатель.

Еще раз подумай про бит и понипрог
west329_
Цитата(Flasher @ Sep 3 2008, 21:17) *
Еще раз подумай про бит и понипрог


Ув. Flasher все заработало, разясните мне начинаещему, как та может быть. В меге из фузов было переключено всего 2. CKSEL3 и CKSEL2, в пони вначале в них стояли птички, что соотвецтвовало по даташиту внутреннему генератору, я убираю птички фактически устанавливаю биты в 1, по документации перешожу на тактирование от внешнего кварца. Всё работает нормально.

Теперь эта ситуация, сначало в пони в значении бита M103C стоит птичка, значит unprogramed тоесть значение бита 0.
Открываю даташит (Default Value - M103C(1) 1 ATmega103 compatibility mode 0 (programmed) )
получается что мега128 сначала включена в режит меги103 где логика ? разъясните ?
Flasher
Цитата(west329_ @ Sep 3 2008, 21:54) *
Ув. Flasher все заработало, разясните мне начинаещему, как та может быть. В меге из фузов было переключено всего 2. CKSEL3 и CKSEL2, в пони вначале в них стояли птички, что соотвецтвовало по даташиту внутреннему генератору, я убираю птички фактически устанавливаю биты в 1, по документации перешожу на тактирование от внешнего кварца. Всё работает нормально.

Теперь эта ситуация, сначало в пони в значении бита M103C стоит птичка, значит unprogramed тоесть значение бита 0.
Открываю даташит (Default Value - M103C(1) 1 ATmega103 compatibility mode 0 (programmed) )
получается что мега128 сначала включена в режит меги103 где логика ? разъясните ?

Она изначально в режиме совместимости, так как раньше она предназначалась для замены 103 в изделиях
west329_
Как можно притупить чувствительность порта USART. Один USART подключается на макс3232 и как я понял за щёт высоких уровней и преобразователя он находяс в воздухе не сбоит ,
а другой USART без формирователя а планируется просто для связи с другим конроллером напрямую без максов, когда по нему передаю байт тут же срабатывает прерывание, линия RX висит в воздуже и идёт рядом с ТХ. если закорачиваю RX на землю прерывание не проходит,
чем лучше задавить шум резистором или конденсатором чтоб потом не повлиять на поток 115200???
Flasher
Цитата(west329_ @ Sep 4 2008, 23:09) *
Как можно притупить чувствительность порта USART. Один USART подключается на макс3232 и как я понял за щёт высоких уровней и преобразователя он находяс в воздухе не сбоит ,
а другой USART без формирователя а планируется просто для связи с другим конроллером напрямую без максов, когда по нему передаю байт тут же срабатывает прерывание, линия RX висит в воздуже и идёт рядом с ТХ. если закорачиваю RX на землю прерывание не проходит,
чем лучше задавить шум резистором или конденсатором чтоб потом не повлиять на поток 115200???

RX на 5 вольт подтяни резистором 4,7ком
Aleksandr Baranov
Так писать нехорошо. Лучше как-нибудь так:

Код
UCSR0B  = (0<<RXIE)|(0<<TXIE)|(0<<UDRIE)|                          //rx,tx interrupts disable  
                 (0<<TXEN)|(0<<RXEN)|(dmsb<<UCZ2);                    //TX  disble, RX  disable;
Syberian
Цитата(Aleksandr Baranov @ Sep 5 2008, 00:18) *
Так писать нехорошо. Лучше как-нибудь так:


Ваше выражение эквивалентно полному занулению регистра. Гасить биты надо так:

Код
UCSR0B  &= 0xFF^((1<<RXIE)|(1<<TXIE)|(1<<UDRIE)|                          //rx,tx interrupts disable  
                 (1<<TXEN)|(1<<RXEN)|(dmsb<<UCZ2));                    //TX  disble, RX  disable;
SysRq
Цитата(Syberian @ Sep 5 2008, 07:02) *
Ваше выражение эквивалентно полному занулению регистра. Гасить биты надо так:

А я категорически настаиваю, что вот так:
Цитата
#include <math.h>
#define X 3.1415926535897932384626433832795/6.0
#define TRUE_1 ((unsigned char) (sin(X)*sin(X) + cos(X)*cos(X)))

UCSR0B &= 0xFF^((TRUE_1<<RXIE)|(TRUE_1<<TXIE)|(TRUE_1<<UDRIE)|(TRUE_1<<TXEN)|(TRUE_1<<RXEN)|(dmsb<<UCZ2));

И еще говорят, что в благодатном коде не может быть ЛОЖЬ, должна быть только ИСТИНА. Поэтому необходимо заdefine'ить ГОРЬКУЮ_ИСТИНУ и ей оперировать, отринув ЛОЖЬ.

lol.gif
west329_
void stopUART( void )
{
UCSR1B &= ~0x80; //RXCIEn -- RX int UART1 off
}
smile.gif
Aleksandr Baranov
Цитата(Syberian @ Sep 4 2008, 23:02) *
Ваше выражение эквивалентно полному занулению регистра. Гасить биты надо так:

Код
UCSR0B  &= 0xFF^((1<<RXIE)|(1<<TXIE)|(1<<UDRIE)|                          //rx,tx interrupts disable  
                 (1<<TXEN)|(1<<RXEN)|(dmsb<<UCZ2));                    //TX  disble, RX  disable;


Я всего лишь имел в виду, что не стоит записывать в регистр число, чтобы потом на бумажке расписывать его биты
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.