-
Постов
316 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Сообщения, опубликованные mappy89
-
-
Доброго времени суток, не могу решить простую проблему - передать несколько переменных одновременно через UART на мк. Данные на контроллер приходят в виде [aaa]<bbb>(ccc), где aaa bbb ccc - значения переменных, а различные скобки - их идентификаторы.
обработчик этих переменных следующий (контроллер -мега16)
struct us { int freaqready; ..флаги готовности приёма переменных int duratready; int delayready; int chcounter; //счётчик символов } us us1; volatile char sym[2]; volatile text1[20], text2[20], text3[20]; while(1) { sym[0]=USART_GetChar(); //принимаем символ sym[1]=0; if (sym[0]) { switch (sym[0]) { case '[': us1.freaqready=1; break; case '(': us1.duratready=1; break; case '<': us1.delayready=1; break; case ']': //по окончанию приёма 1 переменной timerValue=atoi(text); us1.freaqready=0; us1.chcounter=0; USART_FlushRxBuf(); break; case ')': //по окончанию приёма 2 переменной widthValue=atoi(text2); us1.duratready=0; us1.chcounter=0; USART_FlushRxBuf(); break; case '>': //по окончанию приёма 3 переменной tempdelay=atoi(text3); us1.delayready=0; us1.chcounter=0; USART_FlushRxBuf(); break; default: if (us1.freaqready) text1[us1.chcounter++]=sym[0]; else if (us1.duratready) text2[us1.chcounter++]=sym[0]; else if (us1.delayready) text3[us1.chcounter++]=sym[0]; break; }
Однако контроллер стабильно принимает только 1 переменную, остальные он игнорирует. В чём может быть проблема?
0 -
Проблема в том, что само разрабатываемое устройство - коммутатор, т е реле будут постоянно коммутировать (например если будет задано время проверки реле - час, соответственно коммутаций будет over 9000) и время срабатывания каждого реле должно укладываться в определённые жесткие временные рамки, если не уложится - значит реле бракованное, соотвественно и нужно минимизировать потери времени на регистрах
0 -
Доброго времени суток.
Имеется задача - регистрировать срабатывания 50 электромагнитных реле. Регистрация осущ-ся следующим образом: на обмотки всех реле реле подается напряжение, и у всех реле через какие то доли секунды замыкаются нормально разомкнутые контакты. От такого контакта каждого реле импульсы идут на параллельные регистры (SN74HC165 в моем случае), а уже с эти регистров импульсы идут на контроллер mega16, который эти регистры тактирует. Соответственно за каждый такт контроллера приходит (или не приходит) импульс с регистра и контроллер регистрирует время и номер сработавшего реле.
Проблема как раз во времени тактирования параллельных регистров - даже если все реле сработают одновременно, тратится ещё какое то время на то, чтобы контроллер оттактировал параллельный регистр и уже после этого зарегистрировал время срабатывания, т.е. к самому искомому времени срабатывания реле прибавляется еще и время тактирования. Напрямую отнимать время = кол-во тактов x время такта я не могу, так как реле срабатывают с разным разбросом времени (несколько мсек/мксек, т.е. соразмерно с временем тактирования). Какие могут быть способы точно узнать время срабатывания множества реле без погрешности на тактирование дополнительных элементов? .
0 -
Доброго времени суток. Никак не могу понять, как настроить 8-битный таймер на прерывание раз в 1 мсек. Контроллер - мега16, внешний кварц 8 МГц.
Раз таймер 8-битный, значит счётчик считает макс до 256. Используя предделитель 256 получаю частоту: 8000000/256 = 31250Гц, значит время одного тика - 1/31250 = 32 мкс.
Для получения прерывания раз в мсек: 1/0.032 = 31,25 тика, т.е. нецелое число. При использовании других предделителей кол-во тиков переваливает за 256, т.е. нужно каким то образом корректировать счётчик, чтобы не допускать погрешности в долгосрочной перспективе. Каким образом нужно это сделать, либо как нужно грамотно настроить таймер?
0 -
Проблема решилась благодаря "склейке" символа, обзначающего номер элемента и времени срабатывания реле, используя функцию strcat:
main() { volatile int optime=0; //время срабатывания volatile char mass[10]; //для хранения optime в char volatile char buf[32]; //для хранения склеенных строк memset(buf,0,sizeof(buf)); //на всякий случай очищаем буфер DDRB|=(0<<0)|(0<<1)|(0<<2)|(0<<3); //пины, ловящие импульс от реле while(1) { for (int ii=0; ii<4;ii++) { if (PINB & (1<<(ii+4)) //если реле сработало то US_cl(); USART_FlushTxBuf(); //очищаем передающий буфер itoa(mass, optime,10); //перевод optime в char switch (ii) { case 0: strcat(buf,"a"); break; //1 реле case 1: strcat(buf,"b"); break; //2 реле и т д case 2: strcat(buf,"c"); break; case 3: strcat(buf,"d"); break; } strcat(buf,optime); //склеиваем символ-номер реле и время срабатывания USART_SendStr(buf); memset(buf,0,sizeof(buf)); //очищаем буфер } } }
Выложил полностью работающий код, без потерь отправляющие данные, авось кому пригодится =)
0 -
А поподробнее можно? )
0 -
Возможна ситуация, когда испытуемые реле бракованные, т.е. не сработают, таким образом строка вообще не сформируется
0 -
Доброго времени суток, проблема следующая: имеются 4 реле времени, которые срабатывают практически одновременно, посылая импульсы на ноги контроллера, после попадания на него импульсов он формирует строку типа "a1256", где a - 1-й номер сработавшего реле, 1256 - 1,256 сек - время срабатывания. Если представить ситуацию, что все 4 реле времени сработали одновременно (т. е. самая распространённая ситуация), то вместо строки "aXXXXbXXXXcXXXXdXXXX" (где xxxx-времена срабатывания) по ком порту отправляется строка "abcdXXXX", т.е. передаётся только последнее время срабатывания реле
main() { volatile int optime=0; //время срабатывания volatile char mass[10]; //для хранения optime в char DDRB|=(0<<0)|(0<<1)|(0<<2)|(0<<3); //пины, ловящие импульс от реле while(1) { for (int ii=0; ii<4;ii++) { if (PINB & (1<<(ii+4)) //если реле сработало то US_cl(); USART_FlushTxBuf(); //очищаем передающий буфер itoa(mass, optime,10); //перевод optime в char switch (ii) { case 0: USART_SendStr("a"); break; //1 реле case 1: USART_SendStr("b");break; //2 реле и т д case 2: lUSART_SendStr("c"); break; case 3: USART_SendStr("d"); break; } USART_SendStr(optime); } } }
Код библиотеки usart прикрепил в файле.
0 -
В общем решение следующее: нужно зайти в свойства проекта -> toolchain -> Libraries и добавить в список библиотек линковки libprintf_flt.a
а в папке general (linker'a) поставить галочку use vprintf library
0 -
hd44780, это урезанный кусок из моего проекта, дабл там стоит, потому что нужен )
а что плохого в том, что в прерывании осуществляется вывод на жк? работао всегда без проблем
пысы: проблему обошёл обходным путём, всем спасибо )
0 -
Есть микруха ft232rl и контроллер, фт232 запитывается от usb (т.е. земля и +5V от юсб), у контроллера свой источник питания (соответственно свои +5V и земля). Вопрос в том, нужно ли 2 эти земли объединять или нет?
0 -
Спасибо, надеюсь и с sprtintf тоже разберусь )
0 -
у меня вместо числа с точкой выводится "?", что в протеусе, что в железе
0 -
Собственно сабж, в 4 версии необходимо было добавить "printf_flt" и "m" в Libraries, и "-Wl,-u,vfprintf" в Options, однако подобных настроек в 6 версии не нашёл, подскажите, как заставить работать эту функцию )
0 -
Собственно сабж, в этом векторе предполагается вставить обнуление переменных, заранее спасибо )
0 -
В общем проблема, как оказалось, вообще не в этом. При срабатывании прерывания INT5 контроллер начинает почему-то греться, даже если убрать оттуда любой код. Кто нибудь с этим сталкивался?
0 -
Доброго времени суток, ситуация следующая : имеется контроллер mega64, дисплей, клавиатура (12 кн) и кнопка: с клавы вводим число с отображением на дисплее, по нажатию на кнопке срабатывает прерывание и дальше что то делаем с числом. Проблема в том, что значение переменной с вводимым числом не передаётся в обработчик прерывания, вот код:
volatile double cislo=0; //само число volatile double temp=0; volatile unsigned char dd1[7]; //для хранения символа с клавы void vvod(); //функция ввода данных с клавы main() { lcd_init(); //инициализируем дисплей и клаву keyb_init(); EIMSK|=(1<<INT5); //иниц прерывания EICRA|= (1<<ISC01)|(1<<ISC00); while(1) { KEYB_ScanKeyboard(); vvod(); } } void vvod() { dd1[0]=KEYB_GetKey(); lcd_puts(&dd1[0]); //вывод на дисплей temp=(double)dd1[0]; //преобраз unsigned char в double cislo=cislo*10+temp; } SIGNAL(SIG_INTERRUPT5) { if (cislo) lcdputs("OK!"); else lcdputs("Fail"); }
Значение при вводе числа каким то образом теряется, в чём тут может быть косяк?
0 -
вообще говоря волнует, схема идет как часть измерительного прибора, метрологи не очень радуются искажениям источника+ цифровой амперметр начинает врать, похоже именно из за этого искажения, так как на резисторе он показывает верно.
Если Вы говорите при индуктивной нагрузке так и будет, можно ли как то нейтрализовать это? и еще такой вопрос, индуктивная нагрузка влияет на трансформатор так? если да, то на чем еще можно построить усилитель?
0 -
Нужен источник для питания обмотки реле переменного тока, источник 400гц, регулируемый до 120-130 В, доступно силовые 220 для питания
реле похоже на вот это: http://relays.ru/fil...log/rpk101u.pdf
на мосте Винна реализована генерация 400гц, после него идет на пару транзисторов, 825-827, затем через трансформатор на обмотку реле. сигнал на обмотке искажается, появляется площадка итд, как выше описывал, при подключении просто активной нагрузки такого не происходит
0 -
Перед входом второй обмотки трансформатора стоят комплементарные транзисторы 827а и 825г, то есть по мощности должно хватать? или я чего не понимаю? ток они дают большой. пробовал с сигналом частотой 50гц, то же самое.
диодный мост и конденсатор, паралельно выходу? какие подобрать? выходное напряжение в районе 130в
0 -
Дело в том, что в само э\м реле, я влезать не могу, это заводское изделие, то есть менять параметры нагрузки(мост, конденсатор итд) не получится, трансформатор в чем может быть не подходящий?
0 -
В схеме я уже использую трансформатор ТН60-127/220-50. При подключении синусоидаьного сигнала на вторичную обмтку на первичной достигается искомое усиление, но при подключении ИНДУКТИВНОЙ нагрузки (катушка э/м реле сопротивлением 6 кОм через диодный мост) проседает синусоида при переходе через ноль, появляются нежелательные искажения сигнала, нулевая площадка длительностью примерно 100-200мкс, как с этим бороться?
0 -
Имеется сигнал переменного напряжения величной 8-10 В, 400 Гц, его нужно усилить до 120-130 В, также 400 Гц. К усилителю будет подключена индуктивная нагрузка.
Помогите с выбором схемы либо уже с готовыми решениями, заранее спасибо!
0 -
hd44780, компараторы включаются поочереди сигналом сдвигового регистра, т.к. выходы всех компараторов объединены и подаются на ногу контроллера, получается тактируя регистр он включает определённый компаратор, и сигнал на выход (0 или 1) идёт на контроллер, т . зная номер счёта мы знаем с какого компаратора (а т.е и реле) идёт сигнал
Но от такой схемы я уже отказался, слишком муторная, смотрю в сторону регистра с параллельным входом и последовательным выводом, всем спасибо!
0
Передача Нескольких Переменных Через Uart
в AVR
Опубликовано
Идентификаторы нужны, так как переменные могут приходить в разной последовательности.
BerZerKku, обработчик приёма переменных я вставил выше в надежде, что кто то укажет на ошибку/недоработку, там вроде всё четко, однако код не рабочий =)