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

 
 
17 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> MSP430 - снова вопросы от чайника, Вопросы от чайника про MSP и магнитный компас
Daria
сообщение Sep 25 2008, 18:43
Сообщение #76


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Sep 24 2008, 22:12) *
Я не вижу функции инициализации UART, но попробуйте перед тем как разрешать прерывание от приемника UART (по)чистить его флаги.
В строках

следует поменять их очередность.
Кроме того, функции работы с буфером у вас не полностью реентерабельные. Они не обеспечивают атомарности доступа к переменным индекса и счетчика.

Ну, теряться байты перестали, спасибо. Но нули все равно приходят при включении питания. Не могу понять, откуда они берутся 05.gif а функции, значит, не очень? smile.gif


Цитата(LCD @ Sep 24 2008, 23:14) *
А не лучше ли использовать DCO с внешним резистором, если толщина схемы важнее стабильности частоты?

Не, не лучше. Во-первых, хочется все же высокой частоты, от DCO - это 800кГц, а, во-вторых, не важнее, конечно, просто уменьшение размеров желательно

Цитата(VAI @ Sep 25 2008, 10:57) *
Мы используем Муратовские керамические трёхногие SMD-шные резонаторы с установлеными в них емкостями.
CSTCE8M00G55A-R0 - на 8МГц
CSTCR6M00G53-R0 - на 6МГц
И довольны

Спасибо! Я так и думала, что это хорошие smile.gif Надеюсь, мы тоже будем довольны smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 25 2008, 19:30
Сообщение #77


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Sep 26 2008, 00:43) *
Ну, теряться байты перестали, спасибо. Но нули все равно приходят при включении питания. Не могу понять, откуда они берутся 05.gif
Покажите функцию инициализации UART.
Цитата(Daria @ Sep 26 2008, 00:43) *
Не, не лучше. Во-первых, хочется все же высокой частоты, от DCO - это 800кГц, а, во-вторых, не важнее, конечно, просто уменьшение размеров желательно
Вы опять что-то недочитали в User's Guide wink.gif Частоту DCO можно изменить программно вплоть до 6,5МГц. А если использовать внешний резистор ROSC, то DCO можно легко разогнать МГц эдак до 50 одной левой. biggrin.gif На такой частоте работать кристалл конечно же не сможет, но DCO такую частоту генерировать будет. Самолично проверял smile.gif Проблема с DCO в том, что частота его зависит от температуры и напряжения питания. Для связи требуется стабильность битовой частоты не хуже 1-2%, 0,5% это вообще для любого случая подойдет. Если напряжения питания стабильно, используется внешний резистор ROSC с хорошим ТКС (не хуже скажем 50ppm/°C), DCO при старте калибруется по часовому кварцу (а при возникновении ошибок по связи происходит перекалибровка), то вполне можно обойтись и без внешнего высокочастотного кварца, одним лишь часовым.
Go to the top of the page
 
+Quote Post
Daria
сообщение Sep 26 2008, 15:21
Сообщение #78


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Sep 25 2008, 23:30) *
Покажите функцию инициализации UART.

Код
               U0CTL |= CHAR;                    // 8-bit character
    U0TCTL = SSEL0;                    // UCLK = ACLK
    U0BR0 = 0xA0;                    // 8.00Mhz 19200 bps (416)
    U0BR1 = 0x01;
    U0MCTL = 0x00;                    // no modulation
    U0CTL &= ~SWRST;
    ME1 |= UTXE0 + URXE0;            // Enable USART0 TXD/RXD
    IE1 |= URXIE0;

Флаги не сбрасываю, потому что не помогло smile.gif

Цитата(rezident @ Sep 25 2008, 23:30) *
Вы опять что-то недочитали в User's Guide wink.gif

Видимо, да biggrin.gif
Цитата(rezident @ Sep 25 2008, 23:30) *
Частоту DCO можно изменить программно вплоть до 6,5МГц. А если использовать внешний резистор ROSC, то DCO можно легко разогнать МГц эдак до 50 одной левой. biggrin.gif На такой частоте работать кристалл конечно же не сможет, но DCO такую частоту генерировать будет. Самолично проверял smile.gif Проблема с DCO в том, что частота его зависит от температуры и напряжения питания. Для связи требуется стабильность битовой частоты не хуже 1-2%, 0,5% это вообще для любого случая подойдет. Если напряжения питания стабильно, используется внешний резистор ROSC с хорошим ТКС (не хуже скажем 50ppm/°C), DCO при старте калибруется по часовому кварцу (а при возникновении ошибок по связи происходит перекалибровка), то вполне можно обойтись и без внешнего высокочастотного кварца, одним лишь часовым.

Спасибо, буду иметь ввиду
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 26 2008, 15:33
Сообщение #79


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ну вот она и ошибка. Первой командой инициализации USART должна быть установка бита SWRST, как это и указано в User's Guide. Вставьте в процедуру инициализации первой командой
Код
U0CTL = SWRST;

А дальше по вашему тексту.
Код
    U0CTL |= CHAR;                    // 8-bit character
    U0TCTL = SSEL0;                    // UCLK = ACLK
    U0BR0 = 0xA0;                    // 8.00Mhz 19200 bps (416)
    U0BR1 = 0x01;
    U0MCTL = 0x00;                    // no modulation
    ME1 |= UTXE0 | URXE0;            // Enable USART0 TXD/RXD
    U0CTL &= ~SWRST;
    IE1 |= URXIE0;
и все лишние нули пропадут.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Daria
сообщение Sep 29 2008, 19:16
Сообщение #80


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Sep 26 2008, 19:33) *
Ну вот она и ошибка. Первой командой инициализации USART должна быть установка бита SWRST, как это и указано в User's Guide. Вставьте в процедуру инициализации первой командой
Код
U0CTL = SWRST;

не-а, не помогло smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 29 2008, 20:23
Сообщение #81


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Sep 30 2008, 01:16) *
не-а, не помогло smile.gif

Делайте функции работы с буфером реентерабельными. Потому, что работа с ними в том числе из прерываний идет. По крайней мере атомарность доступа к указателям и счетчику буфера обеспечить нужно.
Кстати, что у вас такое NData и cData в структуре буфера?
Go to the top of the page
 
+Quote Post
Daria
сообщение Sep 30 2008, 19:00
Сообщение #82


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Sep 30 2008, 00:23) *
Делайте функции работы с буфером реентерабельными. Потому, что работа с ними в том числе из прерываний идет. По крайней мере атомарность доступа к указателям и счетчику буфера обеспечить нужно.
Кстати, что у вас такое NData и cData в структуре буфера?

NData - максимальный размер буфера, инициализируется UARTTxBuf.NData = sizeBufTx(16), СData - счетчик.
Такое дело. Как выяснилось, такая работа буфера тоже занимает кучу лишнего времени, так как байты загружаются в буфер, только после того, как будет отправлена предыдущая посылка
if ((IE1 & UTXIE0) == 0)
Т.е. пока 6(в данном случае) байт не передастся, запись в буфер не произойдет. Это же не правильно? smile.gif Хочу сделать так, что бы запись в буфер и отправка были независимы. Т.е. теперь
Код
int WriteTxbuf(int* data, char size)
{
    unsigned char a, j;
//        BufferReset(&UARTTxBuf);

    if((UARTTxBuf.NData-UARTTxBuf.cData)<6)return -1;

        
        BufferWrite(&UARTTxBuf, 0xC0);
        for(j = 0; j < size; j++)
        {
          
            
            a = data[j] & 0xFF;
            switch (a)
            {
                case 0xC0:
                {
                    BufferWrite(&UARTTxBuf, 0xDB);
                    BufferWrite(&UARTTxBuf, 0xDC);
                    break;
                }
                case 0xDB:
                {
                    BufferWrite(&UARTTxBuf, 0xDB);
                    BufferWrite(&UARTTxBuf, 0xDD);
                    break;
                }
                default:
                    BufferWrite(&UARTTxBuf, a);
            }
            
            
            a = data[j] >> 8;
            switch (a)
            {
                case 0xC0:
                {
                    BufferWrite(&UARTTxBuf, 0xDB);
                    BufferWrite(&UARTTxBuf, 0xDC);
                    break;
                }
                case 0xDB:
                {
                    BufferWrite(&UARTTxBuf, 0xDB);
                    BufferWrite(&UARTTxBuf, 0xDD);
                    break;
                }
                default:
                    BufferWrite(&UARTTxBuf, a);
            }
        }
        BufferWrite(&UARTTxBuf, 0x3F);
        return 0;
}

А в основной порграмме
Код
if(state!=(-1)){
            ReadRxbuf(&rxdata);
            txsize = 0;
            txdata[txsize++] = -4;
            txdata[txsize++] = -6;
        }
            if(WriteTxbuf(txdata, txsize))
                  state=-1;
            else
                state=0;

          
        if ((IE1 & UTXIE0) == 0)        
        {
            IFG1 |= UTXIFG0;                                                 IE1 |= UTXIE0;                        
        }

Почему <6? Потому, что сейчас посылки по 6 байт.
Т.е., запись происходит только если есть место для следующей посылки(6 байт), а отправка начинается, если предыдущая посылка отправлена - эти два действия независимы. Но - в отладчике все хорошо, а на практике, при большой скорости передачи(т.е. когда идет непрерывная загрузка в буфер), последний байт в посылке теряется. Отчего это происходит? 07.gif Если делать задержку между посылками, то все нормально, но это же жутко не функционально. тогда вообще нет смысла в буфере sad.gif а, кстати, не имеет ли смысла перед сбросом IE1 &= ~UTXIE0 проверять бит UTXEPT?
такой вопрос smile.gif

Сообщение отредактировал Daria - Sep 30 2008, 19:04
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 30 2008, 19:49
Сообщение #83


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Oct 1 2008, 01:00) *
NData - максимальный размер буфера, инициализируется UARTTxBuf.NData = sizeBufTx(16), СData - счетчик.

Шо це таке "sizeBufTx(16)"? cranky.gif Функция? Или размер буфера?
Цитата(Daria @ Oct 1 2008, 01:00) *
Такое дело. Как выяснилось, такая работа буфера тоже занимает кучу лишнего времени, так как байты загружаются в буфер, только после того, как будет отправлена предыдущая посылка
if ((IE1 & UTXIE0) == 0)
Т.е. пока 6(в данном случае) байт не передастся, запись в буфер не произойдет. Это же не правильно? smile.gif Хочу сделать так, что бы запись в буфер и отправка были независимы.
Дык буфер-то один или буферы для записи и для чтения разные? Если даже один, но размер его больше 12, то почему мешает одно другому?
Цитата(Daria @ Oct 1 2008, 01:00) *
Если делать задержку между посылками, то все нормально, но это же жутко не функционально. тогда вообще нет смысла в буфере sad.gif
Раз у вас канал полнодуплексный и прием с передачей независимы, то сделайте вы два разных буфера и всех делов. laughing.gif
Цитата(Daria @ Oct 1 2008, 01:00) *
а, кстати, не имеет ли смысла перед сбросом IE1 &= ~UTXIE0 проверять бит UTXEPT?
Не имеет. Запрет прерываний не влияет ни на текущую передачу байта, находящегося в сдвиговом регистре, ни на передачу следующего байта, находящегося в буфере передатчика USART.
По поводу кода. Извините, но я уже перестал что-либо понимать в этих огрызках функций sad.gif А отрицательные числа, возвращаемые функцией (как код ошибки?), вместо привычных 0 и 1 или чисел натурального ряда, это вообще нечто cranky.gif
Go to the top of the page
 
+Quote Post
Daria
сообщение Sep 30 2008, 20:26
Сообщение #84


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



05.gif
Код
typedef struct CharBuffer
{
    unsigned char* Data;        
int NData;                            
int cData;                    
int pWrite;                
int pRead;                        
}
CharBuffer;

#define sizeBufTx 16
struct CharBuffer UARTTxBuf;
unsigned char bufTx[sizeBufTx];

#define sizeBufRx 16
struct CharBuffer UARTRxBuf;
unsigned char bufRx[sizeBufRx];

почти весь код два сообщения назад smile.gif
Раньше делала отправку примерно так, как вы советовали(ссобщений эдак 7-8 назад),
if ((IE1 & UTXIE0) == 0)
запись в буфер
IFG1 |= UTXIFG0;
IE1 |= UTXIE0;
В обработчике прерываний
Код
#pragma vector = USART0TX_VECTOR
__interrupt void usart0_tx (void)
{
    unsigned char data;
    if (!BufferRead(&UARTTxBuf, &data))                
                     U0TXBUF = data;
    else
        IE1 &= ~UTXIE0;                        
}

но так получается, что запись следующей посылки идет только после того, как отправится текущая посылка , условие if ((IE1 & UTXIE0) == 0) - куча времени впустую.
но я пониаю, что вам некогда разбираться во всем этом 05.gif Ну и ладно, и так помогли уже нехило smile.gif разберусь. надеюсь smile.gif
А что касается return -1... случайно smile.gif return 1, но по большому-то счету есть разница? wink.gif смысл такой, что не ноль.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 30 2008, 23:05
Сообщение #85


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Oct 1 2008, 02:26) *
но так получается, что запись следующей посылки идет только после того, как отправится текущая посылка , условие if ((IE1 & UTXIE0) == 0) - куча времени впустую.
Почему впустую? if это ведь не while, т.е. если условие не выполняется идем дальше, а не ждем его выполнения.
Цитата(Daria @ Oct 1 2008, 02:26) *
но я пониаю, что вам некогда разбираться во всем этом 05.gif Ну и ладно, и так помогли уже нехило smile.gif разберусь. надеюсь smile.gif
тут уже сам замысел, алгоритм непонятен. То ли вы реализуете пакетный протокол, который подразумевает запрос-ответ? То ли у вас информационный канал с контролем управления, построенный в "обертке" пакетного протокола? Если пакетный протокол точка-точка, то все так и должно быть: сначала передача запроса, затем прием ответа. Если же нужно постоянно гнать поток информации, лишь изредка, получая какие-то команды управления, то при наличии раздельных буферов чтения и записи, прерывание передатчика не нужно запрещать вообще. И опрос бита TXEPT тогда как раз нужен перед тем, как программно установить TXIFG для инициации прерываний.
При передаче работайте непосредственно с кольцевым буфером передатчика записывая в него по факту его опустошения. Т.е. в майне, где формируется пакет, счетчик буфера лишь увеличивается, а в прерывании передатчика счетчик буфера уменьшается. Индекс, естественно, только инкрементируется, учитывая переход его в начало буфера.
С буфером приемника аналогично, но наоборот. В прерывании приемника счетчик буфера увеличивается, а в майне вы буфер вычитываете и уменьшаете счетчик буфера. Прерывания ни приемника, ни передатчика при при этом запрещать не нужно. В прерывании приемника запись в буфер по факту наличия свободного места происходит.
Go to the top of the page
 
+Quote Post
Daria
сообщение Oct 1 2008, 18:23
Сообщение #86


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Oct 1 2008, 03:05) *
Почему впустую? if это ведь не while, т.е. если условие не выполняется идем дальше, а не ждем его выполнения.

Да, но данные обновляются очень быстро, а запись в буфер не идет, пока не отправится предыдущая посылка, в результате данные теряются и сам буфер немного теряет смысл smile.gif
Цитата(rezident @ Oct 1 2008, 03:05) *
тут уже сам замысел, алгоритм непонятен. То ли вы реализуете пакетный протокол, который подразумевает запрос-ответ? То ли у вас информационный канал с контролем управления, построенный в "обертке" пакетного протокола? Если пакетный протокол точка-точка, то все так и должно быть: сначала передача запроса, затем прием ответа. Если же нужно постоянно гнать поток информации, лишь изредка, получая какие-то команды управления, то при наличии раздельных буферов чтения и записи, прерывание передатчика не нужно запрещать вообще.

Будут две платы, на одной пакетный протокол запрос-ответ, на другой - постоянный поток информации, изредка получая команды biggrin.gif пока второе
Цитата(rezident @ Oct 1 2008, 03:05) *
И опрос бита TXEPT тогда как раз нужен перед тем, как программно установить TXIFG для инициации прерываний.
При передаче работайте непосредственно с кольцевым буфером передатчика записывая в него по факту его опустошения. Т.е. в майне, где формируется пакет, счетчик буфера лишь увеличивается, а в прерывании передатчика счетчик буфера уменьшается. Индекс, естественно, только инкрементируется, учитывая переход его в начало буфера.
С буфером приемника аналогично, но наоборот. В прерывании приемника счетчик буфера увеличивается, а в майне вы буфер вычитываете и уменьшаете счетчик буфера. Прерывания ни приемника, ни передатчика при при этом запрещать не нужно. В прерывании приемника запись в буфер по факту наличия свободного места происходит.

ну, вроде работает, спасибо

Сообщение отредактировал Daria - Oct 1 2008, 18:24
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 1 2008, 19:34
Сообщение #87


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Daria @ Oct 2 2008, 00:23) *
Да, но данные обновляются очень быстро, а запись в буфер не идет, пока не отправится предыдущая посылка, в результате данные теряются и сам буфер немного теряет смысл smile.gif
Я вам уже объяснял области применения буферов: а) синхронизация асинхронных потоков, б) сглаживание неравномерностей поступления данных в потоках.
Если у вас данные обновляются быстрее, чем уходят в канал связи и при этом требуется "не потерять" их, то это лишь означает, что у вас канал слишком "узкий" и "тормозной". Причем тут буфера?
Go to the top of the page
 
+Quote Post
Daria
сообщение Oct 2 2008, 19:37
Сообщение #88


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(rezident @ Oct 1 2008, 23:34) *
Если у вас данные обновляются быстрее, чем уходят в канал связи и при этом требуется "не потерять" их, то это лишь означает, что у вас канал слишком "узкий" и "тормозной". Причем тут буфера?

Буферы, а не буфера biggrin.gif канал вроде наладила smile.gif
Go to the top of the page
 
+Quote Post
VAI
сообщение Oct 3 2008, 01:12
Сообщение #89


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Кстати, по уартам, я как-то выкладывал свои исходники работы с последовательными портами по прерыванию.
Там использую циклические "буфера" :-) своего изготовления.
http://electronix.ru/forum/index.php?showt...mp;#entry194257
Может пригодится...


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Daria
сообщение Oct 4 2008, 17:01
Сообщение #90


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(VAI @ Oct 3 2008, 05:12) *
Кстати, по уартам, я как-то выкладывал свои исходники работы с последовательными портами по прерыванию.
Там использую циклические "буфера" :-) своего изготовления.
http://electronix.ru/forum/index.php?showt...mp;#entry194257
Может пригодится...

Наверняка пригодится! yeah.gif Большое спасибо, VAI

Сообщение отредактировал Daria - Oct 4 2008, 17:03
Go to the top of the page
 
+Quote Post

17 страниц V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
7 чел. читают эту тему (гостей: 7, скрытых пользователей: 0)
Пользователей: 0

 


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


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