05.07.2011, 18:13
|
|
Временная регистрация
Регистрация: 22.07.2006
Сообщений: 54
Сказал спасибо: 7
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Здравствуйте,
делаю конвертер на PIC16F887. Он опрашивает несколько слейвов по RS485, которые висят на программном USARTе и посылает инфу на комп, который подключен через аппаратный USART. Мастер складывает ответы от слейвов в буфер в EXT_ISR(), потом обрабатывает.
Но иногда комп тоже может спросить. Его опрос принимает INT_RDA(). Так вот примерно 10% этих запросов теряются, потому как аппаратный УСАРТ подвисает. Видимо это происходит когда прерывания встречаются. Подскажите, как это можно обойти.
Спасибо
Код:
|
#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B0,bi ts=8,stream=RS485)
#use rs232(baud=38400,UART1,parity=N,bits=8,stream=PC,E RRORS)
#INT_RDA //PC
void serial_isr()
{
buffer_pc[next_in_PC]=fgetc(PC);
if(++next_in_PC == BUFFER_SIZE_PC) next_in_PC = 0;
}
#int_EXT //RS485
void EXT_isr(void)
{
if(kbhit(RS485))
{
buffer_RS485[next_in_RS485++] = (fgetc(RS485));
}
if(next_in_RS485 == BUFFER_SIZE_RS485)next_in_RS485 = 0;
} |
|
|
|
|
06.07.2011, 10:15
|
|
Временная регистрация
Регистрация: 22.07.2006
Сообщений: 54
Сказал спасибо: 7
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Попробовал выставить приоритет:
не помогло.
Никто не сталкивался с такой проблемой?
|
|
|
|
11.07.2011, 20:25
|
|
Прописка
Регистрация: 21.03.2011
Сообщений: 107
Сказал спасибо: 15
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Можно ли я влезу со своим вопросом по СИ для МК:
У меня замешательство по примеру из книги "Применение микроконтроллеров PIC18" Барри Брей. Компилер тут С18.
Но вопрос тут скорее о СИ нежели об архитектуре и конкректном компиллере:
Есть пример считывания температуры с цифрового дачтика LM70.
В данной случае после каждого sendClock на SIO последовательно появляются все 16 битов данных, содержащих температуру. Ну а само значение получается в temp.
И так:
define SIO PORTBbits.RB1
....
for (a=0; a‹16; a++) //получение 16 битов
{
temp‹‹=1;
temp!=SIO››1; // ИЛИ же: temp|=SIO››1;
sendClock();
}
Вопрос 1:
Как это "SIO››1", если SIO - вход порта,бит? Я понимаю, что переменная по факту байтом будет. Но она будет иметь значения 0 или 1. Менятся будет самый младший байт, куда его еще вправо двигать то???!!!!
Да и вообще в целом понять выражение не могу...
Вопрос 2:
Кажется мне, что там опечатка и не "!=", а "|="
ну вроде: temp|=SIO››1; или temp=temp|SIO››1;
По приоритету вначале будет свдиг, а затем ИЛИ.
Но зачем тут сдвиг, да еще вправо???!!
Я бы сделал так:
{
temp‹‹=1;
temp|=SIO; или temp+=SIO;
sendClock();
}
Ну кто прав?....
|
|
|
|
12.07.2011, 01:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Пальцем в небо
__________________
Глаза боятся,а руки делают.
|
|
|
Сказали "Спасибо" CERGEI1982
|
|
|
12.07.2011, 10:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Цитата:
|
Но зачем тут сдвиг, да еще вправо???!!
|
Из-за того, что SIO - не самый младший бит. Поэтому его и сдвигают вправо.
Я бы сделал так:
Код:
|
{
temp‹‹=1;
if (SIO) (temp|=1);
sendClock();
} |
при этом код будет работать при любом положении бита SIO на выводах порта
__________________
misterdi<@>i.ua
Последний раз редактировалось MisterDi; 12.07.2011 в 10:12.
|
|
|
|
12.07.2011, 11:43
|
|
Прописка
Регистрация: 21.03.2011
Сообщений: 107
Сказал спасибо: 15
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от MisterDi
|
Из-за того, что SIO - не самый младший бит. Поэтому его и сдвигают вправо.
Я бы сделал так:
Код:
|
{
temp‹‹=1;
if (SIO) (temp|=1);
sendClock();
} |
при этом код будет работать при любом положении бита SIO на выводах порта
|
Спасибо.
Тогда вопрос по доступе к портам:
Если RB1=1, то значение PORTBbits.RB1 будет не 1, а 2 (0b10)?????
И различие между переменной PORTBbits.RB1 и PORB только в том, что ,может, PORTBbits.RB1=PORB&0b00000010 ? Так?
Я думал, что если RB1=1, то значение PORTBbits.RB1=1. Т.е. вроде как PORTBbits.RB1=PORB&0b00000010››1.
Нет?
|
|
|
|
12.07.2011, 12:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Цитата:
|
Я думал, что если RB1=1, то значение PORTBbits.RB1=1. Т.е. вроде как PORTBbits.RB1=PORB&0b00000010››1.
|
Для работы с битами в CCS есть специальные функции, которые компилируются очень компактно. ИМХО лучше смотреть в их сторону. Правда тогда теряется совместимость с другими компиляторами
__________________
misterdi<@>i.ua
|
|
|
|
12.07.2011, 13:23
|
|
Прописка
Регистрация: 21.03.2011
Сообщений: 107
Сказал спасибо: 15
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Я в свое время ушел с CCS на С18. Потому ниче сказать не могу... А все-таки верны ли мои суждения по работе с портом?
Можно воспринять как есть, а я хочу и причину понять
|
|
|
|
14.07.2011, 14:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Цитата:
|
А все-таки верны ли мои суждения по работе с портом?
|
Не знаю, нужно смотреть реализацию в откомпилированном коде.
__________________
misterdi<@>i.ua
|
|
|
|
14.07.2011, 16:57
|
|
Прописка
Регистрация: 21.03.2011
Сообщений: 107
Сказал спасибо: 15
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Компилер все красиво собрал, пример:
temp=PORTDbits.RD2;
13EA 5083 MOVF 0xf83, W, ACCESS
13EC 0B04 ANDLW 0x4 //выделяем 2ой бит
13EE E001 BZ 0x13f2
13F0 0E01 MOVLW 0x1 // если он 1, то в аккум 1
13F2 0100 MOVLB 0 // если 0, то 0 и запись в переменную
13F4 6FA6 MOVWF 0xa6, BANKED // запись в переменную
Так что пример в книге с ашипкой. И доп. сдвиг вправо ни к чему хорошему, окромя бреду не преведет.
Рассуждения по работе с портом - верны.
Последний раз редактировалось pasipaka; 14.07.2011 в 17:01.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:25.
|
|