Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 08.11.2013, 17:53   #1
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Привет всем!

Задача - раз в секунду принимать посылку из девяти байт, первые три из которых - 0xAA - служебные, определяющие начало сообщения, а остальные шесть - данные, которые раскладываются по трем массивам, состоящим в данном случае из двух элементов.

Проблема в том, что при приеме в каждой второй посылке оказывается не три байта 0xAA, а только два. Соответственно, происходит потеря каждой второй посылки. Для моего приложения это не критично, но разобраться, почему так происходит надо. Поставил проверку OERR, молчит, не срабатывает. Привожу код и скрин терминалов. Первый -входящие сообщения. Второй - принятые. Обрезаная посылка выделена красным.

Код:
void interrupt main_int (void){
    unsigned char temp;
    if (RCIF){ //пришел байт
        temp=RCREG; //прочитали в переменную
        if (OERR)
            TXREG=0xFF;
        switch (RXState){
            case 0: //определение начала сообщения по трем служебным байтам
                    //дожидаемся последовательности 0xAA 0xAA 0xAA, пропускаем
                    //всё остальное
                if (temp==0xAA) { //если на входе разделитель посылок 0xAA
                    if (count<3){ //и если разделителей меньше трех
                        TXREG=temp;
                        count++; // то увеличиваем счетчик разделителей
                    }
                }
                else {
                    count=0; //Если на входе не 0xAA, то обнуляем счетчик разделителей
                }
                if (count==3){ //Если приняли три служебных байта,
                    RXState++; //переходим к приему посылки
                    count=0;   //обнуляем счетчик разделителей
                }
                break;

            case 1: //раскладываем посылку в массивы по мере прихода новых байтов
                    
                if (RXCount1<maxsensor){
                    temperature[RXCount1]=temp;
                    TXREG=temperature[RXCount1];
                    RXCount1++;
                }
                else
                    if (RXCount2<maxsensor){
                        decimal[RXCount2]=temp;
                        TXREG=decimal[RXCount2];
                        RXCount2++;
                    }
                    else
                        if(RXCount3<maxsensor){
                            sign[RXCount3]=temp;
                            TXREG=sign[RXCount3];
                            RXCount3++;
                        }
                        else{
                            if (OERR)
                            TXREG=0xFA;
                            RXCount1=0;
                            RXCount2=0;
                            RXCount3=0;
                            RXState=0;

                        }
                break;
        } //switch конечный автомат
    }  //if RCIF
}   //void interrupt
Буду премного благодарен!

UPDATE. Проверил ручками из терминала, работает. Когда посылаю из другого МК - нет.
Миниатюры
Screenshot_1.png  

Последний раз редактировалось IvanPletnev; 08.11.2013 в 18:05.
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 18:21   #2
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Тээкс... добавил в конец посылки один лишний байт, посылка стала приходить полностью. Что бы это значило?
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 19:20   #3
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

UPDATE. Оказывается, руками тоже не работает. Байты посчитал, то же самое.
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 20:42   #4
korsaj
Senior Member
 
Регистрация: 15.02.2011
Адрес: Украина, Часов-Яр
Возраст: 35
Сообщений: 736
Вес репутации: 548/36
korsaj is a glorious beacon of lightkorsaj is a glorious beacon of lightkorsaj is a glorious beacon of lightkorsaj is a glorious beacon of lightkorsaj is a glorious beacon of lightkorsaj is a glorious beacon of light
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Со скоростью все норм?
korsaj вне форума   Ответить с цитированием
Старый 08.11.2013, 20:56   #5
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от korsaj Посмотреть сообщение
Со скоростью все норм?
Со скоростью всё норм, ищу баг в коде.
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 21:07   #6
BarsTmb
Senior Member
 
Аватар для BarsTmb
 
Регистрация: 30.03.2011
Адрес: Тамбов
Возраст: 48
Сообщений: 328
Вес репутации: 1293/39
BarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud of
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Так здесь всё понятно. Небольшая ошибка в логике. Вам неплохо бы потренироваться "работать процессором", просматривая ход выполнения программы в уме.
Вот в Вашем случае:
Код:
                            if (OERR)
                            TXREG=0xFA;
                            RXCount1=0;
                            RXCount2=0;
                            RXCount3=0;
                            RXState=0;
когда выполнится? Правильный ответ - когда придёт первый AA очередного пакета (пакет соответственно сливается мимо) или "лишний байт"
__________________
Присмотрелись мы - и действительно!
BarsTmb вне форума   Ответить с цитированием
Старый 08.11.2013, 21:38   #7
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от BarsTmb Посмотреть сообщение
Так здесь всё понятно. Небольшая ошибка в логике. Вам неплохо бы потренироваться "работать процессором", просматривая ход выполнения программы в уме.
Вот в Вашем случае:
Код:
                            if (OERR)
                            TXREG=0xFA;
                            RXCount1=0;
                            RXCount2=0;
                            RXCount3=0;
                            RXState=0;
когда выполнится? Правильный ответ - когда придёт первый AA очередного пакета (пакет соответственно сливается мимо) или "лишний байт"
Да, только собрался написать, что отловил при помощи брейкпойнта. )) Естественно, что один байт теряется при очередной обработке прерывания ) Спасибо!!!
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 21:58   #8
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от BarsTmb Посмотреть сообщение
Так здесь всё понятно. Небольшая ошибка в логике. Вам неплохо бы потренироваться "работать процессором", просматривая ход выполнения программы в уме.
Вот в Вашем случае:
Код:
                            if (OERR)
                            TXREG=0xFA;
                            RXCount1=0;
                            RXCount2=0;
                            RXCount3=0;
                            RXState=0;
когда выполнится? Правильный ответ - когда придёт первый AA очередного пакета (пакет соответственно сливается мимо) или "лишний байт"

Как только теперь избавиться от этой ветки else?
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 22:17   #9
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Ну, обходными путями сделал. Не очень изящно, но работает.
Код:
                        if(RXCount3<maxsensor-1){
                            sign[RXCount3]=temp;
                            TXREG=sign[RXCount3];
                            RXCount3++;
                        }
                        else{
                            sign[RXCount3+1]=temp;
                            TXREG=sign[RXCount3+1];
                            RXCount1=0;
                            RXCount2=0;
                            RXCount3=0;
                            RXState=0;
Может, кто-нибудь еще посоветует решение?
IvanPletnev вне форума   Ответить с цитированием
Старый 08.11.2013, 22:49   #10
BarsTmb
Senior Member
 
Аватар для BarsTmb
 
Регистрация: 30.03.2011
Адрес: Тамбов
Возраст: 48
Сообщений: 328
Вес репутации: 1293/39
BarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud ofBarsTmb has much to be proud of
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Сокращаем количество строк и размер кода в прерывании:
Код:
 
                if (RXCount1 < maxsensor)
                    TXREG = temperature[RXCount1++] = temp;,
                else
                    if (RXCount2 < maxsensor)
                        TXREG = decimal[RXCount2++] = temp;
                    else
                        if(RXCount3 < maxsensor) {
                            TXREG = sign[RXCount3++] = temp;
                            if (RXCount3 == maxsensor) 
                              RXCount1 = RXCount2 = RXCount3 = RXState=0;
                        }
__________________
Присмотрелись мы - и действительно!
BarsTmb вне форума   Ответить с цитированием
Старый 09.11.2013, 00:31   #11
Marat
Senior Member
 
Аватар для Marat
 
Регистрация: 27.03.2007
Адрес: Минск
Сообщений: 795
Вес репутации: 805/53
Marat is a splendid one to beholdMarat is a splendid one to beholdMarat is a splendid one to beholdMarat is a splendid one to beholdMarat is a splendid one to beholdMarat is a splendid one to beholdMarat is a splendid one to behold
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Часто бывает ошибка, что последний байт в посылке не успевает передаться полностью - программа написана так, что выключает передатчик не убедившись в том, что все данные из буфера уже переданы.Соответственно, возможны косяки с началом следующей посылки, потому что приёмник ждёт ......ждёт....
__________________
RTFM.....и будет вам счастье
Marat вне форума   Ответить с цитированием
Старый 09.11.2013, 07:59   #12
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от BarsTmb Посмотреть сообщение
Сокращаем количество строк и размер кода в прерывании:
Код:
 
                if (RXCount1 < maxsensor)
                    TXREG = temperature[RXCount1++] = temp;,
                else
                    if (RXCount2 < maxsensor)
                        TXREG = decimal[RXCount2++] = temp;
                    else
                        if(RXCount3 < maxsensor) {
                            TXREG = sign[RXCount3++] = temp;
                            if (RXCount3 == maxsensor) 
                              RXCount1 = RXCount2 = RXCount3 = RXState=0;
                        }
Согласен абсолютно. Действительно, размер хекса уменьшился на 1%. Спасибо!
Было 157 слов, стало 139.
IvanPletnev вне форума   Ответить с цитированием
Старый 09.11.2013, 08:01   #13
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от Marat Посмотреть сообщение
Часто бывает ошибка, что последний байт в посылке не успевает передаться полностью - программа написана так, что выключает передатчик не убедившись в том, что все данные из буфера уже переданы.Соответственно, возможны косяки с началом следующей посылки, потому что приёмник ждёт ......ждёт....
То есть, стоит проверять бит TRMT перед выключением передатчика на всякий случай?
IvanPletnev вне форума   Ответить с цитированием
Старый 09.11.2013, 08:10   #14
Consultant
Senior Member
 
Аватар для Consultant
 
Регистрация: 08.11.2013
Адрес: San Jose
Возраст: 65
Сообщений: 326
Вес репутации: 796/24
Consultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to behold
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от Marat Посмотреть сообщение
Часто бывает ошибка, что последний байт в посылке не успевает передаться полностью - программа написана так, что выключает передатчик не убедившись в том, что все данные из буфера уже переданы.Соответственно, возможны косяки с началом следующей посылки, потому что приёмник ждёт ......ждёт....
Это бывает у того, кто программу не отладил. И приемник ничего не ждет, то есть не находится в ожидании байта или символа завершения. Что пришло, то и обрабатывает.
Consultant вне форума   Ответить с цитированием
Старый 09.11.2013, 09:02   #15
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 36
Сообщений: 1,385
Вес репутации: 1267/63
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от IvanPletnev Посмотреть сообщение
Согласен абсолютно. Действительно, размер хекса уменьшился на 1%. Спасибо!
Было 157 слов, стало 139.
А зачем вы так делаете вообще? по коду не понятно maxsensor это переменная или константа. Я бы лично сделал это элементарно. Объявил структуру тиипа такой
Код:
typedef struct{
 unsigned short temperature;
 unsigned short decimal;
 unsigned short sign;
} T_MYPKT;
Объявил бы массив на 9 элементов
Код:
unsigned char MYARR[9];
и работал бы с массивом.
на массив бы натравил указатель структуры
Код:
T_MYPKT * ptr;
// первые 3 байта - признак 0xAA 0xAA 0xAA
ptr=(T_MYPKT *)&MYARR[3];
и все в прерываниях с пакетом работаем, как с обычным массивом, если нужно поработать со значениями, то через указатель
Код:
ptr->temperature=25;
Ведь вся прелесть Си именно указатели. Если их не использовать, то все приемущество Си исчезает.

А алгортим вообще очень интересный. Первый раз вижу, чтобы синхронизация передачи была не по флагу TXIF, а по флагу приема.
__________________
Лучше день потерять, потом за час долететь!

Последний раз редактировалось 2AplusA; 09.11.2013 в 09:15.
2AplusA вне форума   Ответить с цитированием
Старый 09.11.2013, 09:14   #16
Consultant
Senior Member
 
Аватар для Consultant
 
Регистрация: 08.11.2013
Адрес: San Jose
Возраст: 65
Сообщений: 326
Вес репутации: 796/24
Consultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to behold
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
А зачем вы так делаете вообще?

Ведь вся прелесть Си именно указатели. Если их не использовать, то все приемущество Си исчезает.
PIC16F628 не особенно любит указатели и работу с ними, особенно на память программ.
Consultant вне форума   Ответить с цитированием
Старый 09.11.2013, 09:21   #17
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,255
Вес репутации: 4364/100
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от Consultant Посмотреть сообщение
PIC16F628 не особенно любит указатели и работу с ними, особенно на память программ.
Пока люди спорят про душу у человека, вот так вот запросто, одушевлен уже кремний. Чё дальше то будет?
ampersant вне форума   Ответить с цитированием
Старый 09.11.2013, 09:22   #18
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 47
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от Consultant Посмотреть сообщение
PIC16F628 не особенно любит указатели и работу с ними, особенно на память программ.
Именно 628-й? Я чего-то вообще про компилятор ничего не увидел.
SSH вне форума   Ответить с цитированием
Старый 09.11.2013, 09:23   #19
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 36
Сообщений: 1,385
Вес репутации: 1267/63
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от Consultant Посмотреть сообщение
PIC16F628 не особенно любит указатели и работу с ними, особенно на память программ.
Банки ОЗУ и FLASH - это конечно нечто, соглашусь. Особенно, если компилятор за этим не следит. Но все таки использовать 3 счетчика на прием 9-ти байт, да с размерами ОЗУ PIC16 - непозволительная роскошь.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 09.11.2013, 09:28   #20
Consultant
Senior Member
 
Аватар для Consultant
 
Регистрация: 08.11.2013
Адрес: San Jose
Возраст: 65
Сообщений: 326
Вес репутации: 796/24
Consultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to beholdConsultant is a splendid one to behold
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от SSH Посмотреть сообщение
Именно 628-й?
Вообще шестнадцатые, хотя про компилятор вы правы, вроде Hi-Tech может генерить код для указателей, но это всего лишь воркэраунд.

Последний раз редактировалось Consultant; 09.11.2013 в 09:35.
Consultant вне форума   Ответить с цитированием
Старый 09.11.2013, 09:33   #21
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 47
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
Банки ОЗУ и FLASH - это конечно нечто, соглашусь. Особенно, если компилятор за этим не следит. Но все таки использовать 3 счетчика на прием 9-ти байт, да с размерами ОЗУ PIC16 - непозволительная роскошь.
+100. Особенно в прерывании. Я-бы делал, в общем виде, как-то так:
Код:
unsigneds char ucIndex;
unsigned char ucBuf[9];
void main( void )
{
...
ucIndex = 0 ;
...
while(1)
{
...
if( ucIndex >= 9 )
{
..
ucIndex = 0 ;
..
}
...
}

}

void interrupt isr( void )
{
if( RCIF && RCIE )
{
if( ucIndex < 9 )
ucBuf[ ucIndex ++ ] = RCREG ;
}
}
Т.е. вся обработка принятого пакета делается в main-е. Обработчик прерывания рекомендуется делать как можно короче.

Последний раз редактировалось SSH; 09.11.2013 в 09:42.
SSH вне форума   Ответить с цитированием
Старый 09.11.2013, 09:51   #22
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
А зачем вы так делаете вообще? по коду не понятно maxsensor это переменная или константа. Я бы лично сделал это элементарно. Объявил структуру тиипа такой
Код:
typedef struct{
 unsigned short temperature;
 unsigned short decimal;
 unsigned short sign;
} T_MYPKT;
Объявил бы массив на 9 элементов
Код:
unsigned char MYARR[9];
и работал бы с массивом.
на массив бы натравил указатель структуры
Код:
T_MYPKT * ptr;
// первые 3 байта - признак 0xAA 0xAA 0xAA
ptr=(T_MYPKT *)&MYARR[3];
и все в прерываниях с пакетом работаем, как с обычным массивом, если нужно поработать со значениями, то через указатель
Код:
ptr->temperature=25;
Ведь вся прелесть Си именно указатели. Если их не использовать, то все приемущество Си исчезает.

А алгортим вообще очень интересный. Первый раз вижу, чтобы синхронизация передачи была не по флагу TXIF, а по флагу приема.
maxsensor это константа. Я сделал так, чтобы можно было масштабировать кол-во датчиков простым изменением константы. А передача в данном случае только для отладочных целей, чтобы видеть, что принимается. Из конечного кода я это уберу.
IvanPletnev вне форума   Ответить с цитированием
Старый 09.11.2013, 10:15   #23
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 36
Сообщений: 1,385
Вес репутации: 1267/63
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
Post Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от IvanPletnev Посмотреть сообщение
maxsensor это константа. Я сделал так, чтобы можно было масштабировать кол-во датчиков простым изменением константы/
Понял, теперь как у вас данные раположены. Т.е. массивы полей. Я неверно первый пост понял, почему то подумал, что у вас каждое поле 2-х байтовое.
Тогда можно сделать так, применительно к моим структурам предыдущего сообщения
Код:
typedef struct{
  unsigned char temperature[maxsensor];  
  unsigned char decimal[maxsensor];
  unsigned char sign[maxsensor];
} T_MYPKT;
//А массив так 
unsigned char MYARR[maxsensor*3];
Обращение в прерываниях организовать, как SSH написал, а в коде
Код:
ptr->temperature[0]=25;
Хотя возможно указатели тяжело на 16-ых пиках ворочать. Тут бы дизасм глянуть и такого подхода и в 3 счетчика.
Цитата:
Сообщение от IvanPletnev Посмотреть сообщение
А передача в данном случае только для отладочных целей, чтобы видеть, что принимается. Из конечного кода я это уберу.
Аа. Для отладки и так сойдет, работать будет правильно. Но в реально практике лучше все таки флаг проверять.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 09.11.2013, 10:20   #24
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 36
Сообщений: 1,385
Вес репутации: 1267/63
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от Consultant Посмотреть сообщение
Вообще шестнадцатые, хотя про компилятор вы правы, вроде Hi-Tech может генерить код для указателей, но это всего лишь воркэраунд.
ну для такой архиткетуры многое воркэраунд будет. Все таки уже древняя она. Хотя я впервые слышу, что есть Си компиляторы, не поддерживающие указатели. Это же часть языка. Все равно, что не поддерживать деление или умножение.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 09.11.2013, 12:24   #25
IvanPletnev
Senior Member
 
Регистрация: 24.10.2013
Возраст: 41
Сообщений: 122
Вес репутации: 116/16
IvanPletnev will become famous soon enoughIvanPletnev will become famous soon enough
По умолчанию Re: RX UART PIC16f628. Вопрос к гуру :) Пропуск посылок.

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
Понял, теперь как у вас данные раположены. Т.е. массивы полей. Я неверно первый пост понял, почему то подумал, что у вас каждое поле 2-х байтовое.
Тогда можно сделать так, применительно к моим структурам предыдущего сообщения
Код:
typedef struct{
  unsigned char temperature[maxsensor];  
  unsigned char decimal[maxsensor];
  unsigned char sign[maxsensor];
} T_MYPKT;
//А массив так 
unsigned char MYARR[maxsensor*3];
Обращение в прерываниях организовать, как SSH написал, а в коде
Код:
ptr->temperature[0]=25;
Хотя возможно указатели тяжело на 16-ых пиках ворочать. Тут бы дизасм глянуть и такого подхода и в 3 счетчика.

Аа. Для отладки и так сойдет, работать будет правильно. Но в реально практике лучше все таки флаг проверять.
Со структурами и указателями я пока на "вы", к сожалению.. Почитать надо что-нибудь..
IvanPletnev вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по UART PIC24F basvic Продукция MICROCHIP 14 19.10.2008 13:25


Часовой пояс GMT +3, время: 03:38.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot