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

 
 
> Влияние 5-проводкового программатора на USART(в MSPIM) в ATmega88, танцы с бубном или истина где-то рядом
Filov
сообщение Mar 25 2008, 19:26
Сообщение #1


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

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



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

Есть atmega88, к ней на SPI поключена микросхема контроллера. На USART в MSPIM подключен АЦП (так показалось удобнее - тем боолее разницы по описанию никакой (мне нужен только мастер) - плюс буферизация).

И возникает такая странная вещь - на работу USART в MSPIM влияет то - подключен ли пятипроводковый программатор (он подключается фактически к нативному SPI).

Допустим, я заливаю прошивку. МК перезапускается. Вероятность того что USARTв MSPIM будет "нормально общаться" с АЦП - 20-30%. Нормально - это означает что работает все как надо - и данные верные, и команды АЦП выполняет. Ненормально - соответсвенно остальные %. Выражается это в том, что приходят или 0, или всякие непонятные числа. Причем = это может быть все что угодно - обравки посылаемых команд, рандомные числа, сплошные нули - но нет даже обрывков полезных данных.

Если не "общается" - не вынимая программатор, делаю рестарт платы по питанию. Вероятность корректной работы - 40-50%.

Если опять приходят некорректные данные - выключаю питание, вынимаю программатор из LPT порта, включаю питание - вероятность, что заработает верно - 40-50%.

При дальнейших включениях, выключениях - вероятность, что будет работать нормально падает.

Если не заводится - разумным остается только способ залить прошивку снова и т.д.

Как может влиять программатор на схему??? Может от него какие-то клоки идут.....? F_atmega88=12.5MHz, F_ADC=7.68MHz, BBREG в USART 128.

Сообщение отредактировал Filov - Mar 25 2008, 19:30
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mdmitry
сообщение Mar 25 2008, 21:42
Сообщение #2


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Отключить от платы программатор и проверить работу. Отключение от LPT не отключает физически цепи программатора.
Проверить конфигурацию USART и SPI.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Filov
сообщение Mar 26 2008, 07:32
Сообщение #3


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

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



Цитата(mdmitry @ Mar 26 2008, 01:42) *
Отключить от платы программатор и проверить работу. Отключение от LPT не отключает физически цепи программатора.

Вообщем провел исследование: отключил программатор от платы. 12 перезапусков по включении/выключении питания. Проверялось чтении 4 байтов конфигурации АЦП, подключенного в через USART в MSPIM.

Итого:

2 случая верной работы (3 и 10). Верные значения:
Код
30 01 20 23


Не наблюдалось никаких нестабильностей в работе.

10 случаев неверной работы. Читались разнообразные значения например:
Код
7f fb 58 00
fb ff ff ff
00 00 00 00
ff ff ff ff
ab ab ab ab
e7 e7 e7 e7

Или комбинации из них. Иногда значения были постоянными для "сеанса", иногда - цифры были разные для каждого запроса чтения битов в сеансе.

Цитата(mdmitry @ Mar 26 2008, 01:42) *
Проверить конфигурацию USART и SPI.


Для работы USART в MSPIM использую такой код:

Код
//Эти значения идут в init_usart_spi
#define BRREG 128
#define SPIMODE 1

void init_usart_spi( unsigned char spimode, unsigned int brreg )
{
         // Baud rate must be set to 0 prior to enabling the USART as SPI
        // master, to ensure proper initialization of the XCK line.
        UBRR0H = 0x00;
        UBRR0L = 0x00;

        // Set XCK line to output, ie. set USART in master mode.
        USARTDDR |= (1<<XCKPIN);

        // Set USART to Master SPI mode.
        UCSR0C = (1<<UMSEL01) | (1<<UMSEL00);

        // Set clock polarity and phase to correct SPI mode.
        if( spimode & 0x01 ) UCSR0C |= (1<<UCPOL0);
        if( spimode & 0x02 ) UCSR0C |= (1<<UCPHA0);

        // Enable RX and TX.
        UCSR0B = (1<<RXEN0) | (1<<TXEN0);

        // Set baud rate. Must be set _after_ enabling the transmitter.
        UBRR0H = (uint8_t) (brreg>>8);
        UBRR0L = (uint8_t) brreg;

}


uint8_t spi_shift_byte(uint8_t value )
{
        // Wait for empty transmit buffer.
        do {} while( (UCSR0A & (1<<UDRE0)) == 0 );

        // Send data.
        UDR0 = value;

        // Wait for transfer to complete and return received value.
        do {} while( (UCSR0A & (1<<RXC0)) == 0 );

        return UDR0;
}

//Read 4 registers from ADC

uint8_t SPI_buf[4];
spi_shift_byte(RREG | 0x00);    //Read from register with starting at address 0x00
_delay_us(5);
spi_shift_byte(0x03);       //Read 4 register
_delay_us(50);             //*ADS1256 t6 VERY IMPORTANT* min_us=t6/F_ADS1256=50/7.68MHz=7us
SPI_buf[0]=spi_shift_byte(0xAB);
_delay_us(5);
SPI_buf[1]=spi_shift_byte(0xAB);
_delay_us(5);
SPI_buf[2]=spi_shift_byte(0xAB);
_delay_us(5);
SPI_buf[3]=spi_shift_byte(0xAB);
_delay_us(5);



Вот такие вот пироги с котятами, господа.

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



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

 


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


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