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

 
 
 
Reply to this topicStart new topic
> Влияние 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
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
arttab
сообщение Mar 26 2008, 01:06
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



У STK300 (моего) есть прикол - иногда завешивает мк после вклю питания.
может и у Вас что то похожее


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Filov
сообщение Mar 26 2008, 07:32
Сообщение #4


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

Группа: Участник
Сообщений: 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
ArtemKAD
сообщение Mar 26 2008, 09:12
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
F_atmega88=12.5MHz, F_ADC=7.68MHz, BBREG в USART 128.

По подробнее. На какой частоте общаешься с АЦП?

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


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

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



Цитата(ArtemKAD @ Mar 26 2008, 12:12) *
По подробнее. На какой частоте общаешься с АЦП?


В даташите на atmega88 http://atmel.com/dyn/resources/prod_documents/doc2545.pdf на странице 174 для USART указано clock is the baud rate generator clock output (= fosc/(UBRRn+1)). Соответсвенно указывая BBREG=128 предполагаю, что это будет аналогично обычному SPI, клоки которого делятся на 128. Получается частота SPI через USART 12500kHz/(128+1)=96.899kHz.
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Mar 26 2008, 09:52
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Ладно, вопрос снят. Хотя странно ставить 5 мкс задержку при тактовой в 20 мкс...
Go to the top of the page
 
+Quote Post
Filov
сообщение Mar 26 2008, 10:00
Сообщение #8


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

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



Цитата(ArtemKAD @ Mar 26 2008, 12:52) *
Ладно, вопрос снят. Хотя странно ставить 5 мкс задержку при тактовой в 20 мкс...


Ну тут на форуме обсуждалась работа с такими АЦП, и код приводили... ну я от греха подальше не стал мудрствовать лукаво и оставил как было...
Go to the top of the page
 
+Quote Post

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

 


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


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