Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
01.05.2008, 17:15
|
|
Прописка
Регистрация: 11.09.2007
Сообщений: 104
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Господа в чем ошибка
Работаю с СOM портом и не могу выловить ошибку в тексте программы. Отсылаю на ком порт с компа такую строку "V_56+" Получаю ответ
"Пришел символ V,3 Пришел символ _,4 Пришел символ 1,1 Пришел символ +,1 "
index равнялся трем потому что при прошивки на Компорт приходят какие то символы.
Код:
|
volatile char rx_buffer[64];
int t0;
volatile int rx_wr_index,index1,index2;
volatile char n[1]; //2я перемнная
volatile unsigned int flag1=0;
volatile unsigned int flag2=0;
volatile unsigned char tick,pwm0,pwm1,pwm2,pwm3;
// USART Прерывание когда пришел символ с компа
interrupt [USART_RXC] void usart_rx_isr(void)
{
char data;
#asm("cli");
data=UDR;
rx_wr_index++;
if (data!='+') {rx_buffer[rx_wr_index]=data; } else { rx_wr_index=rx_wr_index--; flag2=1; index2=rx_wr_index; };
if (data=='V'||data=='R'||data=='O'||data=='T'||data= ='M'||data=='U') {flag1=1; index1=rx_wr_index; };
printf(" Пришел символ %c,%d ",data,rx_wr_index);
#asm("sei");
}
....
//Главная процедура
void main(void)
{
int i,param;
char *per,*b;
....
#asm("sei")
while (1)
{
if (flag1==1&&flag2==1)
{
#asm("cli");
for(i = index1, n[0] = NULL; rx_buffer[i]; ++i) {
if (rx_buffer[i] == '_') {
n[0] = rx_buffer[i+1];
n[1]= rx_buffer[i+2];
break;
};
};
param=(int)n;
printf("Provertka %c,%d ",rx_buffer[index1], param);
switch (rx_buffer[index1]) {
// ШИМ V - вентилятор на выдув, R - раздув, O - Вентилятор на охлож. пельтье, P - регулировка мощьности Пельтье
case 'V' : /*pwm0=(param/100)*256; */ rx_wr_index=0; printf(" Успешно запущен ШИМ %c ",rx_buffer[index1]); flag1=0; flag2=0; #asm("sei"); break;
case 'R' : pwm1=(param/100)*256; rx_wr_index=0; #asm("sei"); break;
case 'O' : pwm2=(param/100)*256; rx_wr_index=0; #asm("sei"); break;
case 'P' : pwm3=(param/100)*256; rx_wr_index=0; #asm("sei"); break;
case 'T' : temp(); rx_wr_index=0; printf(" ТЕМПЕРАТУРА %i ",param); #asm("sei"); break; // получить показания 4х датчиков
case 'M' : polyar(param); rx_wr_index=0; #asm("sei"); break; // изменение полярности пельтье
case 'U' : TEM(param); rx_wr_index=0; #asm("sei"); break; // включение выключение ТЭМ
default : printf (" Фигня пришла "); rx_wr_index=0; flag1=0; flag2=0; #asm("sei"); break;
};
} ;
//#asm("sei");
} ;
} |
|
|
|
|
02.05.2008, 08:05
|
|
Прописка
Регистрация: 11.09.2007
Сообщений: 104
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ну что все уже С забыли что ли?
|
|
|
|
02.05.2008, 10:03
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Для начала - уберите printf из прерывания, моветон.Эти манипуляции в прерывании с флагом - ни вреда, ни пользы.
|
|
|
|
03.05.2008, 19:26
|
|
Прописка
Регистрация: 11.09.2007
Сообщений: 104
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от urry1
|
Для начала - уберите printf из прерывания, моветон.Эти манипуляции в прерывании с флагом - ни вреда, ни пользы.
|
эТо чтоб искать Ошибки при получение символов. Flag1 и 2 сигнализирует что в буфере есть команда и надо её выполнять .
if (flag1==1&&flag2==1) - после получение строки и выставление флагов . Должен выполнятся условный оператор. А он не выполняется
|
|
|
|
04.05.2008, 14:38
|
|
Прописка
Регистрация: 11.09.2007
Сообщений: 104
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ребят помогите . Уже 4 дня не могу нормально прогу сделать .
|
|
|
|
04.05.2008, 15:20
|
|
Прописка
Регистрация: 23.03.2008
Сообщений: 121
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Надеюсь, скорости, формат кадра настроены правильно и частота кварца соответствует установкам проекта? Именно так, или вроде как должно быть так???? По своему опыту скажу, что с кодевиженом и уартом проблем не было - была один раз, пришлось убрать прерывание по окончанию передачи. И все. Терминалка может глючная? Кабель нормальный? И поубирай из прерываний весь лишний код. Оставь тока тот, что генерится кодевиженом. Остальное анализируй в основном цикле программы
|
|
|
|
04.05.2008, 15:21
|
|
Прописка
Регистрация: 23.03.2008
Сообщений: 121
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
в догонку - попробуй просто сделать эхо, мож символы на физическом уровне бьются
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:34.
|
|